Flutter
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Flutter, geliştiricilerin tek bir Dart kod tabanı yazmasına izin veren Google’ın çapraz platform UI toolkit’idir; Engine (native C/C++) bunu Android ve iOS için platforma özgü makine koduna çevirir. Engine, içinde Dart VM, BoringSSL, Skia vb. barındırır ve paylaşılan kütüphane olarak libflutter.so (Android) veya Flutter.framework (iOS) halinde dağıtılır. Tüm gerçek ağ işlemleri (DNS, sockets, TLS) bu kütüphane içinde gerçekleşir; alışılmış Java/Kotlin veya Swift/Obj-C katmanlarında değil. Bu izole tasarım, sıradan Java seviyesindeki Frida hooklarının Flutter uygulamalarında işe yaramamasının nedenidir.
Intercepting HTTPS traffic in Flutter
Bu, bu blog post yazısının bir özetidir.
Why HTTPS interception is tricky in Flutter
- SSL/TLS verification lives two layers down BoringSSL içinde, bu yüzden Java SSL‐pinning bypass’ları buna dokunmaz.
- BoringSSL uses its own CA store libflutter.so içinde; Burp/ZAP CA’nızı Android’in sistem deposuna import etmek hiçbir şeyi değiştirmez.
- libflutter.so içindeki semboller stripped & mangled, sertifika-doğrulama fonksiyonunu dinamik araçlardan gizler.
Fingerprint the exact Flutter stack
Sürümü bilmek, doğru ikili dosyaları yeniden derlemenize veya desen eşleştirme ile tanımlamanıza olanak verir.
| Step | Command / File | Outcome |
|---|---|---|
| Get snapshot hash | python3 get_snapshot_hash.py libapp.so | adb4292f3ec25… |
| Map hash → Engine | enginehash list in reFlutter | Flutter 3 · 7 · 12 + engine commit 1a65d409… |
| Pull dependent commits | 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. - Dönüş tipi
bool– tek birtruetüm sertifika zinciri kontrolünü atlatmak için yeterlidir. - Aynı fonksiyon her CPU mimarisinde bulunur; sadece opcode’lar farklıdır.
Option A – Binary patching with reFlutter
- Uygulamanın Flutter sürümüne ait tam Engine & Dart kaynaklarını klonlayın.
- İki kritik noktayı regex-patch ile düzeltin:
ssl_x509.cciçindereturn 1;döndürmeye zorlayın.- (Opsiyonel)
socket_android.cciçinde bir proxy’yi hard-code edin ("10.0.2.2:8080").
libflutter.so’yu yeniden derleyin, APK/IPA’ya geri koyun, imzalayın, yükleyin.- Yaygın sürümler için önceden yamalanmış build’ler reFlutter GitHub release’lerinde sunulur; bu, saatlerce süren derleme zamanından tasarruf sağlar.
### Option B – Live hooking with Frida (the “hard-core” path) Sembol stripped olduğu için, yüklü modülde ilk byte’ları pattern-scan ile ararsınız; ardından dönüş değerini uçuşta (on the fly) değiştirirsiniz.
// 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 markdown from src/mobile-pentesting/android-app-pentesting/flutter.md (or the portion you want translated) and I’ll translate it to Turkish.
frida -U -f com.example.app -l bypass.js
Taşıma ipuçları
- For arm64-v8a or armv7, Ghidra’dan fonksiyonun ilk ~32 baytını alın, boşlukla ayrılmış hex string’e çevirin ve
sigile değiştirin. - Her Flutter release için one pattern, hızlı yeniden kullanım için bunları bir cheat-sheet’te saklayın.
Trafiği proxy’niz üzerinden yönlendirme
Flutter kendisi cihaz proxy ayarlarını yoksayar. En kolay seçenekler:
- Android Studio emulator: Settings ▶ Proxy → manual.
- Physical device: evil Wi-Fi AP + DNS spoofing, veya Magisk module ile
/etc/hostsdüzenleme.
Quick Flutter TLS bypass workflow (Frida Codeshare + system CA)
Sadece pinlenmiş bir Flutter API’sini gözlemlemeniz gerekiyorsa, rootlu/yazılabilir bir AVD, sistem tarafından güvenilen bir proxy CA ve hazır bir Frida script’ini birleştirmek genellikle libflutter.so’yu tersine mühendislik yapmaktan daha hızlıdır:
-
Install your proxy CA in the system store. Install Burp Certificate rehberini takip ederek Burp’ın DER sertifikasını hash’leyip/yeniden adlandırın ve
/system/etc/security/cacerts/dizinine push edin (yazılabilir/systemgerekli). -
Drop a matching
frida-serverbinary and run it as root ki Flutter sürecine eklenebilsin:
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 &'"
- Host-side tooling’i kurun ve target package’i enumerate edin.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Codeshare hook ile BoringSSL pin checks’i devre dışı bırakan Flutter uygulamasını başlatın.
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.
- Trafiği proxy’iniz üzerinden yönlendirin. Emülatörün Wi‑Fi proxy GUI’sini yapılandırın veya
adb shell settings put global http_proxy 10.0.2.2:8080ile zorlayın; doğrudan yönlendirme başarısız olursaadb reverse tcp:8080 tcp:8080veya host-only VPN’e geri dönün.
Once the CA is trusted at the OS layer and Frida quashes Flutter’s pinning logic, Burp/mitmproxy regains full visibility for API fuzzing (BOLA, token tampering, etc.) without repacking the APK.
BoringSSL doğrulamasının offset-tabanlı hook’u (imza taraması yok)
When pattern-based scripts fail across architectures (e.g., x86_64 vs ARM), directly hook the BoringSSL chain verifier by absolute address within libflutter.so. Workflow:
- APK’tan doğru ABI kütüphanesini çıkarın:
unzip -j app.apk "lib/*/libflutter.so" -d libs/ve cihazla eşleşen olanı seçin (örn.lib/x86_64/libflutter.so). - Ghidra/IDA’da analiz edin ve doğrulayıcıyı bulun:
- Source: BoringSSL ssl_x509.cc function
ssl_crypto_x509_session_verify_cert_chain(3 args, returns bool). - In stripped builds, use Search → For Strings →
ssl_client→ XREFs, then open each referencedFUN_...and pick the one with 3 pointer-like args and a boolean return. - Compute the runtime offset: take the function address shown by Ghidra and subtract the image base (e.g., Ghidra often shows
0x00100000for PIE Android ELFs). Example:0x02184644 - 0x00100000 = 0x02084644. - Hook at runtime by base + offset and force success:
// 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);
Notlar
- Signature scans ARM üzerinde başarılı olabilir ancak opcode düzeni değiştiği için x86_64 üzerinde kaçırılabilir; bu offset method mimariden bağımsızdır, RVA’yı yeniden hesapladığınız sürece.
- Bu bypass, BoringSSL’in herhangi bir chain’i kabul etmesine neden olur ve Flutter içindeki pins/CA trust’a bakılmaksızın HTTPS MITM’e izin verir.
- Eğer TLS engellemesini doğrulamak için debugging sırasında trafiği force-route ediyorsanız, ör.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…yine de yukarıdaki hook’a ihtiyacınız olacak, çünkü doğrulama libflutter.so içinde gerçekleşiyor, Android’in sistem trust store’unda değil.
Referanslar
- 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 (vercel)
- Flutter SSL Bypass: How to Intercept HTTPS Traffic When all other Frida Scripts Fail (medium)
- PoC Frida hook for Flutter SSL bypass
- BoringSSL ssl_x509.cc (ssl_crypto_x509_session_verify_cert_chain)
- SSL Pinning Bypass – Android
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


