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

Το Flutter είναι η εργαλειοθήκη UI πολλαπλών πλατφορμών της Google που επιτρέπει στους προγραμματιστές να γράφουν μια ενιαία βάση κώδικα Dart την οποία το Engine (native C/C++) μετατρέπει σε κώδικα μηχανής ειδικό για πλατφόρμα σε Android & iOS. Το Engine πακετάρει ένα Dart VM, BoringSSL, Skia κ.λπ. και διανέμεται ως η κοινόχρηστη βιβλιοθήκη libflutter.so (Android) ή Flutter.framework (iOS). Όλη η πραγματική δικτύωση (DNS, sockets, TLS) συμβαίνει μέσα σε αυτή τη βιβλιοθήκη, όχι στα συνήθη επίπεδα Java/Kotlin Swift/Obj-C. Αυτή η απομονωμένη σχεδίαση είναι ο λόγος που τα συνήθη Java-level Frida hooks αποτυγχάνουν σε Flutter apps.

Υποκλοπή HTTPS κίνησης σε Flutter

Αυτή είναι μια σύνοψη αυτού του blog post.

Γιατί η υποκλοπή HTTPS είναι περίπλοκη στο Flutter

  • Η επαλήθευση SSL/TLS βρίσκεται δύο επίπεδα πιο κάτω στο BoringSSL, οπότε τα Java SSL‐pinning bypasses δεν το επηρεάζουν.
  • Το BoringSSL χρησιμοποιεί το δικό του CA store μέσα στο libflutter.so· η εισαγωγή του Burp/ZAP CA στο system store του Android δεν αλλάζει τίποτα.
  • Τα σύμβολα στο libflutter.so είναι αφαιρεμένα & αλλοιωμένα, κρύβοντας τη συνάρτηση επαλήθευσης πιστοποιητικών από τα δυναμικά εργαλεία.

Προσδιορισμός του ακριβούς Flutter stack

Η γνώση της έκδοσης σας επιτρέπει να επαναχτίσετε ή να κάνετε pattern-match στα σωστά binaries.

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.
  • Returns bool – a single true is enough to bypass the whole certificate chain check.
  • Same function exists on every CPU arch; only the opcodes differ.

Επιλογή A – Binary patching with reFlutter

  1. Clone τα ακριβή sources του Engine & Dart για την έκδοση Flutter της εφαρμογής.
  2. Regex-patch δύο hotspots:
  • Στο ssl_x509.cc, αναγκάστε return 1;
  • (Προαιρετικό) Στο socket_android.cc, κάντε hard-code έναν proxy ("10.0.2.2:8080").
  1. Re-compile το libflutter.so, αντικαταστήστε το στο APK/IPA, κάντε sign, εγκαταστήστε.
  2. Pre-patched builds για κοινές εκδόσεις παρέχονται στα GitHub releases του reFlutter για να εξοικονομήσετε ώρες χρόνου build.

Επιλογή B – Live hooking with Frida (the “hard-core” path)

Επειδή το σύμβολο είναι 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"); }
});

Please paste the content of src/mobile-pentesting/android-app-pentesting/flutter.md that you want translated to Greek.

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

Συμβουλές μεταφοράς

  • Για arm64-v8a ή armv7, πάρε τα πρώτα ~32 bytes της συνάρτησης από το Ghidra, μετέτρεψέ τα σε ένα space-separated hex string και αντικατέστησε το sig.
  • Κράτησε ένα pattern ανά έκδοση του Flutter, αποθήκευσέ τα σε ένα cheat-sheet για γρήγορη επαναχρησιμοποίηση.

Εξαναγκασμός κίνησης μέσω του proxy σας

Το Flutter από μόνο του αγνοεί τις ρυθμίσεις proxy της συσκευής. Πιο εύκολες επιλογές:

  • Android Studio emulator: Settings ▶ Proxy → manual.
  • Physical device: evil Wi-Fi AP + DNS spoofing, or Magisk module editing /etc/hosts.

Γρήγορη ροή εργασίας για bypass του Flutter TLS (Frida Codeshare + system CA)

Όταν χρειάζεσαι μόνο να παρατηρήσεις ένα pinned Flutter API, ο συνδυασμός ενός rooted/writable AVD, ενός system-trusted proxy CA, και ενός drop-in Frida script είναι συχνά ταχύτερος από το reverse-engineering του libflutter.so:

  1. Install your proxy CA in the system store. Ακολούθησε το Install Burp Certificate για να κάνεις hash/rename το Burp’s DER certificate και να το προωθήσεις στο /system/etc/security/cacerts/ (απαιτείται writable /system).

  2. Drop a matching frida-server binary 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 &'"
  1. Εγκαταστήστε το host-side tooling και κάντε enumerate το target package.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
  1. Εκκινήστε την εφαρμογή Flutter με το Codeshare hook που απενεργοποιεί τους ελέγχους pin του BoringSSL.
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. Route traffic through your proxy. Configure the emulator Wi-Fi proxy GUI or enforce it via adb shell settings put global http_proxy 10.0.2.2:8080; if direct routing fails, fall back to adb reverse tcp:8080 tcp:8080 or a host-only VPN.

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.

Offset-based hook of BoringSSL verification (no signature scan)

Όταν τα pattern-based scripts αποτύχουν ανάμεσα σε αρχιτεκτονικές (π.χ. x86_64 vs ARM), κάντε άμεσο hook στον BoringSSL chain verifier με απόλυτη διεύθυνση μέσα στο libflutter.so. Workflow:

  • Εξάγετε τη βιβλιοθήκη με το σωστό 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, χρησιμοποιήστε Search → For Strings → ssl_client → XREFs, μετά ανοίξτε κάθε αναφερόμενη FUN_... και επιλέξτε αυτή με 3 pointer-like args και boolean return.
  • Υπολογίστε το runtime offset: πάρτε τη διεύθυνση της συνάρτησης που δείχνει το Ghidra και αφαιρέστε το image base (π.χ., Ghidra συχνά δείχνει 0x00100000 για PIE Android ELFs). Παράδειγμα: 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);

Σημειώσεις

  • Οι Signature scans μπορούν να πετύχουν σε ARM αλλά να αποτύχουν σε x86_64 επειδή η διάταξη των opcode αλλάζει· αυτή η offset μέθοδος είναι architecture-agnostic αρκεί να επανυπολογίσετε το RVA.
  • Αυτό το bypass κάνει το BoringSSL να αποδέχεται οποιαδήποτε chain, επιτρέποντας HTTPS MITM ανεξαρτήτως των pins/CA trust μέσα στο Flutter.
  • Εάν force-route την κίνηση κατά τη διάρκεια του debugging για να επιβεβαιώσετε το TLS blocking, π.χ.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>

…θα εξακολουθείς να χρειάζεσαι το hook παραπάνω, καθώς η επαλήθευση γίνεται μέσα στο libflutter.so, όχι στο system trust store του 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