Flutter

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Flutter ist Googles plattformübergreifendes UI-Toolkit, das Entwicklern erlaubt, eine einzige Dart-Codebasis zu schreiben, die die Engine (native C/C++) in plattformspezifischen Maschinencode für Android & iOS übersetzt. Die Engine bündelt eine Dart VM, BoringSSL, Skia usw. und wird als Shared Library libflutter.so (Android) oder Flutter.framework (iOS) ausgeliefert. Alle tatsächlichen Netzwerk‑Operationen (DNS, Sockets, TLS) finden in dieser Library statt, nicht in den üblichen Java/Kotlin- oder Swift/Obj‑C‑Schichten. Dieses isolierte Design ist der Grund, warum die üblichen Java‑Level Frida-Hooks bei Flutter‑Apps versagen.

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

Knowing the version lets you re-build or pattern-match the right binaries.

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 – a single true is 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

  1. Clone the exact Engine & Dart sources for the app’s Flutter version.
  2. Regex-patch two hotspots:
  • In ssl_x509.cc, erzwinge return 1;
  • (Optional) In socket_android.cc, hard-code a proxy ("10.0.2.2:8080").
  1. Re-compile libflutter.so, drop it back into the APK/IPA, sign, install.
  2. 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"); }
});

I don’t have the file content. Bitte füge den Markdown‑Inhalt von src/mobile-pentesting/android-app-pentesting/flutter.md hier ein, dann übersetze ich ihn präzise ins Deutsche unter Beibehaltung aller Markdown-/HTML‑Tags und Pfade.

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

Porting-Tipps

  • 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.

Traffic durch deinen proxy erzwingen

Flutter selbst ignores device proxy settings. Easiest options:

  • Android Studio emulator: Settings ▶ Proxy → manual.
  • Physisches Gerät: evil Wi-Fi AP + DNS spoofing, or Magisk module editing /etc/hosts.

Schneller Flutter TLS-Bypass-Workflow (Frida Codeshare + system CA)

Wenn du nur eine gepinnte Flutter-API beobachten musst, ist die Kombination aus einem gerooteten/beschreibbaren AVD, einer system-trusted proxy CA und einem drop-in Frida-Skript oft schneller als das Reverse-Engineering von libflutter.so:

  1. 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 /system required).

  2. Drop a matching frida-server binary 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 &'"
  1. Installieren Sie die hostseitigen Tools und listen Sie das Zielpaket auf.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
  1. Starte die Flutter App mit dem Codeshare hook, der BoringSSL pin checks neutralisiert.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause

Das Codeshare-Skript überschreibt den Flutter TLS verifier, sodass jedes Zertifikat (einschließlich der dynamisch von Burp erzeugten) akzeptiert wird und public-key pin comparisons umgangen werden.

  1. Route traffic through your proxy. Konfiguriere die Emulator Wi‑Fi proxy GUI oder setze sie per adb shell settings put global http_proxy 10.0.2.2:8080; falls direkte Weiterleitung fehlschlägt, weiche auf adb reverse tcp:8080 tcp:8080 oder ein host-only VPN aus.

Sobald die CA auf OS‑Ebene vertraut wird und Frida die Flutter-Pinning-Logik außer Kraft setzt, erhalten Burp/mitmproxy wieder volle Sichtbarkeit für API fuzzing (BOLA, token tampering, etc.) ohne Repacken der APK.

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

Wenn pattern-basierte Skripte über verschiedene Architekturen (z. B. x86_64 vs ARM) fehlschlagen, hooke direkt den BoringSSL chain verifier über seine absolute Adresse in libflutter.so. Workflow:

  • Extrahiere die Bibliothek mit der passenden ABI aus der APK: unzip -j app.apk "lib/*/libflutter.so" -d libs/ und wähle diejenige, die zum Gerät passt (z. B. lib/x86_64/libflutter.so).
  • Analysiere in Ghidra/IDA und finde den Verifier:
  • Quelle: BoringSSL ssl_x509.cc Funktion ssl_crypto_x509_session_verify_cert_chain (3 args, returns bool).
  • In stripped builds benutze Search → For Strings → ssl_client → XREFs, öffne dann jede referenzierte FUN_... und wähle die mit 3 pointer‑artigen args und einem boolean return.
  • Berechne den Laufzeit-Offset: nimm die von Ghidra angezeigte Funktionsadresse und subtrahiere die image base (z. B. zeigt Ghidra oft 0x00100000 für PIE Android ELFs). Beispiel: 0x02184644 - 0x00100000 = 0x02084644.
  • Hooke zur Laufzeit bei base + offset und erzwinge Erfolg:
// 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 können auf ARM erfolgreich sein, aber auf x86_64 fehlschlagen, weil sich das Opcode-Layout ändert; diese Offset-Methode ist architekturagnostisch, solange du die RVA neu berechnest.
  • Dieser Bypass führt dazu, dass BoringSSL jede Zertifikatskette akzeptiert und HTTPS MITM ermöglicht, unabhängig von pins/CA trust innerhalb von Flutter.
  • Wenn du während des Debuggings den Traffic zwangsweise umleitest, um TLS-Blockierung zu bestätigen, z. B.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>

…du wirst den oben genannten hook weiterhin benötigen, da die Verifikation innerhalb von libflutter.so erfolgt und nicht im Android’s system trust store.

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks