Flutter

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Flutter is Google’s cross-platform UI toolkit wat ontwikkelaars toelaat om ’n enkele Dart-kodebasis te skryf wat die Engine (native C/C++) omskakel na platform-spesifieke masjienkode vir Android & iOS. Die Engine bundel ’n Dart VM, BoringSSL, Skia, ens., en word gestuur as die gedeelde biblioteek libflutter.so (Android) of Flutter.framework (iOS). Alle werklike netwerkverkeer (DNS, sockets, TLS) gebeur binne hierdie biblioteek, nie in die gewone Java/Kotlin Swift/Obj-C-lae nie. Daardie gesiloede ontwerp is waarom die gewone Java-vlak Frida-hooks op Flutter-apps misluk.

Intercepteer HTTPS-verkeer in Flutter

Dit is ’n samevatting van hierdie blog post.

Waarom HTTPS-intersepsie moeilik is in Flutter

  • SSL/TLS-verifikasie lê twee lae laer in BoringSSL, so Java SSL‐pinning-bypass-metodes raak dit nie.
  • BoringSSL gebruik sy eie CA-store binne libflutter.so; die invoer van jou Burp/ZAP CA in Android se stelselwinkel verander niks.
  • Simbole in libflutter.so is gestrip & vermink, wat die sertifikaat-verifikasie-funksie vir dinamiese gereedskap wegsteek.

Maak ’n vingerafdruk van die presiese Flutter-stapel

Om die weergawe te ken laat jou toe om die regte binaries te herbou of patroon-te pas.

StepCommand / FileOutcome
Get snapshot hashpython3 get_snapshot_hash.py libapp.soadb4292f3ec25…
Map hash → Engineenginehash list in reFlutterFlutter 3 · 7 · 12 + engine commit 1a65d409…
Pull dependent commitsDEPS 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()

  • Located in ssl_x509.cc inside BoringSSL.
  • Returns bool – ’n enkele true is genoeg om die hele sertifikaatkettingkontrole te omseil.
  • Dieselfde funksie bestaan op elke CPU-argitektuur; net die opkodes verskil.

Option A – Binary patching with reFlutter

  1. Clone die presiese Engine- en Dart-bronne vir die app se Flutter-weergawe.
  2. Regex-patch twee hotspots:
  • In ssl_x509.cc, forceer return 1;
  • (Optional) In socket_android.cc, hard-code ’n proxy ("10.0.2.2:8080").
  1. Re-kompileer libflutter.so, plaas dit terug in die APK/IPA, teken, installeer.
  2. Pre-patched builds vir algemene weergawes word in die reFlutter GitHub-releases verskaf om ure se build-tyd te bespaar.

### Option B – Live hooking with Frida (the “hard-core” path) Omdat die simbool gestript is, patroon-scan jy die gelaaide module vir sy eerste bytes, en verander dan die return-waarde op die vlug.

// 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"); }
});

I don’t have the file contents. Please paste the full markdown from src/mobile-pentesting/android-app-pentesting/flutter.md (or upload it). I will then translate the English text to Afrikaans, preserving all code, tags, links, paths and the specified words unchanged.

frida -U -f com.example.app -l bypass.js

Porting wenke

  • Vir arm64-v8a of armv7, gryp die eerste ~32 bytes van die funksie uit Ghidra, omskep dit na ’n spasie-geskeide hex-string, en vervang sig.
  • Hou een patroon per Flutter-release, stoor patrone in ’n cheat-sheet vir vinnige hergebruik.

Dwing verkeer deur jou proxy

Flutter self ignoreer toestel se proxy-instellings. Maklikste opsies:

  • Android Studio emulator: Instellings ▶ Proxy → handmatig.
  • Fisiese toestel: evil Wi-Fi AP + DNS spoofing, of Magisk-module wat /etc/hosts wysig.

Vinnige Flutter TLS-bypass werksvloei (Frida Codeshare + system CA)

As jy net ’n gepinde Flutter API hoef te observeer, is dit dikwels vinniger om ’n rooted/writable AVD, ’n system-trusted proxy CA, en ’n drop-in Frida script te kombineer as om libflutter.so te reverse-engineer:

  1. Installeer jou proxy CA in die system store. Volg Install Burp Certificate om Burp se DER-sertifikaat te hash/hernoem en dit in /system/etc/security/cacerts/ te push (skryfbare /system benodig).

  2. Plaas ’n ooreenstemmende frida-server binary en voer dit as root uit sodat dit aan die Flutter-proses kan koppel:

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. Installeer die host-side tooling en enumerate die target package.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
  1. Spawn die Flutter app met die Codeshare hook wat BoringSSL pin checks neutraliseer.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause

Die Codeshare script oorlaai die Flutter TLS verifier sodat elke sertifikaat (insluitend Burp se dinamies gegenereerde sertifikate) aanvaar word, wat public-key pin comparisons omseil.

  1. Roeteer verkeer deur jou proxy. Konfigureer die emulator Wi‑Fi proxy GUI of dwing dit af via adb shell settings put global http_proxy 10.0.2.2:8080; as direkte routering misluk, val terug op adb reverse tcp:8080 tcp:8080 of ’n host-only VPN.

Sodra die CA op die OS-laag vertrou word en Frida Flutter se pinning-logika neerslaan, herwin Burp/mitmproxy volle sigbaarheid vir API fuzzing (BOLA, token tampering, ens.) sonder om die APK te repak.

Offset-based hook of BoringSSL verification (no signature scan)

Wanneer patroon-gebaseerde skripte oor argitekture faal (bv. x86_64 vs ARM), hook direk die BoringSSL chain verifier deur absolute adres binne libflutter.so. Workflow:

  • Haal die regte-ABI biblioteek uit die APK: unzip -j app.apk "lib/*/libflutter.so" -d libs/ en kies die een wat by die toestel pas (bv. lib/x86_64/libflutter.so).
  • Analiseer in Ghidra/IDA en lokaliseer die verifier:
  • Bron: BoringSSL ssl_x509.cc funksie ssl_crypto_x509_session_verify_cert_chain (3 args, returns bool).
  • In gestripte builds, soek vir die string "ssl_client" en ondersoek XREFs; identifiseer die funksie wat drie pointer-agtige args neem en ’n boolean teruggee.
  • Bereken die runtime offset: neem die funksieadres wat deur Ghidra getoon word en trek die image base wat tydens analise gebruik is af om die relatiewe offset (RVA) te kry. Example: 0x02184644 - 0x00100000 = 0x02084644.
  • Hook tydens runtime by base + offset en forceer sukses:
// 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);

Aantekeninge

  • Herbereken die offset vir elke teiken-bou en CPU-argitektuur; compiler/codegen-verskille breek hardgekodeerde signatures.
  • Hierdie bypass veroorsaak dat BoringSSL enige chain aanvaar, wat HTTPS MITM moontlik maak ongeag pins/CA trust binne Flutter.
  • As jy verkeer force-route tydens debugging om TLS-blokkering te bevestig, byvoorbeeld:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>

…Jy sal steeds die hook hierbo benodig, aangesien verifikasie binne libflutter.so plaasvind, nie in Android se stelsel-trust store nie.

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks