SSL Pinning bypass con frida.

En este artículo, explicaremos cómo puedes hacer el bypass de SSL pinning, que nos permite interceptar las peticiones de las aplicaciones con burpsuite/caido

Frida es un kit de herramientas open source que nos permite inyectar código de JavaScript en Apps móviles para interceptar las peticiones y su comportamiento en tiempo real. Básicamente nos permite hacerle pentest, o hacerle un análisis dinámico.


Requisitos previos:

  • Android x86 rooteado
  • Burpsuite/caido con el certificado en el android (referencia: https://redfoxsec.com/blog/installing-burp-suites-ca-as-a-system-certificate-on-android)
  • python instalado en la maquina anfitrión
  • adb

    Setup

    Mi setup actual es el siguiente: Android Studio con Pixel 3 y la API 24

Android Studio emulador x86 API 24

Android Studio con emulador Android 7.0 x86 (API 24)


Requisitos para instalar frida

Si tenemos python instalado en el path nos debería salir el siguiente output:

C:\Users\aleja>py --version
Python 3.11.9

luego instalamos las siguientes librerías con pip:

pip install frida
pip install frida-tools
pip install objection

para verificar que frida se instalo, ponemos el siguiente comando(Android tiene que estar vinculado):

# nos saldrán todas las apps que están ejecutándose 
C:\Users\aleja>frida-ps -U
  PID  Name
-----  ----------------------------------------------
 9963  0000-0000
14938  Chrome
16961  Clock
15546  ElJavillo
10215  Google App
10988  Maps
16092  YouTube
 2606  adbd
 9462  audioserver
 9463  cameraserver
 9751  com.android.inputmethod.latin
10281  com.android.launcher3
 9915  com.android.phone

Ahora nos iremos al github de frida, e instalaremos frida-server la version x86: https://github.com/frida/frida/releases/download/17.3.2/frida-server-17.3.2-android-x86.xz Descomprimimos el .xz, cambiamos nombre a frida y pasamos el archivo frida a nuestro android en la ruta /data/local/tmp:

adb push frida /data/local/tmp
frida: 1 file pushed, 0 skipped. 88.7 MB/s (53074896 bytes in 0.571s)

Nos dirigimos al directorio de data y verificamos que existe el archivo frida:

generic_x86:/ # cd /data/local/tmp/
generic_x86:/data/local/tmp # ls -la
total 103704
drwxrwx--x 4 shell shell     4096 2025-10-05 21:42 .
drwxr-x--x 3 root  root      4096 2025-09-26 10:01 ..
drwxr-xr-x 2 shell shell     4096 2025-10-02 08:56 .studio
-rw-rw-rw- 1 shell shell     1330 2025-09-26 10:21 9a5ba575.0
-rwxr-xr-x 1 shell shell 53074896 2025-10-01 19:36 frida

le damos permisos de ejecución:

generic_x86:/data/local/tmp # chmod 755 frida

Ahora vamos al siguiente link: https://codeshare.frida.re/@akabe1/frida-multiple-unpinning y copiamos TODO el contenido, abrimos un notepad lo pegamos y lo guardamos como frida_multiple_unpinning.js

Guardar script de unpinning en archivo JS

Guardando el script frida_multiple_unpinning.js


Burpsuite

activamos el proxy con el puerto 8080 adb shell settings put global http_proxy <IP-Android>:8080

en mi caso seria:

adb shell settings put global http_proxy 10.0.2.2:8080

Instalar nuestra app objetivo

Si tenemos un android rooteado en AndroidStudio, tendremos que tener un Android Puller básicamente seria instalar otro android x86 sin rootear: 1.Create virtual device

Crear dispositivo virtual para Android Puller

Creación de un dispositivo virtual secundario (no rooteado) — Android Puller

2.Imagen del sistema

Selección de imagen de sistema Oreo

Selección de imagen de sistema (Oreo/x86)

Iniciamos sesión en un playstore y descargamos algún app. evitar instalar apps bancarias. Luego de haber instalado, vamos a listar los paquetes con adb shell list packages nos saldrán todos los paquetes de nuestras apps, buscaremos la que instalamos, en este caso fue elJavillo. para una búsqueda mas fácil, podemos buscarlo por su nombre:

adb shell pm list packages | findstr eljavillo

package:comsisfarma.eljavillo con esto vamos a listar todas las rutas de los APK instaladas:

adb shell pm path comsisfarma.eljavillo

nos salen todas las apks

package:/data/app/comsisfarma.eljavillo-1/base.apk
package:/data/app/comsisfarma.eljavillo-1/split_config.en.apk
package:/data/app/comsisfarma.eljavillo-1/split_config.x86.apk
package:/data/app/comsisfarma.eljavillo-1/split_config.xxhdpi.apk

vamos a hacer adb pull para pasarlo a nuestro host anfitrión, para luego pasarlo al android rooteado

adb pull /data/app/comsisfarma.eljavillo-1/base.apk "C:\tu\ruta\base.apk"
adb pull /data/app/comsisfarma.eljavillo-1/split_config.x86.apk "C:\tu\ruta\eljavillo_x86.apk"
adb pull /data/app/comsisfarma.eljavillo-1/split_config.en.apk "C:\tu\ruta\eljavillo_en.apk"
adb pull /data/app/comsisfarma.eljavillo-1/split_config.xxhdpi.apk "C:\tu\ruta\split_config.xxhdpi.apk"

Luego de confirmar que tenemos todos los archivos en nuestro directorio preferido:

APKs extraídos en el host

APKs extraídos en el host para instalación múltiple

en la terminal ponemos:

adb install-multiple eljavillo_base.apk eljavillo_x86.apk eljavillo_xxhdpi.apk eljavillo_en.apk

y verificamos que se instalo en nuestro android rooteado:

App instalada en el emulador rooteado

Aplicación instalada correctamente en el emulador rooteado


Disclaimer:

Esto es una prueba en un entorno controlado, no hay intenciones de vulnerar la aplicación del javillo.


SSL bypass

Luego de haber descargado nuestra aplicación objetivo, vamos a abrir 2 terminales, una con adb dentro de /data/local/tmp

Ejecución de frida en /data/local/tmp

Ejecución del binario frida en el emulador

y la otra en nuestro host donde tengamos nuestro archivo JavaScript para correr el siguiente comando

frida -U -f comsisfarma.eljavillo -l .\frida_multiple_unpinning.js

-f: nombre del paquete de nuestra app. -l: nombre del archivo .js

Salida inicial del hook con frida

Hook inicial con frida y carga del script

esperamos 30s y nos saldrá [+], quiere decir que se hizo el bypass correctamente

Indicador [+] de bypass exitoso

Indicador de bypass exitoso tras la espera

si entramos a nuestro android, podemos confirmar que la app del javillo se abrió correctamente

App abierta tras aplicar el bypass

Aplicación objetivo iniciada correctamente

para que el bypass funcione, tenemos que tener nuestra app objetivo cerrada, el script de frida corriendo, si funciona, frida abrirá la app sola con el bypass.


Interception successfully

en burp/caido ponemos intercept on y si enviamos una petición, vemos que nos sale sin problemas.

Intercepción de peticiones con Burp/Caido

Intercepción activa de tráfico HTTP(S)


Con esto ya tendríamos nuestro entorno en android x86 listo para hacer pentesting/bug bounty.


Cualquier problema:

Contactarme por correo: snoody@toadsec.io


Referencias

https://github.com/frida/frida
https://redfoxsec.com/blog/installing-burp-suites-ca-as-a-system-certificate-on-android
https://codeshare.frida.re/@akabe1/frida-multiple-unpinning.js