mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/flutter.md'] t
This commit is contained in:
parent
1e298701a6
commit
fe3aa68967
74
src/mobile-pentesting/android-app-pentesting/flutter.md
Normal file
74
src/mobile-pentesting/android-app-pentesting/flutter.md
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Flutter
|
||||||
|
|
||||||
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
# 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](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/) 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ım | Komut / Dosya | Sonuç
|
||||||
|
----|----|----
|
||||||
|
Anlık görüntü hash'ini al | ```bash\npython3 get_snapshot_hash.py libapp.so\n``` | `adb4292f3ec25…`
|
||||||
|
Hash'ı → Engine ile eşleştir | reFlutter'daki **enginehash** listesi | Flutter 3 · 7 · 12 + engine commit `1a65d409…`
|
||||||
|
Bağımlı commit'leri çek | O engine commit'indeki DEPS dosyası | • `dart_revision` → Dart v2 · 19 · 6<br>• `dart_boringssl_rev` → BoringSSL `87f316d7…`
|
||||||
|
|
||||||
|
[get_snapshot_hash.py burada](https://github.com/Impact-I/reFlutter/blob/main/scripts/get_snapshot_hash.py) 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"`).
|
||||||
|
3. libflutter.so'yu **yeniden derleyin**, APK/IPA'ya geri bırakın, imzalayın, yükleyin.
|
||||||
|
4. 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
|
||||||
|
- [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)
|
Loading…
x
Reference in New Issue
Block a user