Flutter

Reading time: 3 minutes

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

Flutter, geliştiricilerin tek bir Dart kod tabanı yazmasına olanak tanıyan Google'ın çoklu platform UI araç takımıdır; bu kod tabanı, Engine (yerel C/C++) tarafından Android ve iOS için platforma özgü makine koduna dönüştürülür. Engine, Dart VM, BoringSSL, Skia vb. bileşenleri bir araya getirir ve libflutter.so (Android) veya Flutter.framework (iOS) olarak paylaşılan kütüphane olarak gönderilir. Tüm gerçek ağ iletişimi (DNS, soketler, TLS) bu kütüphane içinde gerçekleşir, normal Java/Kotlin Swift/Obj-C katmanlarında değil. Bu izole tasarım, normal Java düzeyindeki Frida kancalarının Flutter uygulamalarında başarısız olmasının nedenidir.

Flutter'da HTTPS trafiğini yakalamak

Bu, bu blog yazısının bir özetidir.

Neden HTTPS müdahalesi Flutter'da zordur

  • SSL/TLS doğrulaması iki katman aşağıda BoringSSL'de yer alır, bu nedenle Java SSL-pinning atlamaları buna dokunmaz.
  • BoringSSL, libflutter.so içinde kendi CA deposunu kullanır; Burp/ZAP CA'nızı Android'in sistem deposuna aktarmak hiçbir şeyi değiştirmez.
  • libflutter.so'daki semboller kaldırılmış ve bozulmuş, dinamik araçlardan sertifika doğrulama işlevini gizler.

Tam Flutter yığınını parmak iziyle tanımlama

Sürümü bilmek, doğru ikili dosyaları yeniden oluşturmanıza veya desen eşleştirmenize olanak tanır.

AdımKomut / DosyaSonuç
Anlık görüntü hash'ini albash\npython3 get_snapshot_hash.py libapp.so\nadb4292f3ec25…
Hash'ı → Engine ile eşleştirreFlutter'daki enginehash listesiFlutter 3 · 7 · 12 + engine commit 1a65d409…
Bağımlı commit'leri çekO engine commit'indeki DEPS dosyasıdart_revision → Dart v2 · 19 · 6
dart_boringssl_rev → BoringSSL 87f316d7…

get_snapshot_hash.py burada bulun.

Hedef: ssl_crypto_x509_session_verify_cert_chain()

  • BoringSSL içinde ssl_x509.cc dosyasında yer alır.
  • bool döner – tüm sertifika zinciri kontrolünü atlamak için tek bir true yeterlidir.
  • Aynı işlev her CPU mimarisinde mevcuttur; yalnızca opcode'lar farklıdır.

Seçenek A – reFlutter ile İkili yamanın

  1. Uygulamanın Flutter sürümü için tam Engine ve Dart kaynaklarını klonlayın.
  2. İki sıcak noktayı Regex-yamanız:
  • ssl_x509.cc içinde, return 1; zorlayın.
  • (İsteğe bağlı) socket_android.cc içinde, bir proxy'yi sabit kodlayın ("10.0.2.2:8080").
  1. libflutter.so'yu yeniden derleyin, APK/IPA'ya geri bırakın, imzalayın, yükleyin.
  2. Yaygın sürümler için önceden yamanmış derlemeler, saatlerce derleme süresinden tasarruf etmek için reFlutter GitHub sürümlerinde gönderilmektedir.

Seçenek B – Frida ile Canlı kanca (“sert yol”)

Sembol kaldırıldığı için, yüklü modülün ilk baytlarını desen taraması yaparak bulur, ardından döndürme değerini anlık olarak değiştirirsiniz.

javascript
// 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"); }
});

Çalıştır:

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

Porting tips

  • arm64-v8a veya armv7 için, Ghidra'dan fonksiyonun ilk ~32 baytını alın, boşlukla ayrılmış bir hex dizesine dönüştürün ve sig ile değiştirin.
  • Her Flutter sürümü için bir desen saklayın, hızlı yeniden kullanım için bir kopya kağıdında depolayın.

Trafiği proxy'niz üzerinden zorlamak

Flutter kendisi cihaz proxy ayarlarını göz ardı eder. En kolay seçenekler:

  • Android Studio emülatörü: Ayarlar ▶ Proxy → manuel.
  • Fiziksel cihaz: kötü niyetli Wi-Fi AP + DNS sahtekarlığı veya Magisk modülü ile /etc/hosts düzenleme.

References