سلام، من مجید هستم و توی این پست میخوام در مورد یکی از چالش هایی بنویسم که هنگام تست نفوذ یک برنامه اندرویدی که با Flutter نوشته شده بود، به اون برخوردم.
من برای تست نفوذ از متودولوژی OWASP MASVS استفاده میکنم و داستان از این قراره که یکی از کارهایی که هنگام تست داینامیک باید انجام بدین، بررسی ترافیک های بین برنامه و سرور هست. معمولا برنامه های اندرویدی از پروتکل های HTTP و یا WebSocket برای این منظور استفاده میکنن و وظیفه ما هم بررسی ارتباط با Endpoint هاست.
برای این کار من از ابزارهای زیر استفاده میکنم:
Genymotion: شبیه ساز سیستم عامل اندروید
Burp Suite: ابزار پروکسی و بررسی ترافیک
برای نصب Genymotion از این لینک دانلود و نصب کنید و برای Burp Suite هم از این لینک. بعد از نصب کافیه یک مطابق شکل زیر یک سیستم عامل اندرویدی برای خودتون بسازید.
این نکته رو بگم که من برای روشی که میخوام در ادامه بگم از اندروید 9 استفاده کردم و روی ورژن 6 و 12 هم جواب نگرفتم.
سیستم عامل اندروید به طور پیشفرض Root شده است و بعد از اجرای اون نیازه که یه ARM-Translation رو روی شبیه ساز نصب کنید. برای ورژن های قبل از اندروید 9 از این لینک و برای ورژن های بعدی این لینک. خروجی این پروژه ها یک فایل zip هست که با درگ و دراپ روی شبیه ساز باید انتقال داده بشه و بعد از اون سیستم Flash شده و شما میتونید برنامه های ARM رو روی شبیه ساز نصب و استفاده کنید.
اگر توی حوزه وب فعالیت دارین، میدونید که برای اینکه ارتباط بین مرورگر و سرور رو بخوایید با Burp Suite بررسی کنید نیازه که Cert مربوط به Burp Suite رو توی مرورگر وارد کنید. توی اندروید هم باید همین کار رو انجام بدیم ولی یکم قضیه فرق داره. برنامه های اندرویدی برای ارتباطاتی که امن هست و از TLS استفاده میکنه یکی از سه حالت زیر رو دارن:
خوب توی این مرحله باید Cert ابزار Burp Suite رو به سیستم وارد کنیم. برای اینکار کلی مقاله وجود داره و من دیگه توضیحش نمیدم شما از طریق این مقاله برین جلو.
حالا باید برای سیستم اندرویدی پروکسی ست کنید که از ترافیک اون از سیستم اصلی شما و ابزار Burp Suite رد بشه. پس سرور میشه IP سیستم اصلی و Port میشه Port ی که ابزار Burp Suite روی اون گوش میده. برای این کار به مسیر زیر در اندروید برین:
Settings > Network & Internet > Wi-Fi > Advanced Options > Proxy > Manual
خوب حالا اگه برنامه شما به Cert های سیستم عامل اعتماد میکنه شما ترافیک HTTP یا WS رو توی Burp Suite میبینید اما اگه سازوکار Certificate Pinning داره شما باید زحمت bypass رو بکشین. برای اینکار میتونید از ابزار Frida استفاده کنید. این ابزار حین تست داینامیک شما میتونه فانکشن هایی از برنامه که مد نظر دارین رو Hook کنه و کار دلخواه شما رو جایگزینش کنه. این مقاله هم معرفی میکنم که بخونید و اگه به این مشکل رسیدین بدون باید چیکار کنید. نکته اینکه کلی اسکریپت برای Bypass بوسیله Frida وجود داره که میتونید ازش استفاده کنید.
اگه مراحل بالا رو برین جلو، حالا تسک شما میشه تست Endpoint ها و کشف آسیب پذیری.
توی تست ها برای اولین باری که به یک برنامه Flutter ای برخوردم دیدم با اینکه Certificate Pinning فعال نیست و ترافیک سایر برنامه ها از Burp Suite رد میشه اما باز ترافیک این برنامه به پروکسی من محل نمیزاره!
با سرچ فهمیدیم که طبق گفته ایشون، پیادهسازی فریمورک های مثل Flutter، Xamarin و Unity به این صورت هستش که خودشون مدیریت ارتباطات رو بر عهده دارن و به سیاست های سیستم (مثل قرار دادن پروکسی) محل نمیزارن :)
Third party app frameworks will have their own low-level implementation for TLS and HTTP and default pinning bypass scripts won’t work. If the app is written in Flutter, Xamarin or Unity, you’ll need to do some manual reverse engineering.
حالا باید چیکار کرد؟ برای اینکه از شر این وضع خلاص شد باید دو تا کار رو انجام داد:
1- سیستم عامل اندروید شما Root باشه که به طور پیشفرض توی Genymotion این کار اوکیه
2- برنامه ProxyDroid رو شبیه ساز نصب و فعال کنید (مطابق شکل زیر).
با این روش نیاز به ست کردن پروکسی در تنظیمان گوشی نیست و میتونید ترافیک این برنامه ها رو روی Burp Suite مشاهده کنید.
امیدورام این پست مفید بوده باشه براتون.
راه ارتباطی با من در توییتر.