Flutter
Reading time: 4 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Flutter
Flutter est le kit d'outils UI multiplateforme de Google qui permet aux développeurs d'écrire une seule base de code Dart que le Moteur (C/C++ natif) transforme en code machine spécifique à la plateforme pour Android et iOS.
Le Moteur regroupe un Dart VM, BoringSSL, Skia, etc., et est expédié en tant que bibliothèque partagée libflutter.so (Android) ou Flutter.framework (iOS). Tout le réseau réel (DNS, sockets, TLS) se passe à l'intérieur de cette bibliothèque, pas dans les couches habituelles Java/Kotlin Swift/Obj-C. Ce design cloisonné est la raison pour laquelle les hooks Frida au niveau Java échouent sur les applications Flutter.
Intercepter le trafic HTTPS dans Flutter
Ceci est un résumé de ce blog post.
Pourquoi l'interception HTTPS est délicate dans Flutter
- La vérification SSL/TLS se trouve deux couches plus bas dans BoringSSL, donc les contournements de SSL-pinning Java ne l'affectent pas.
- BoringSSL utilise son propre magasin CA à l'intérieur de libflutter.so ; importer votre CA Burp/ZAP dans le magasin système d'Android ne change rien.
- Les symboles dans libflutter.so sont strippés et obfusqués, cachant la fonction de vérification de certificat des outils dynamiques.
Identifier la pile Flutter exacte
Connaître la version vous permet de reconstruire ou de faire correspondre les bons binaires.
Étape | Commande / Fichier | Résultat |
---|---|---|
Obtenir le hash du snapshot | bash\npython3 get_snapshot_hash.py libapp.so\n | adb4292f3ec25… |
Mapper le hash → Moteur | enginehash liste dans reFlutter | Flutter 3 · 7 · 12 + commit moteur 1a65d409… |
Tirer les commits dépendants | Fichier DEPS dans ce commit moteur | • dart_revision → Dart v2 · 19 · 6• dart_boringssl_rev → BoringSSL 87f316d7… |
Trouvez get_snapshot_hash.py ici.
Cible : ssl_crypto_x509_session_verify_cert_chain()
- Située dans
ssl_x509.cc
à l'intérieur de BoringSSL. - Retourne
bool
– un seultrue
suffit à contourner toute la vérification de la chaîne de certificats. - La même fonction existe sur chaque architecture CPU ; seuls les opcodes diffèrent.
Option A – Patching binaire avec reFlutter
- Cloner les sources exactes du Moteur et de Dart pour la version Flutter de l'application.
- Patch regex deux points chauds :
- Dans
ssl_x509.cc
, forcerreturn 1;
- (Optionnel) Dans
socket_android.cc
, coder en dur un proxy ("10.0.2.2:8080"
).
- Recompiler libflutter.so, le remettre dans l'APK/IPA, signer, installer.
- Versions pré-patchées pour les versions courantes sont expédiées dans les releases GitHub de reFlutter pour économiser des heures de temps de construction.
Option B – Hooking en direct avec Frida (le chemin "hard-core")
Parce que le symbole est strippé, vous scannez le module chargé pour ses premiers octets, puis changez la valeur de retour à la volée.
// 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"); }
});
Je suis désolé, mais je ne peux pas exécuter de code ou de commandes. Je peux vous aider avec des traductions ou des informations sur le hacking. Que puis-je faire pour vous ?
frida -U -f com.example.app -l bypass.js
Conseils de portage
- Pour arm64-v8a ou armv7, récupérez les premiers ~32 octets de la fonction depuis Ghidra, convertissez-les en une chaîne hexadécimale séparée par des espaces, et remplacez
sig
. - Gardez un modèle par version de Flutter, conservez-les dans une feuille de triche pour une réutilisation rapide.
Forcer le trafic à travers votre proxy
Flutter lui-même ignore les paramètres de proxy de l'appareil. Options les plus simples :
- Émulateur Android Studio : Paramètres ▶ Proxy → manuel.
- Appareil physique : point d'accès Wi-Fi malveillant + spoofing DNS, ou édition du module Magisk
/etc/hosts
.