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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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 Netzwerkoperationen (DNS, Sockets, TLS) erfolgen innerhalb dieser Bibliothek, nicht in den üblichen Java/Kotlin- oder Swift/Obj-C-Schichten. Dieses siloartige Design ist der Grund, warum die üblichen Java-Level Frida-Hooks bei Flutter-Apps versagen.
Intercepting HTTPS traffic in Flutter
Dies ist eine Zusammenfassung dieses 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
Wenn man die Version kennt, kann man die richtigen Binaries neu bauen oder pattern-matchen.
| Step | Command / File | Outcome |
|---|---|---|
| Snapshot-Hash ermitteln | python3 get_snapshot_hash.py libapp.so | adb4292f3ec25… |
| Hash → Engine zuordnen | enginehash list in reFlutter | Flutter 3 · 7 · 12 + engine commit 1a65d409… |
| Abhängige Commits abrufen | 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()
- Located in
ssl_x509.ccinside BoringSSL. - Returns
bool– a singletrueis 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
- Klonen Sie genau die Engine- & Dart-Quellen für die Flutter-Version der App.
- Regex-patch zwei Hotspots:
- In
ssl_x509.ccreturn 1;erzwingen. - (Optional) In
socket_android.cceinen Proxy hartkodieren ("10.0.2.2:8080").
- Neu kompilieren libflutter.so, diese zurück in das APK/IPA packen, signieren, installieren.
- Pre-patched builds für gängige Versionen werden in den reFlutter GitHub-Releases bereitgestellt, um Stunden an Build-Zeit zu sparen.
### Option B – Live hooking with Frida (the “hard-core” path) Weil das Symbol stripped ist, pattern-scannst du das geladene Modul nach seinen ersten Bytes und änderst dann zur Laufzeit den Rückgabewert.
// 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"); }
});
Ich habe den Inhalt der Datei src/mobile-pentesting/android-app-pentesting/flutter.md nicht erhalten. Bitte füge hier den Markdown-Inhalt der Datei ein, dann übersetze ich ihn gemäß deinen Vorgaben ins Deutsche (Tags, Links, Pfade, Code und spezifizierte Begriffe werden unverändert gelassen).
frida -U -f com.example.app -l bypass.js
Portierungs-Tipps
- Für arm64-v8a oder armv7, kopiere die ersten ~32 Bytes der Funktion aus Ghidra, konvertiere sie in einen durch Leerzeichen getrennten Hex-String und ersetze
sig. - Behalte ein Pattern pro Flutter-Release, und speichere sie in einem Cheat-Sheet zur schnellen Wiederverwendung.
Traffic über deinen Proxy erzwingen
Flutter selbst ignoriert die Proxy-Einstellungen des Geräts. Einfachste Optionen:
- 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 Reverse-Engineering von libflutter.so:
-
Install your proxy CA in the system store. Folge Install Burp Certificate, um Burps DER-Zertifikat zu hashen/umzubenennen und in
/system/etc/security/cacerts/zu pushen (beschreibbares/systemerforderlich). -
Drop a matching
frida-serverbinary 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 &'"
- Installiere die hostseitigen Tools und enumerate das target package.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Starte die Flutter-App mit dem Codeshare-Hook, der BoringSSL pin checks deaktiviert.
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 damit public-key pin-Vergleiche umgangen werden.
- Leite den Traffic durch deinen Proxy. Konfiguriere die Emulator-Wi‑Fi‑Proxy-GUI oder setze es per
adb shell settings put global http_proxy 10.0.2.2:8080durch; falls direkte Weiterleitung fehlschlägt, weiche aufadb reverse tcp:8080 tcp:8080oder ein host-only VPN aus.
Sobald die CA auf OS-Ebene vertraut wird und Frida Flutters pinning-Logik außer Kraft setzt, erhält Burp/mitmproxy wieder volle Sichtbarkeit für API fuzzing (BOLA, token tampering, etc.) ohne das APK neu zu packen.
Offset-basierter Hook der BoringSSL-Verifikation (no signature scan)
Wenn pattern-basierte Skripte über verschiedene Architekturen (z. B. x86_64 vs ARM) versagen, hooke direkt den BoringSSL chain verifier über die absolute Adresse innerhalb von libflutter.so. Workflow:
- Extrahiere die passende ABI-Bibliothek aus dem APK:
unzip -j app.apk "lib/*/libflutter.so" -d libs/und wähle die zur Zielplattform passende aus (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, suche nach dem String
"ssl_client"und untersuche die XREFs; identifiziere die Funktion, die drei pointer-ähnliche args nimmt und einen boolean zurückgibt. - Berechne den Laufzeit-Offset: Nimm die von Ghidra angezeigte Funktionsadresse und subtrahiere die während der Analyse verwendete image base, um den relativen Offset (RVA) zu erhalten. 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);
Hinweise
- Berechne den Offset neu für jeden Ziel-Build und jede CPU-Architektur; Compiler-/Codegen-Unterschiede brechen hardcodierte Signaturen.
- Dieser Bypass bewirkt, dass BoringSSL jede Zertifikatskette akzeptiert und HTTPS MITM ermöglicht, unabhängig von pins/CA trust inside Flutter.
- Wenn du Traffic während debugging umleitest, um TLS-Blocking zu bestätigen, z. B.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…du benötigst trotzdem den obenstehenden hook, da die Überprüfung innerhalb von libflutter.so erfolgt und nicht im Android system trust store.
Referenzen
- 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
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks

