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

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.

StepCommand / FileOutcome
Dohvati hash snapshot-apython3 get_snapshot_hash.py libapp.soadb4292f3ec25…
Poveži hash → Engineenginehash lista u reFlutterFlutter 3 · 7 · 12 + engine commit 1a65d409…
Preuzmi zavisne commit-oveDEPS file in that engine commitdart_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.cc unutar BoringSSL-a.
  • Returns bool – jedno true je 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

  1. Clone tačne Engine & Dart izvore za Flutter verziju aplikacije.
  2. Regex-patch dva hotspot-a:
  • U ssl_x509.cc, forsiraj return 1;
  • (Opcionalno) U socket_android.cc, hard-code proxy ("10.0.2.2:8080").
  1. Re-compile libflutter.so, ubaci ga nazad u APK/IPA, potpiši, instaliraj.
  2. 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:

  1. 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).

  2. Postavite odgovarajući frida-server binarni 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 &'"
  1. Instalirajte alatke na host strani i izlistajte ciljni paket.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
  1. 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.

  1. 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, koristite adb reverse tcp:8080 tcp:8080 ili 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

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