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

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.

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.
  • Dönüş tipi bool – tek bir true tü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

  1. Uygulamanın Flutter sürümüne ait tam Engine & Dart kaynaklarını klonlayın.
  2. İki kritik noktayı regex-patch ile düzeltin:
  • ssl_x509.cc içinde return 1; döndürmeye zorlayın.
  • (Opsiyonel) socket_android.cc içinde bir proxy’yi hard-code edin ("10.0.2.2:8080").
  1. libflutter.so’yu yeniden derleyin, APK/IPA’ya geri koyun, imzalayın, yükleyin.
  2. 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 sig ile 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/hosts dü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:

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

  2. Drop a matching frida-server binary 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 &'"
  1. 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
  1. 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.

  1. 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:8080 ile zorlayın; doğrudan yönlendirme başarısız olursa adb reverse tcp:8080 tcp:8080 veya 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 referenced FUN_... 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 0x00100000 for 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

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