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 platformonafhanklike UI-gereedskapstel wat ontwikkelaars toelaat om ’n enkele Dart-kodebasis te skryf wat die Engine (native C/C++) in platform-spesifieke masjienkode vir Android & iOS omsit. Die Engine bevat ’n Dart VM, BoringSSL, Skia, ens., en word as die gedeelde biblioteek libflutter.so (Android) of Flutter.framework (iOS) versprei. Alle werklike netwerking (DNS, sockets, TLS) gebeur binne hierdie biblioteek, nie in die gewone Java/Kotlin of Swift/Obj-C-lae nie. Daardie gesilosde ontwerp is waarom die gewone Java-vlak Frida-hooks op Flutter-apps misluk.

Intersep van HTTPS-verkeer in Flutter

Dit is ’n samevatting van hierdie blog post.

Waarom HTTPS-onderskep in Flutter moeilik is

  • SSL/TLS-verifikasie gebeur twee lae laer in BoringSSL, dus raak Java SSL-pinning bypasses dit nie.
  • BoringSSL gebruik sy eie CA-store binne libflutter.so; om jou Burp/ZAP CA in Android se stelselstore te importeer verander niks.
  • Simbole in libflutter.so is gestript en gemanipuleer, wat die sertifikaat-verifikasie-funksie vir dinamiese gereedskap verberg.

Bepaal die presiese Flutter-stapel

Deur die weergawe te ken kan jy die regte binaries herbou of patroonpas.

StepCommand / FileOutcome
Kry snapshot-hashpython3 get_snapshot_hash.py libapp.soadb4292f3ec25…
Koppel hash → Engineenginehash list in reFlutterFlutter 3 · 7 · 12 + engine commit 1a65d409…
Haal afhanklike commitsDEPS file in that engine commitdart_revision → Dart v2 · 19 · 6
dart_boringssl_rev → BoringSSL 87f316d7…

Find get_snapshot_hash.py here.

Doelwit: ssl_crypto_x509_session_verify_cert_chain()

  • Gevind in ssl_x509.cc binne BoringSSL.
  • Gee bool terug – ’n enkele true is genoeg om die hele sertifikaatkettingkontrole te omseil.
  • Dieselfde funksie bestaan op elke CPU-argitektuur; slegs die opkodes verskil.

Option A – Binaire patching with reFlutter

  1. Kloon die presiese Engine & Dart-bronne vir die app se Flutter-weergawe.
  2. Regex-patch twee hotspots:
  • In ssl_x509.cc, forceer return 1;
  • (Opsioneel) In socket_android.cc, hard-code ’n proxy ("10.0.2.2:8080").
  1. Her-compileer libflutter.so, plaas dit terug in die APK/IPA, teken, installeer.
  2. Vooraf-gepatchte builds vir algemene weergawes word in die reFlutter GitHub releases verskaf om ure boutyd te bespaar.

Option B – Live hooking with Frida (die “hard-core” pad)

Omdat die simbool gestript is, pattern-scan jy die gelaaide module vir sy eerste bytes en verander dan dinamies die return-waarde.

// 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 access to src/mobile-pentesting/android-app-pentesting/flutter.md. Paste the file’s markdown content here (or the parts you want translated) and I’ll translate it to Afrikaans, preserving all tags, links, paths, code and hacking terms as you specified.

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

Portering wenke

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

Verplig verkeer deur jou proxy

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

  • Android Studio emulator: Settings ▶ Proxy → manual.
  • Fisiese toestel: kwaadaardige Wi-Fi AP + DNS spoofing, of ’n Magisk-module wat /etc/hosts wysig.

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

Wanneer jy net ’n gepinde Flutter API hoef waar te neem, is dit dikwels vinniger om ’n gerootte/skryfbare AVD, ’n stelsel-vertroude proxy CA, en ’n drop-in Frida-script te kombineer as om libflutter.so te reverse-engineer:

  1. Installeer jou proxy-CA in die stelselwinkel. Volg Install Burp Certificate om Burp se DER-sertifikaat te hash/hern oem en dit in /system/etc/security/cacerts/ te druk (skryfbare /system vereis).

  2. Plaas ’n ooreenstemmende frida-server binary en hardloop dit as root sodat dit by die Flutter-proses kan heg:

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. Start 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 oorrol die Flutter TLS verifier sodat elke sertifikaat (insluitend Burp’s dinamies gegenereerde) aanvaar word, en sodoende public-key pin comparisons omseil.

  1. Lei 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 demp, kry Burp/mitmproxy weer volle sigbaarheid vir API fuzzing (BOLA, token tampering, ens.) sonder om die APK te herverpak.

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

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

  • Trek 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, gebruik Search → For Strings → ssl_client → XREFs, open elke verweesde FUN_... en kies die een met 3 pointer‑agtige args en ’n boolean return.
  • Bereken die runtime offset: neem die funksieadres wat Ghidra wys en trek die image base af (bv. Ghidra wys dikwels 0x00100000 vir PIE Android ELFs). Voorbeeld: 0x02184644 - 0x00100000 = 0x02084644.
  • Hook op runtime by base + offset en dwing sukses af:
// 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

  • Signature scans kan op ARM suksesvol wees maar op x86_64 misluk omdat die opcode-opstelling verander; hierdie offset-metode is argitektuur-onafhanklik solank jy die RVA herbereken.
  • Hierdie bypass veroorsaak dat BoringSSL enige chain aanvaar, wat HTTPS MITM moontlik maak ongeag pins/CA-vertroue binne Flutter.
  • As jy verkeer tydens debugging geforseer herlei om TLS-blokkering te bevestig, bv.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>

…sal jy steeds die hook hierbo nodig hê, aangesien verifikasie binne libflutter.so plaasvind, nie in Android se stelsel trust store nie.

References

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