Flutter
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 — це кросплатформовий UI toolkit від Google, який дозволяє розробникам писати єдину code-base на Dart, яку Engine (native C/C++) перетворює на машинний код, специфічний для платформи — Android та iOS. Engine містить Dart VM, BoringSSL, Skia тощо й постачається як розділена бібліотека libflutter.so (Android) або Flutter.framework (iOS). Усе реальне мережеве спілкування (DNS, sockets, TLS) відбувається всередині цієї бібліотеки, не у звичних Java/Kotlin Swift/Obj-C шарах. Така ізольована архітектура — причина, чому звичні Java‑рівневі Frida хуки не працюють у Flutter-додатках.
Intercepting HTTPS traffic in Flutter
Нижче — короткий виклад цього blog post.
Why HTTPS interception is tricky in Flutter
- SSL/TLS verification lives two layers down in BoringSSL, so Java SSL‐pinning bypasses don’t touch it.
- BoringSSL uses its own CA store inside libflutter.so; importing your Burp/ZAP CA into Android’s system store changes nothing.
- Symbols in libflutter.so are stripped & mangled, hiding the certificate-verification function from dynamic tools.
Fingerprint the exact Flutter stack
Знання версії дозволяє перебудувати або підібрати за шаблоном потрібні бінарні файли.
| Step | Command / File | Outcome |
|---|---|---|
| Get snapshot hash | python3 get_snapshot_hash.py libapp.so | adb4292f3ec25… |
| Map hash → Engine | enginehash list in reFlutter | Flutter 3 · 7 · 12 + engine commit 1a65d409… |
| Pull dependent commits | DEPS file in that engine commit | • dart_revision → Dart v2 · 19 · 6• dart_boringssl_rev → BoringSSL 87f316d7… |
Find get_snapshot_hash.py here.
Target: ssl_crypto_x509_session_verify_cert_chain()
- Located in
ssl_x509.ccinside BoringSSL. - Returns
bool– a singletrueis enough to bypass the whole certificate chain check. - Same function exists on every CPU arch; only the opcodes differ.
Option A – Binary patching with reFlutter
- Clone the exact Engine & Dart sources for the app’s Flutter version.
- Regex-patch two hotspots:
- In
ssl_x509.cc, forcereturn 1; - (Optional) In
socket_android.cc, hard-code a proxy ("10.0.2.2:8080").
- Re-compile libflutter.so, drop it back into the APK/IPA, sign, install.
- Pre-patched builds for common versions are shipped in the reFlutter GitHub releases to save hours of build time.
### Option B – Live hooking with Frida (the “hard-core” path) Because the symbol is stripped, you pattern-scan the loaded module for its first bytes, then change the return value on the fly.
// 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"); }
});
Мені потрібен вміст файлу src/mobile-pentesting/android-app-pentesting/flutter.md. Будь ласка, вставте його — я перекладу, зберігаючи синтаксис Markdown/HTML та незмінними елементи (код, шляхи, теги, посилання та технічні терміни).
frida -U -f com.example.app -l bypass.js
Поради з портування
- Для arm64-v8a або armv7, зніміть перші ~32 байти функції з Ghidra, перетворіть у рядок шістнадцяткових значень, розділений пробілами, і замініть
sig. - Тримайте one pattern per Flutter release, зберігайте їх у cheat-sheet для швидкого повторного використання.
Примусове перенаправлення трафіку через ваш проксі
Flutter itself ігнорує налаштування проксі на пристрої. Найпростіші варіанти:
- Android Studio emulator: Settings ▶ Proxy → manual.
- Physical device: evil Wi-Fi AP + DNS spoofing, or Magisk module editing
/etc/hosts.
Швидкий workflow обходу TLS для Flutter (Frida Codeshare + system CA)
Якщо потрібно лише спостерігати за pinned Flutter API, поєднання rooted/writable AVD, system-trusted proxy CA та drop-in Frida script часто швидше, ніж reverse-engineering libflutter.so:
-
Install your proxy CA in the system store. Follow Install Burp Certificate to hash/rename Burp’s DER certificate and push it into
/system/etc/security/cacerts/(writable/systemrequired). -
Drop a matching
frida-serverbinary and run it as root so it can attach to the Flutter process:
adb push frida-server-17.0.5-android-x86_64 /data/local/tmp/frida-server
adb shell "su -c 'chmod 755 /data/local/tmp/frida-server && /data/local/tmp/frida-server &'"
- Встановіть інструменти на стороні хоста та перелічте цільовий пакет.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Запустіть Flutter app з Codeshare hook, який вимикає BoringSSL pin checks.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause
Скрипт Codeshare перекриває перевірку TLS у Flutter, тому кожен сертифікат (включно з динамічно згенерованими Burp) приймається, обходячи public-key pin comparisons.
- Route traffic through your proxy. Configure the emulator Wi-Fi proxy GUI or enforce it via
adb shell settings put global http_proxy 10.0.2.2:8080; if direct routing fails, fall back toadb reverse tcp:8080 tcp:8080or a host-only VPN.
Once the CA is trusted at the OS layer and Frida quashes Flutter’s pinning logic, Burp/mitmproxy regains full visibility for API fuzzing (BOLA, token tampering, etc.) without repacking the APK.
Хук за офсетом для перевірки BoringSSL (без signature scan)
Коли скрипти, що шукають патерни, не спрацьовують між архітектурами (наприклад, x86_64 vs ARM), безпосередньо хукніть BoringSSL chain verifier за абсолютною адресою в libflutter.so. Workflow:
- Extract the right-ABI library from the APK:
unzip -j app.apk "lib/*/libflutter.so" -d libs/and pick the one matching the device (e.g.,lib/x86_64/libflutter.so). - Analyze in Ghidra/IDA and locate the verifier:
- Source: BoringSSL ssl_x509.cc function
ssl_crypto_x509_session_verify_cert_chain(3 args, returns bool). - In stripped builds, search for the string
"ssl_client"and inspect XREFs; identify the function taking three pointer-like args and returning a boolean. - Compute the runtime offset: take the function address shown by Ghidra and subtract the image base used during analysis to get the relative offset (RVA). Example:
0x02184644 - 0x00100000 = 0x02084644. - Підключіть хук у runtime за адресою base + offset і примусово поверніть успішний результат:
// frida -U -f com.target.app -l bypass.js --no-pause
const base = Module.findBaseAddress('libflutter.so');
// Example offset from analysis. Recompute per build/arch.
const off = ptr('0x02084644');
const addr = base.add(off);
// ssl_crypto_x509_session_verify_cert_chain: 3 args, bool return
Interceptor.replace(addr, new NativeCallback(function (a, b, c) {
return 1; // true
}, 'int', ['pointer', 'pointer', 'pointer']));
console.log('[+] Hooked BoringSSL verify_cert_chain at', addr);
Примітки
- Переобчислюйте offset для кожної цільової збірки та архітектури CPU; compiler/codegen differences порушують жорстко закодовані сигнатури.
- Цей bypass призводить до того, що BoringSSL приймає будь-який chain, дозволяючи HTTPS MITM незалежно від pins/CA trust у Flutter.
- Якщо ви примусово маршрутизуєте трафік під час налагодження, щоб підтвердити блокування TLS, наприклад:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…вам все одно знадобиться вищезгаданий hook, оскільки перевірка відбувається всередині libflutter.so, а не в системному сховищі довірених сертифікатів Android.
Посилання
- https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/
- Flutter SSL Bypass: How to Intercept HTTPS Traffic When all other Frida Scripts Fail
- BoringSSL ssl_x509.cc (ssl_crypto_x509_session_verify_cert_chain)
- SSL Pinning Bypass – Android
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.
HackTricks

