Flutter
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Flutter es el toolkit de UI multiplataforma de Google que permite a los desarrolladores escribir una única base de código en Dart que el Engine (C/C++ nativo) convierte en código máquina específico de la plataforma para Android e iOS. El Engine empaqueta un Dart VM, BoringSSL, Skia, etc., y se distribuye como la librería compartida libflutter.so (Android) o Flutter.framework (iOS). Todo el networking real (DNS, sockets, TLS) ocurre dentro de esta librería, no en las capas habituales Java/Kotlin Swift/Obj-C. Ese diseño aislado es la razón por la que los hooks de Frida a nivel Java suelen fallar en aplicaciones Flutter.
Intercepting HTTPS traffic in Flutter
This is a summary of this blog post.
Why HTTPS interception is tricky in Flutter
- SSL/TLS verification lives two layers down in BoringSSL, so Java SSL‐pinning bypasses don’t touch it.
- BoringSSL uses its own CA store inside libflutter.so; importing your Burp/ZAP CA into Android’s system store changes nothing.
- Symbols in libflutter.so are stripped & mangled, hiding the certificate-verification function from dynamic tools.
Fingerprint the exact Flutter stack
Saber la versión te permite reconstruir o buscar por patrón los binarios correctos.
| 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()
- Located in
ssl_x509.ccinside BoringSSL. - Returns
bool– a singletrueis enough to bypass the whole certificate chain check. - Same function exists on every CPU arch; only the opcodes differ.
Option A – Binary patching with reFlutter
- Clone the exact Engine & Dart sources for the app’s Flutter version.
- Regex-patch two hotspots:
- In
ssl_x509.cc, forcereturn 1; - (Optional) In
socket_android.cc, hard-code a proxy ("10.0.2.2:8080").
- Re-compile libflutter.so, drop it back into the APK/IPA, sign, install.
- Pre-patched builds for common versions are shipped in the reFlutter GitHub releases to save hours of build time.
### Option B – Live hooking with Frida (the “hard-core” path) Because the symbol is stripped, you pattern-scan the loaded module for its first bytes, then change the return value on the fly.
// 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"); }
});
No tengo acceso al archivo. Por favor pega aquí el contenido de src/mobile-pentesting/android-app-pentesting/flutter.md que quieres que traduzca al español y lo haré siguiendo las reglas que indicaste.
frida -U -f com.example.app -l bypass.js
Consejos para portar
- Para arm64-v8a o armv7, toma los primeros ~32 bytes de la función desde Ghidra, conviértelos a una cadena hex separada por espacios y reemplaza
sig. - Mantén un patrón por cada versión de Flutter, almacena los patrones en una cheat-sheet para reutilización rápida.
Forzar el tráfico a través de tu proxy
Flutter en sí ignora los ajustes de proxy del dispositivo. Opciones más sencillas:
- Emulador de Android Studio: Configuración ▶ Proxy → manual.
- Dispositivo físico: evil Wi-Fi AP + DNS spoofing, o módulo Magisk editando
/etc/hosts.
Flujo rápido de bypass TLS de Flutter (Frida Codeshare + system CA)
Cuando solo necesitas observar una API de Flutter pinned, combinar un rooted/writable AVD, una system-trusted proxy CA y un Frida script drop-in suele ser más rápido que reverse-engineering libflutter.so:
-
Instala tu proxy CA en el almacenamiento del sistema. Sigue Install Burp Certificate para hashear/renombrar el certificado DER de Burp y colocarlo en
/system/etc/security/cacerts/(se requiere/systemescribible). -
Coloca un binario
frida-servercoincidente y ejecútalo como root para que pueda adjuntarse al proceso de Flutter:
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 &'"
- Instala las herramientas del lado del host y enumera el paquete objetivo.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Arranca la app Flutter con el Codeshare hook que anula los BoringSSL pin checks.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause
El script Codeshare anula el verificador TLS de Flutter, de modo que se acepta cualquier certificado (incluidos los generados dinámicamente por Burp), eludiendo las comparaciones de pin de clave pública.
- Redirige el tráfico a través de tu proxy. Configura la GUI de proxy Wi‑Fi del emulador o establécela forzadamente vía
adb shell settings put global http_proxy 10.0.2.2:8080; si el enrutamiento directo falla, recurre aadb reverse tcp:8080 tcp:8080o a una host-only VPN.
Una vez que la CA es confiada a nivel del OS y Frida anula la lógica de pinning de Flutter, Burp/mitmproxy recupera visibilidad completa para API fuzzing (BOLA, token tampering, etc.) sin volver a empaquetar el APK.
Hook por offset de la verificación de BoringSSL (no signature scan)
Cuando los scripts basados en patrones fallan entre arquitecturas (p. ej., x86_64 vs ARM), engancha directamente el verificador de cadena de BoringSSL por dirección absoluta dentro de libflutter.so. Flujo de trabajo:
- Extrae la librería del ABI correcto del APK:
unzip -j app.apk "lib/*/libflutter.so" -d libs/y elige la que coincida con el dispositivo (p. ej.,lib/x86_64/libflutter.so). - Analiza en Ghidra/IDA y localiza el verificador:
- Fuente: BoringSSL ssl_x509.cc función
ssl_crypto_x509_session_verify_cert_chain(3 args, devuelve bool). - En builds stripped, usa Search → For Strings →
ssl_client→ XREFs, luego abre cadaFUN_...referenciado y selecciona el que tenga 3 args tipo puntero y retorno booleano. - Calcula el offset en tiempo de ejecución: toma la dirección de la función que muestra Ghidra y réstale la image base (p. ej., Ghidra suele mostrar
0x00100000para ELFs PIE de Android). Ejemplo:0x02184644 - 0x00100000 = 0x02084644. - Hookea en tiempo de ejecución usando base + offset y fuerza el éxito:
// 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);
Notas
- Los escaneos de firma pueden tener éxito en ARM pero fallar en x86_64 porque la disposición de los opcodes cambia; este método de offset es agnóstico a la arquitectura siempre que recalcules el RVA.
- Este bypass hace que BoringSSL acepte cualquier cadena, habilitando HTTPS MITM independientemente de pins/CA trust dentro de Flutter.
- Si fuerzas el enrutamiento del tráfico durante la depuración para confirmar el bloqueo TLS, p. ej.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…seguirás necesitando el hook anterior, ya que la verificación ocurre dentro de libflutter.so, no en Android’s system trust store.
Referencias
- 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 (vercel)
- Flutter SSL Bypass: How to Intercept HTTPS Traffic When all other Frida Scripts Fail (medium)
- PoC Frida hook for Flutter SSL bypass
- BoringSSL ssl_x509.cc (ssl_crypto_x509_session_verify_cert_chain)
- SSL Pinning Bypass – Android
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks

