Flutter
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Flutter is Google-ov alat za razvoj UI-a koji radi na više platformi koji omogućava developerima da napišu jedinstvenu Dart code-base koju Engine (native C/C++) pretvara u platformski-specifični mašinski kod za Android & iOS. Engine obuhvata Dart VM, BoringSSL, Skia, itd., i isporučuje se kao shared library libflutter.so (Android) ili Flutter.framework (iOS). Sav stvarni networking (DNS, sockets, TLS) se dešava inside this library, ne u uobičajenim Java/Kotlin Swift/Obj-C slojevima. Ta izolovana arhitektura je razlog zašto standardni Java-level Frida hook-ovi ne rade na Flutter aplikacijama.
Intercepting HTTPS traffic in Flutter
Ovo je rezime ovog blog post.
Why HTTPS interception is tricky in Flutter
- SSL/TLS verification živi dva nivoa niže u BoringSSL-u, pa Java SSL‐pinning bypass ne dotiče to.
- BoringSSL koristi svoj own CA store unutar libflutter.so; importovanje vaše Burp/ZAP CA u Android-ov system store ne menja ništa.
- Simboli u libflutter.so su stripped & mangled, skrivajući funkciju za verifikaciju sertifikata od dinamičkih alata.
Fingerprint the exact Flutter stack
Poznavanje verzije vam omogućava da ponovo izgradite ili pattern-match-ujete ispravne binarne fajlove.
| Step | Command / File | Outcome |
|---|---|---|
| Dohvati hash snapshot-a | python3 get_snapshot_hash.py libapp.so | adb4292f3ec25… |
| Poveži hash → Engine | enginehash lista u reFlutter | Flutter 3 · 7 · 12 + engine commit 1a65d409… |
| Preuzmi zavisne commit-ove | 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()
- Smeštena u
ssl_x509.ccunutar BoringSSL-a. - Returns
bool– jednotrueje dovoljno da zaobiđe čitavu proveru lanca sertifikata. - Ista funkcija postoji na svim CPU arhitekturama; razlikuju se samo opcode-ovi.
Option A – Binary patching with reFlutter
- Clone tačne Engine & Dart izvore za Flutter verziju aplikacije.
- Regex-patch dva hotspot-a:
- U
ssl_x509.cc, forsirajreturn 1; - (Opcionalno) U
socket_android.cc, hard-code proxy ("10.0.2.2:8080").
- Re-compile libflutter.so, ubaci ga nazad u APK/IPA, potpiši, instaliraj.
- Pre-patched builds za uobičajene verzije su dostupni u reFlutter GitHub release-ovima da uštede sate kompilacije.
### Option B – Live hooking with Frida (the “hard-core” path) Pošto je simbol stripped, pattern-skaniš učitani modul za njegove prve bajtove, pa zatim u letu menjaš povratnu vrednost.
// 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"); }
});
Pošaljite sadržaj fajla src/mobile-pentesting/android-app-pentesting/flutter.md ili nalepite tekst ovde — prevešću ga na srpski u skladu sa uputstvima.
frida -U -f com.example.app -l bypass.js
Saveti za portovanje
- Za arm64-v8a or armv7, uzmite prvih ~32 bajta funkcije iz Ghidra, konvertujte u heks-string sa razmacima i zamenite
sig. - Održavajte one pattern per Flutter release, čuvajte ih u cheat-sheetu za brzo ponovno korišćenje.
Prisiljavanje saobraćaja kroz vaš proxy
Flutter sam ignoriše podešavanja proxy-ja na uređaju. Najjednostavnije opcije:
- Android Studio emulator: Settings ▶ Proxy → manual.
- Fizički uređaj: evil Wi-Fi AP + DNS spoofing, or Magisk module editing
/etc/hosts.
Brzi workflow za TLS bypass u Flutteru (Frida Codeshare + system CA)
Kada treba samo da posmatrate pinned Flutter API, kombinacija rooted/writable AVD-a, system-trusted proxy CA, i drop-in Frida skripte je često brža od reverse-engineering libflutter.so:
-
Install your proxy CA in the system store. Pratite Install Burp Certificate da hash/rename-ujete Burp-ov DER sertifikat i postavite ga u
/system/etc/security/cacerts/(potreban writable/system). -
Postavite odgovarajući
frida-serverbinarni fajl i pokrenite ga kao root da bi mogao da se zakači za Flutter proces:
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 &'"
- Instalirajte alatke na host strani i izlistajte ciljni paket.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Pokrenite Flutter aplikaciju sa Codeshare hook-om koji onemogućava BoringSSL pin checks.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause
The Codeshare script overrides the Flutter TLS verifier so every certificate (including Burp’s dynamically generated ones) is accepted, side-stepping public-key pin comparisons.
- Prosledite saobraćaj kroz svoj proxy. Konfigurišite emulator Wi‑Fi proxy preko GUI-ja ili ga nametnite pomoću
adb shell settings put global http_proxy 10.0.2.2:8080; ako direktno rutiranje ne uspe, koristiteadb reverse tcp:8080 tcp:8080ili host-only VPN.
Kada je CA verifikovana na nivou OS-a i Frida onemogući Flutter-ovu pinning logiku, Burp/mitmproxy ponovo dobija punu vidljivost za API fuzzing (BOLA, token tampering, itd.) bez repackovanja APK-a.
Hook zasnovan na offsetu BoringSSL verifikacije (bez skeniranja potpisa)
Kada skripte zasnovane na šablonima zakažu između arhitektura (npr. x86_64 vs ARM), direktno zakačite BoringSSL chain verifier pomoću apsolutne adrese unutar libflutter.so. Radni tok:
- Izdvojite biblioteku sa odgovarajućim ABI iz APK-a:
unzip -j app.apk "lib/*/libflutter.so" -d libs/i izaberite onu koja odgovara uređaju (npr.lib/x86_64/libflutter.so). - Analizirajte u Ghidra/IDA i pronađite verifikator:
- Izvor: BoringSSL ssl_x509.cc funkcija
ssl_crypto_x509_session_verify_cert_chain(3 args, vraća bool). - U stripped build-ovima, potražite string
"ssl_client"i pregledajte XREF-ove; identifikujte funkciju koja prima tri pointer-like argumenta i vraća boolean. - Izračunajte runtime offset: uzmite adresu funkcije prikazanu u Ghidra-i i oduzmite image base koji je korišćen tokom analize da biste dobili relativni offset (RVA). Primer:
0x02184644 - 0x00100000 = 0x02084644. - Zakačite u runtime-u pomoću base + offset i forsirajte uspeh:
// 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);
Napomene
- Ponovo izračunajte offset za svaki ciljni build i CPU arhitekturu; razlike u kompajleru/codegenu mogu pokvariti hardkodirane potpise.
- Ovaj bypass prouzrokuje da BoringSSL prihvati bilo koji lanac, omogućavajući HTTPS MITM bez obzira na pins/CA trust unutar Flutter.
- Ako pri debagovanju prisilno preusmeravate saobraćaj da biste potvrdili blokiranje TLS-a, npr.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…i dalje će vam trebati gore pomenuti hook, pošto se verifikacija vrši unutar libflutter.so, a ne u Android system trust store.
References
- 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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks

