Deshabilitar las protecciones TLS en aplicativos hechos con Flutter
Las aplicaciones desarrolladas con Flutter/Dart evaden los métodos tradicionales de intercepción de tráfico. Al ignorar el proxy configurado en los ajustes de iOS y descartar las CAs instaladas en el almacenamiento del sistema operativo (User/System), la interceptación mediante Burp Suite falla debido a que las peticiones nunca llegan al proxy. Este documento detalla el procedimiento para forzar el enrutamiento a nivel de Kernel (iptables) en un Gateway intermedio y neutralizar la validación TLS en memoria mediante instrumentación dinámica (Frida).
Just do it - Breve resumen de la solución
0. Requisitos:
- Proxy en modo invisible
- Sistema en modo gateway, un Linux con acceso a iptables (Debian 12 en mi caso)
- Celular iOS
- iPhone 8 - iOS 16.7.11 - Frida 16.5.2
- Script
disable-flutter-tls-verificationdeNVISOsecurity
1. Proxy en modo invisible
Configuras Burp en modo “Invisible proxy” y escuchando en una interfaz
- Proxy => HTTP Proxy => Proxy Settings => Proxy listeners => Interface Edit => Request handling => Support invisible proxying
- La interfaz NO debe ser localhost
2. Sistema en modo gateway
Configurar a tu computadora para que sirva como gateway y realice el reenvio de peticiones
Ver reglas de iptables actuales
sudo iptables -t nat -L PREROUTING -n -v --line-numbers && sudo iptables -t nat -L POSTROUTING -n -v --line-numbers && sudo iptables -L FORWARD -n -v --line-numbersOpción 1: Celular <=> Gateway y proxy (misma computadora)
Variables a configurar
INTERFACE=wlp2s0PROXY_PORT=8888Para crear las reglas
# Redirige el tráfico HTTP y HTTPS que llega a Debian hacia el puerto local de Burp Suitesudo iptables -t nat -A PREROUTING -i $INTERFACE -p tcp --dport 80 -j REDIRECT --to-port $PROXY_PORTsudo iptables -t nat -A PREROUTING -i $INTERFACE -p tcp --dport 443 -j REDIRECT --to-port $PROXY_PORTPara remover las reglas
# Remover: Redirige el tráfico HTTP y HTTPS que llega a Debian hacia el puerto local de Burp Suitesudo iptables -t nat -D PREROUTING -i $INTERFACE -p tcp --dport 80 -j REDIRECT --to-port $PROXY_PORTsudo iptables -t nat -D PREROUTING -i $INTERFACE -p tcp --dport 443 -j REDIRECT --to-port $PROXY_PORTOpción 2: Celular <=> Gateway <=> Proxy
Variables a configurar
INTERFACE=wlp2s0PROXY_IP=10.10.10.5PROXY_PORT=8888Para crear las reglas
# Redirige el tráfico HTTP y HTTPS que llega al Debian hacia el puerto de Burp en Windowssudo iptables -t nat -A PREROUTING -i $INTERFACE -p tcp --dport 80 -j DNAT --to-destination $PROXY_IP:$PROXY_PORTsudo iptables -t nat -A PREROUTING -i $INTERFACE -p tcp --dport 443 -j DNAT --to-destination $PROXY_IP:$PROXY_PORT
# Permite que las respuestas de Windows regresen al iPhone a través de Debiansudo iptables -t nat -A POSTROUTING -o $INTERFACE -d $PROXY_IP -p tcp --dport $PROXY_PORT -j MASQUERADEsudo iptables -A FORWARD -i $INTERFACE -o $INTERFACE -p tcp --dport $PROXY_PORT -j ACCEPTPara remover las reglas
# Remover: Redirige el tráfico HTTP y HTTPS que llega al Debian hacia el puerto de Burp en Windowssudo iptables -t nat -D PREROUTING -i $INTERFACE -p tcp --dport 80 -j DNAT --to-destination $PROXY_IP:$PROXY_PORTsudo iptables -t nat -D PREROUTING -i $INTERFACE -p tcp --dport 443 -j DNAT --to-destination $PROXY_IP:$PROXY_PORT
# Remover Permite que las respuestas de Windows regresen al iPhone a través de Debiansudo iptables -t nat -D POSTROUTING -o $INTERFACE -d $PROXY_IP -p tcp --dport $PROXY_PORT -j MASQUERADEsudo iptables -D FORWARD -i $INTERFACE -o $INTERFACE -p tcp --dport $PROXY_PORT -j ACCEPT3. Configura tu celular conexión WiFi en modo manual
iOS
Seleccionas la red WiFi donde vivan tus dispositivos
- Configure IP => Manual
- IP Address => Una de tu segmento (ej. 10.10.10.222)
- Subnet Mask => La de tu segmento, comunmente 255.255.255.0
- Router => La IP del Linux que va a servir de puente (ej. 10.10.10.3)
- Configure DNS => Manual (Añadir servidor 1.1.1.1 u 8.8.8.8)
Nota: Reconectar dispositivo (Apagar y encender WiFi del celular en caso de que sea necesario)
4. Usar el script disable-flutter-tls-verification de NVISOsecurity
frida -Uf com.app.name -l disable-flutter-tls.jsTeoría y conceptos
¿Qué protecciones implementa Flutter?
No pasa por el proxy del sistema
Dart (el motor runtime de Flutter) no utiliza la pila HTTP/HTTPS nativa del sistema operativo ni respeta la configuración de Settings > Wi-Fi Proxy. Implementa su propio cliente de red escrito en C/C++ utilizando BoringSSL, ignorando cualquier proxy configurado en la interfaz gráfica.
Verificación TLS rígida
Las librerías compiladas de BoringSSL dentro del motor de Flutter (Flutter.framework o el binario ejecutable en iOS) no leen las autoridades de certificación (CAs) del almacenamiento del sistema operativo. La verificación del handshake TLS se ejecuta directamente a nivel nativo en C/C++ mediante funciones internas como ssl_crypto_x509_session_verify_cert o handshake_state.
¿Cómo traspasar estas medidas de seguridad?
- Forzar el enrutamiento (Capa 3/4): Mediante reglas de
iptablesa nivel de Kernel en un Gateway, se interceptan los paquetes salientes TCP (puertos 80 y 443) provenientes del iPhone y se redirigen al socket de Burp Suite (configurado en modo Invisible Proxy), obligando a la aplicación a comunicarse con el proxy aunque lo ignore a nivel de aplicación. - Bypass de la validación TLS (Capa de Aplicación/Memoria): Se utiliza Frida para escanear en la memoria del proceso cargado (específicamente en el motor de Flutter compilado) los patrones de bytes (signatures) de las funciones nativas de verificación de BoringSSL, alterando su valor de retorno en tiempo de ejecución para forzar que la validación devuelva siempre éxito (
true/0x1/ssl_verify_ok).
¿Lo buscabas para Android?
Nota final¡Gracias por terminar de leer este artículo! uwur
— El Capitán
¿Tienes alguna duda o te gustaría comentar algo sobre este artículo?
Puedes encontrarme en: