Flutter
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Flutter είναι η διαπλατφορμική εργαλειοθήκη UI της Google που επιτρέπει στους προγραμματιστές να γράψουν μία ενιαία βάση κώδικα Dart την οποία το Engine (native C/C++) μετατρέπει σε platform-specific machine code για Android & iOS. Το Engine πακετάρει ένα Dart VM, BoringSSL, Skia, κ.λπ., και διανέμεται ως η shared library libflutter.so (Android) ή Flutter.framework (iOS). Όλα τα πραγματικά networking (DNS, sockets, TLS) συμβαίνουν μέσα σε αυτή τη βιβλιοθήκη, όχι στα συνηθισμένα Java/Kotlin Swift/Obj-C layers. Αυτή η απομονωμένη σχεδίαση είναι ο λόγος που τα συνήθη Java-level Frida hooks αποτυγχάνουν σε Flutter apps.
Intercepting HTTPS traffic in Flutter
Αυτό είναι μια σύνοψη αυτού του blog post.
Why HTTPS interception is tricky in Flutter
- Η επαλήθευση SSL/TLS βρίσκεται δύο στρώματα πιο κάτω στο BoringSSL, οπότε οι Java SSL-pinning bypasses δεν τον αγγίζουν.
- Το BoringSSL χρησιμοποιεί το δικό του CA store μέσα στο libflutter.so· η εισαγωγή του Burp/ZAP CA στο Android’s system store δεν αλλάζει τίποτα.
- Οι symbols στο libflutter.so είναι stripped & mangled, κρύβοντας τη certificate-verification function από τα dynamic εργαλεία.
Fingerprint the exact Flutter stack
Η γνώση της έκδοσης σoυ επιτρέπει να ξαναχτίσεις ή να κάνεις pattern-match τα σωστά binaries.
| 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()
- Βρίσκεται στο
ssl_x509.ccμέσα στο BoringSSL. - Επιστρέφει
bool– ένα μόνοtrueαρκεί για να παρακάμψει όλο τον έλεγχο της αλυσίδας πιστοποιητικών. - Η ίδια function υπάρχει σε κάθε CPU αρχιτεκτονική; μόνο τα opcodes διαφέρουν.
Option A – Binary patching with reFlutter
- Κάνε clone των ακριβών πηγών Engine & Dart για την έκδοση Flutter της εφαρμογής.
- Κάνε regex-patch σε δύο hotspots:
- Στο
ssl_x509.cc, εξαναγκάστεreturn 1; - (Προαιρετικό) Στο
socket_android.cc, κωδικοποίησε σκληρά έναν proxy ("10.0.2.2:8080").
- Κάνε re-compile το libflutter.so, βάλε το πάλι στο APK/IPA, κάνε sign, εγκατάστησε.
- Pre-patched builds για κοινές εκδόσεις περιλαμβάνονται στα reFlutter GitHub releases για να γλυτώσεις ώρες χρόνου build.
### Option B – Live hooking with Frida (the “hard-core” path) Επειδή το symbol είναι stripped, κάνεις pattern-scan στο φορτωμένο module για τα πρώτα του bytes, και μετά αλλάζεις την τιμή επιστροφής εν κινήσει.
// 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"); }
});
Δεν παρείχες το περιεχόμενο. Παρακαλώ επικόλλησε εδώ το περιεχόμενο του αρχείου src/mobile-pentesting/android-app-pentesting/flutter.md που θέλεις να μεταφράσω στα ελληνικά.
frida -U -f com.example.app -l bypass.js
Συμβουλές μεταφοράς
- Για arm64-v8a ή armv7, πάρε τα πρώτα ~32 bytes της συνάρτησης από την Ghidra, μετέτρεψε τα σε hex string διαχωρισμένο με κενά, και αντικατέστησε το
sig. - Διατήρησε ένα pattern ανά έκδοση Flutter, αποθήκευσέ τα σε ένα cheat-sheet για γρήγορη επαναχρησιμοποίηση.
Ανακατεύθυνση κίνησης μέσω του proxy σου
Το Flutter από μόνο του αγνοεί τις ρυθμίσεις proxy της συσκευής. Πιο απλές επιλογές:
- Android Studio emulator: Settings ▶ Proxy → manual.
- Φυσική συσκευή: evil Wi-Fi AP + DNS spoofing, ή Magisk module που επεξεργάζεται το
/etc/hosts.
Γρήγορη ροή εργασίας bypass TLS για Flutter (Frida Codeshare + system CA)
Όταν χρειάζεσαι μόνο να παρατηρήσεις ένα pinned Flutter API, ο συνδυασμός ενός rooted/writable AVD, ενός system-trusted proxy CA, και ενός drop-in Frida script είναι συχνά πιο γρήγορος από το reverse-engineering του libflutter.so:
-
Install your proxy CA in the system store. Ακολούθησε Install Burp Certificate για να hash/rename το DER certificate του Burp και να το pushάρεις στο
/system/etc/security/cacerts/(απαιτείται writable/system). -
Drop a matching
frida-serverbinary and run it as root so it can attach to the Flutter process:
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 και πραγματοποιήστε enumerate του target package.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Εκκινήστε την εφαρμογή Flutter με το Codeshare hook που απενεργοποιεί τους BoringSSL pin checks.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause
Το script Codeshare αντικαθιστά τον Flutter TLS verifier, έτσι ώστε κάθε πιστοποιητικό (συμπεριλαμβανομένων των δυναμικά δημιουργούμενων από το Burp) να γίνεται αποδεκτό, παρακάμπτοντας τις public-key pin comparisons.
- Δρομολόγησε την κίνηση μέσω του proxy σου. Διαμόρφωσε το GUI του Wi-Fi proxy του emulator ή επέβαλε τη ρύθμιση μέσω
adb shell settings put global http_proxy 10.0.2.2:8080; αν η άμεση δρομολόγηση αποτύχει, πέσε πίσω στοadb reverse tcp:8080 tcp:8080ή σε host-only VPN.
Μόλις η CA εμπιστευτεί στο επίπεδο του OS και το Frida εξουδετερώσει τη λογική pinning του Flutter, το Burp/mitmproxy ανακτά πλήρη ορατότητα για API fuzzing (BOLA, token tampering, κ.λπ.) χωρίς repacking του APK.
Offset-based hook της επαλήθευσης BoringSSL (no signature scan)
Όταν τα pattern-based scripts αποτυγχάνουν μεταξύ αρχιτεκτονικών (π.χ. x86_64 vs ARM), κάνε άμεσο hook στον BoringSSL chain verifier με απόλυτη διεύθυνση μέσα στο libflutter.so. Ροή εργασίας:
- Εξάγαγε τη βιβλιοθήκη με το σωστό ABI από το APK:
unzip -j app.apk "lib/*/libflutter.so" -d libs/και επίλεξε αυτή που ταιριάζει με τη συσκευή (π.χ.,lib/x86_64/libflutter.so). - Ανάλυσε στο Ghidra/IDA και εντόπισε τον verifier:
- Πηγή: BoringSSL ssl_x509.cc function
ssl_crypto_x509_session_verify_cert_chain(3 args, returns bool). - Σε stripped builds, αναζήτησε το string
"ssl_client"και εξέτασε τα XREFs; εντόπισε τη συνάρτηση που παίρνει τρία ορίσματα τύπου pointer και επιστρέφει boolean. - Υπολόγισε το runtime offset: πάρε τη διεύθυνση της συνάρτησης που δείχνει το Ghidra και αφαίρεσε το image base που χρησιμοποιήθηκε κατά την ανάλυση για να πάρεις το relative offset (RVA). Παράδειγμα:
0x02184644 - 0x00100000 = 0x02084644. - Κάνε hook κατά το runtime με base + offset και ανάγκασε την επιτυχία:
// 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);
Σημειώσεις
- Επαναϋπολογίστε το offset για κάθε target build και CPU αρχιτεκτονική· οι διαφορές στον compiler/codegen σπάνε hardcoded signatures.
- Αυτό το bypass προκαλεί το BoringSSL να αποδέχεται οποιαδήποτε chain, επιτρέποντας HTTPS MITM ανεξαρτήτως των pins/CA trust μέσα στο Flutter.
- Αν ανακατευθύνετε (force-route) την κίνηση κατά το debugging για να επιβεβαιώσετε το μπλοκάρισμα του TLS, π.χ.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…θα χρειαστείτε ακόμα το hook παραπάνω, αφού η επαλήθευση γίνεται μέσα στο libflutter.so και όχι στο αποθετήριο εμπιστοσύνης του συστήματος του Android.
Αναφορές
- 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
- BoringSSL ssl_x509.cc (ssl_crypto_x509_session_verify_cert_chain)
- SSL Pinning Bypass – Android
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks

