Flutter
Reading time: 3 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Flutter
Flutter — це кросплатформений UI набір інструментів від Google, який дозволяє розробникам писати єдину кодову базу на Dart, яку Engine (рідний C/C++) перетворює на машинний код, специфічний для платформ Android та iOS. Engine об'єднує Dart VM, BoringSSL, Skia тощо, і постачається як спільна бібліотека libflutter.so (Android) або Flutter.framework (iOS). Вся фактична мережна діяльність (DNS, сокети, TLS) відбувається всередині цієї бібліотеки, а не в звичних шарах Java/Kotlin Swift/Obj-C. Це ізольоване проектування є причиною, чому звичайні Java-рівневі Frida хуки не працюють на Flutter додатках.
Перехоплення HTTPS трафіку в Flutter
Це резюме цього блог посту.
Чому перехоплення HTTPS є складним у Flutter
- Перевірка SSL/TLS знаходиться на два шари нижче в BoringSSL, тому обхід Java SSL-пінінгу її не торкається.
- BoringSSL використовує свій власний CA магазин всередині libflutter.so; імпорт вашого Burp/ZAP CA в системний магазин Android нічого не змінює.
- Символи в libflutter.so виключені та спотворені, приховуючи функцію перевірки сертифікатів від динамічних інструментів.
Визначте точний стек Flutter
Знання версії дозволяє вам відновити або зіставити правильні бінарники.
Крок | Команда / Файл | Результат |
---|---|---|
Отримати хеш знімка | bash\npython3 get_snapshot_hash.py libapp.so\n | adb4292f3ec25… |
Сопоставити хеш → Engine | enginehash список в reFlutter | Flutter 3 · 7 · 12 + коміт двигуна 1a65d409… |
Витягти залежні коміти | DEPS файл у цьому коміті двигуна | • dart_revision → Dart v2 · 19 · 6• dart_boringssl_rev → BoringSSL 87f316d7… |
Знайдіть get_snapshot_hash.py тут.
Ціль: ssl_crypto_x509_session_verify_cert_chain()
- Розташована в
ssl_x509.cc
всередині BoringSSL. - Повертає
bool
– однеtrue
достатньо, щоб обійти всю перевірку ланцюга сертифікатів. - Така ж функція існує на кожній архітектурі ЦП; лише опкоди відрізняються.
Варіант A – Бінарне патчування з reFlutter
- Клонувати точні джерела Engine та Dart для версії Flutter додатку.
- Regex-патч двох гарячих точок:
- У
ssl_x509.cc
, примуситиreturn 1;
- (Необов'язково) У
socket_android.cc
, жорстко закодувати проксі ("10.0.2.2:8080"
).
- Перекомпілювати libflutter.so, повернути його назад в APK/IPA, підписати, встановити.
- Попередньо патчовані збірки для загальних версій постачаються в релізах reFlutter на GitHub, щоб заощадити години часу на збірку.
Варіант B – Живе підключення з Frida (шлях "хард-кор")
Оскільки символ виключений, ви скануєте завантажений модуль на предмет його перших байтів, а потім змінюєте значення повернення на льоту.
// attach & locate libflutter.so
var flutter = Process.getModuleByName("libflutter.so");
// x86-64 pattern of the first 16 bytes of ssl_crypto_x509_session_verify_cert_chain
var sig = "55 41 57 41 56 41 55 41 54 53 48 83 EC 38 C6 02";
Memory.scan(flutter.base, flutter.size, sig, {
onMatch: function (addr) {
console.log("[+] found verifier at " + addr);
Interceptor.attach(addr, {
onLeave: function (retval) { retval.replace(0x1); } // always 'true'
});
},
onComplete: function () { console.log("scan done"); }
});
Виконайте це:
frida -U -f com.example.app -l bypass.js
Поради щодо портирования
- Для arm64-v8a або armv7, візьміть перші ~32 байти функції з Ghidra, перетворіть у рядок шістнадцяткових значень, розділених пробілами, і замініть
sig
. - Зберігайте один шаблон на кожен реліз Flutter, зберігайте їх у шпаргалці для швидкого повторного використання.
Примус трафіку через ваш проксі
Flutter сам по собі ігнорує налаштування проксі пристрою. Найпростіші варіанти:
- Емулятор Android Studio: Налаштування ▶ Проксі → вручну.
- Фізичний пристрій: злий Wi-Fi AP + спуфінг DNS, або редагування модуля Magisk
/etc/hosts
.