Saltearse al contenido

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 Burp
3. 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 Ajustes
4. El tráfico HTTPS pasa por Burp -> ves y modificas las peticiones

En 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).

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.

# Objection: desactiva el pinning con un comando
objection -g com.target.app explore
android sslpinning disable # (o: ios sslpinning disable)
# Frida: scripts universales de bypass
frida -U -f com.target.app -l frida-multiple-unpinning.js --no-pause

Scripts como frida-multiple-unpinning (httptoolkit) cubren las librerías de pinning más comunes (OkHttp, TrustKit, etc.) de una vez.

# Android: descompilar, modificar networkSecurityConfig / quitar el pinning, recompilar, firmar
apktool d app.apk
# editar res/xml/network_security_config.xml para confiar en CAs de usuario
apktool b ; apksigner sign ...
# o inyectar Frida gadget (objection patchapk)
# 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 SSL

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.

  • 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.
  • 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