SSL pinning y bypass
Para auditar una app móvil necesitas ver su tráfico con el backend: ahí viven la API, los tokens y la lógica real. Lo normal es poner un proxy (Burp) entre la app y el servidor. Pero muchas apps implementan SSL/certificate pinning: solo confían en un certificado concreto, rechazando el de tu proxy aunque instales su CA. Saltarse el pinning es un paso casi obligatorio del pentest móvil para poder interceptar y manipular el tráfico.
Interceptar tráfico (lo básico, sin pinning)
Sección titulada «Interceptar tráfico (lo básico, sin pinning)»1. Configurar Burp/ZAP como proxy (IP del equipo:8080)2. En el dispositivo: WiFi -> proxy manual apuntando a Burp3. Instalar la CA de Burp como confiable # Android 7+: las apps NO confían en CAs de usuario por defecto # -> instalar como CA de sistema (root) o usar networkSecurityConfig de la app # iOS: instalar el perfil de la CA y confiar en Ajustes4. El tráfico HTTPS pasa por Burp -> ves y modificas las peticionesEn Android 7+, aunque instales la CA, las apps solo confían en CAs de sistema por defecto → necesitas root (CA de sistema) o modificar el networkSecurityConfig de la app (repackaging).
Qué es el pinning y por qué bloquea
Sección titulada «Qué es el pinning y por qué bloquea»El pinning “fija” en la app el certificado (o su hash/clave pública) del servidor legítimo. Al conectar, la app compara el certificado presentado con el fijado; si no coincide (como el de tu proxy), corta la conexión. Protege contra MITM, pero no es insalvable en un dispositivo que controlas.
Bypass de SSL pinning
Sección titulada «Bypass de SSL pinning»Objection / Frida (lo más rápido)
Sección titulada «Objection / Frida (lo más rápido)»# Objection: desactiva el pinning con un comandoobjection -g com.target.app exploreandroid sslpinning disable # (o: ios sslpinning disable)# Frida: scripts universales de bypassfrida -U -f com.target.app -l frida-multiple-unpinning.js --no-pauseScripts como frida-multiple-unpinning (httptoolkit) cubren las librerías de pinning más comunes (OkHttp, TrustKit, etc.) de una vez.
Repackaging (sin root/Frida en runtime)
Sección titulada «Repackaging (sin root/Frida en runtime)»# Android: descompilar, modificar networkSecurityConfig / quitar el pinning, recompilar, firmarapktool d app.apk# editar res/xml/network_security_config.xml para confiar en CAs de usuarioapktool b ; apksigner sign ...# o inyectar Frida gadget (objection patchapk)Otros enfoques
Sección titulada «Otros enfoques»# reemplazar la lógica de validación con Frida a medida (hookear el verificador)# para pinning nativo (en .so): hookear funciones de la librería SSLTras saltar el pinning
Sección titulada «Tras saltar el pinning»Con el tráfico visible en Burp, la app se convierte en un cliente más de su API → aplica toda la sección Web (auth, IDOR/BOLA, inyección, lógica de negocio, API Top 10). El backend es el verdadero objetivo.
Para la defensa
Sección titulada «Para la defensa»- El pinning es defensa en profundidad, no absoluta: un atacante con el dispositivo lo salta con Frida. Útil contra MITM de red, no contra un analista decidido.
- La seguridad real está en el backend: autenticación, autorización y validación por servidor; no confiar en el cliente.
- Combinar con RESILIENCE (detección de Frida/instrumentación, integridad) para encarecer el bypass.
- Usar pinning de clave pública (no del certificado concreto) para no romper rotaciones; planificar su actualización.
Checklist de prueba
Sección titulada «Checklist de prueba»- Configurar proxy (Burp) + CA en el dispositivo
- Android 7+: CA de sistema (root) o networkSecurityConfig
- ¿La app hace pinning? (la conexión falla con el proxy)
- Bypass con Objection (sslpinning disable)
- Bypass con script Frida universal (multiple-unpinning)
- Repackaging si Frida no es viable
- Tráfico visible → auditar la API (sección Web)
- Documentar tokens/endpoints/flujos capturados