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, який дозволяє розробникам писати єдину кодову базу на Dart, яку Engine (native C/C++) перетворює в платформо-специфічний машинний код для Android & iOS. Engine пакує в себе Dart VM, BoringSSL, Skia тощо, і постачається як shared library libflutter.so (Android) або Flutter.framework (iOS). Весь реальний мережевий стек (DNS, sockets, TLS) працює всередині цієї бібліотеки, а не в звичних шарах Java/Kotlin Swift/Obj-C. Така ізольована архітектура — причина, чому звичні Java-рівневі Frida hooks не працюють на Flutter-додатках.
Intercepting HTTPS traffic in Flutter
This is a summary of this 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, який потрібно перекласти, або надайте текст тут. Я виконаю переклад на українську згідно з вашими правилами (не перекладатиму код, теги, шляхи, посилання тощо).
frida -U -f com.example.app -l bypass.js
Поради з портування
- For arm64-v8a or armv7, grab the first ~32 bytes of the function from Ghidra, convert to a space-separated hex string, and replace
sig. - Keep one pattern per Flutter release, store them in a cheat-sheet for fast reuse.
Forcing traffic through your proxy
Flutter itself ignores device proxy settings. Easiest options:
- Android Studio emulator: Settings ▶ Proxy → manual.
- Physical device: evil Wi-Fi AP + DNS spoofing, or Magisk module editing
/etc/hosts.
Quick Flutter TLS bypass workflow (Frida Codeshare + system CA)
When you only need to observe a pinned Flutter API, combining a rooted/writable AVD, a system-trusted proxy CA, and a drop-in Frida script is often faster than 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 додаток з Codeshare hook, який нейтралізує BoringSSL pin checks.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause
Скрипт Codeshare перевизначає Flutter TLS verifier, тож кожен сертифікат (включно з динамічно згенерованими Burp) приймається, обминаючи public-key pin comparisons.
-
Route traffic through your proxy. Налаштуйте GUI проксі Wi‑Fi емулятора або застосуйте його через
adb shell settings put global http_proxy 10.0.2.2:8080; якщо пряме маршрутизування не вдається, використайтеadb reverse tcp:8080 tcp:8080або host-only VPN. -
If the app ignores OS proxy settings, redirect sockets with a Frida shim. Інструменти на кшталт frida4burp хукають створення сокетів
dart:io/BoringSSL, щоб примусово спрямувати вихідні TCP-сесії через ваш proxy, навіть при жорстко вбудованомуHttpClient.findProxyFromEnvironmentабо Wi‑Fi обходах. Вкажіть хост/порт проксі в скрипті і запустіть його разом з TLS bypass:
frida -U -f com.example.target --no-pause \
--codeshare TheDauntless/disable-flutter-tls-v1 \
-l frida4burp.js
Працює на iOS через Frida gadget або USB frida-server; поєднання socket redirect із TLS bypass відновлює і маршрутизацію, і прийняття сертифікатів для Burp/mitmproxy.
Коли CA довірено на рівні OS і Frida пригнічує Flutter’s pinning logic (плюс socket redirection за потреби), Burp/mitmproxy знову отримує повну видимість для API fuzzing (BOLA, token tampering, etc.) без repacking APK.
Offset-based hook of BoringSSL verification (no signature scan)
Коли pattern-based scripts не працюють між архітектурами (наприклад, x86_64 vs ARM), підключіться безпосередньо до chain verifier BoringSSL за абсолютною адресою в libflutter.so. Робочий процес:
- 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, use Search → For Strings →
ssl_client→ XREFs, then open each referencedFUN_...and pick the one with 3 pointer-like args and a boolean return. - Compute the runtime offset: take the function address shown by Ghidra and subtract the image base (e.g., Ghidra often shows
0x00100000for PIE Android ELFs). Example:0x02184644 - 0x00100000 = 0x02084644. - Hook at runtime by base + offset and force success:
// 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);
Примітки
- Signature scans можуть спрацювати на ARM, але дати осічку на x86_64, тому що розташування opcode змінюється; цей метод зі зсувом не залежить від архітектури, доки ви перерахуєте RVA.
- Цей bypass змушує BoringSSL приймати будь-який chain, дозволяючи HTTPS MITM незалежно від pins/CA trust всередині Flutter.
- Якщо ви force-route трафік під час debugging, щоб підтвердити TLS blocking, наприклад:
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 (vercel)
- Flutter SSL Bypass: How to Intercept HTTPS Traffic When all other Frida Scripts Fail (medium)
- PoC Frida hook for Flutter SSL bypass
- BoringSSL ssl_x509.cc (ssl_crypto_x509_session_verify_cert_chain)
- SSL Pinning Bypass – Android
- Practical Mobile Traffic Interception
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.


