Introducción

El análisis dinámico de aplicaciones Android se ha convertido en una disciplina esencial para quienes desarrollan o auditan sus propios proyectos móviles. Instrumentar una app en tiempo real permite comprender a fondo cómo se comporta, qué rutas de código intervienen en cada operación y cómo responden nuestros mecanismos defensivos ante diferentes escenarios. Entre las herramientas que facilitan este proceso destacan Frida y Objection.

Para explorar estos conceptos de forma controlada utilizaremos la aplicación Android SSL Pinning Demo de httptoolkit, un proyecto abierto diseñado para experimentar con diversos métodos de certificate pinning. También haremos uso de los scripts publicados por el mismo equipo para analizar el funcionamiento interno de la verificación TLS. Este laboratorio resulta ideal porque ofrece un entorno seguro en el cual es posible probar técnicas de instrumentación sin impactar software de terceros.

En este tipo de análisis existen dos rutas principales para lograr la instrumentación de la aplicación: emplear un dispositivo rooteado o modificar el APK para incluir Frida Gadget, proceso que suele conocerse como Gadget Patching.

La primera aproximación es utilizar un dispositivo rooteado. Instalar Frida directamente en el sistema permite enganchar cualquier proceso que esté en ejecución sin modificar el APK original. Sin embargo, trabajar con un dispositivo rooteado implica aceptar que muchas aplicaciones cambian su comportamiento al detectar estos privilegios, lo cual puede distorsionar los resultados del análisis. Además, no es un entorno representativo del usuario real y requiere dedicar un dispositivo exclusivamente al laboratorio por los riesgos que el root introduce en la seguridad del propio terminal.

La segunda opción es el Gadget Patching, que consiste en modificar la aplicación de laboratorio para añadir en su interior la biblioteca de Frida, de modo que sea la propia app la que cargue este componente cuando se inicia. Una vez recompuesta y firmada, la aplicación puede instalarse en un dispositivo completamente normal, sin privilegios adicionales. Al ejecutarse, el Gadget queda a la espera de que el analista se conecte desde su ordenador con las herramientas de Frida, comportándose al igual que si no estuviera modificada. Tomaremos este segundo camino.

Como precondiciones para el despliegue del proyectos tendremos un dispositivo Android conectado mediante la herramienta de depuración ADB a nuestro ordenador.

Instalación de las herramientas

Al utilizar las herramientas que vamos a utilizar el lenguaje de programación Python, crearemos un nuevo entorno virtual para la instalación de ellas.

$ python -m venv gadget_venv
$ . gadget_venv/bin/activate

Instalamos las herramientas: frida, frida-tools y objection.

$ pip install frida frida-tools objection

Clonamos el repositorio con los scripts de Frida que vamos vamos a utilizar y descargamos la aplicación de muestra Android SSL Pinning Demo.

$ git clone https://github.com/httptoolkit/frida-interception-and-unpinning
$ wget https://github.com/httptoolkit/android-ssl-pinning-demo/releases/download/v1.6.1/pinning-demo.apk

A continuación necesitamos instalar las dependencias necesarias para poder parchear la aplicación: las herramientas aapt, adb, jarsigner, apksigner, zipalign y apktool.

$ sudo apt install aapt adb default-jdk apksigner zipalign apktool

A continuación actualizaremos la versión de apktool utilizada, ya que la existente en los repositorios es muy antigua para desempaquetar y empaquetas nuevas versiones de aplicaciones de Android.

$ wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
$ chmod +x apktool
$ wget https://github.com/iBotPeaches/Apktool/releases/download/v2.12.1/apktool_2.12.1.jar
$ export PATH=$PWD:$PATH

Inyección del gadget de Frida en la aplicación

Antes de poder utilizar cualquier comando de Objection sobre una aplicación Android, es necesario modificar su APK y volver a firmarlo para que cargue el archivo frida-gadget.so al iniciarse. En la práctica, el proceso de parcheo del APK suele reducirse simplemente a ejecutar el comando objection patchapk. Especificaremos como parámetro -s el archivo fuente a parchear. También aportamos la arquitectura del procesador del dispositivo donde se va a instalar la aplicación, en este caso arm64-v8a Tenemos más opciones de configuración en caso de que el parcheo falle, que puede ocurrir en algunos casos.

$ objection patchapk -s pinning-demo.apk -a arm64-v8a
Using latest Github gadget version: 17.5.1
Remote FridaGadget version is v17.5.1, local is v0. Downloading...
Downloading arm64-v8a library to /home/r/.objection/android/arm64-v8a/libfrida-gadget.so.xz...
Patcher will be using Gadget version: 17.5.1
App already has android.permission.INTERNET
Target class not specified, searching for launchable activity instead...
Injecting loadLibrary call at line: 66
Copying Frida gadget to libs path...
Rebuilding the APK with the frida-gadget loaded...
Built new APK with injected loadLibrary and frida-gadget
Zipalign completed
Signed the new APK

Si el proceso se ha realizado correctamente, se habrá generado el archivo .apk pinning-demo.objection.apk. Lo instalaremos en el dispositivo móvil utilizando adb.

$ adb install pinning-demo.objection.apk

Configuración de los scripts de Frida

Este script necesita la modificación de su configuración desde el archivo config.js. Los scripts se encuentran dentro de la carpeta frida-interception-and-unpinning. Modificaremos las variables CERT_PEM con el certificado en formato PEM, PROXY_PORT con el puerto del proxy web (puerto 8889), y PROXY_HOST con la dirección IP localhost. Es recomendable utilizar un proxy de tipo SOCKS y la opción PROXY_SUPPORTS_SOCKS5 para poder abarcar muchos más casos de TLS Pinning con interceptaciones con código nativo.

// Local testing certificate for now
const CERT_PEM = `-----BEGIN CERTIFICATE-----
MIIFLjCCBB...
-----END CERTIFICATE-----`;

if (CERT_PEM.includes("Put your CA certificate data here")) {
    throw new Error('No certificate was provided' +
        '\n\n' +
        'You need to set CERT_PEM in the Frida config script ' +
        'to the contents of your CA certificate.'
    );
}

// Default emulator address for now:
const PROXY_HOST = '192.168.0.2';
const PROXY_PORT = 8889;
...
const PROXY_SUPPORTS_SOCKS5 = true;

Ejecución de la aplicación y de la instrumentación

Tras la configuración, ejecutaremos la aplicación en el dispositivo móvil. El framework de Frida se habrá cargado si la aplicación se bloquea en la pantalla de inicio. A continuación buscaremos con la aplicación frida-ps el identificador de proceso de la aplicación que hemos ejecutado.

$ frida-ps -U | findstr SSL
27517  SSL Pinning Demo

Observamos que el PID es 27517, por lo que ejecutamos frida junto con los scripts.

$ frida -U -l ./frida-interception-and-unpinning/config.js -l ./frida-interception-and-unpinning/native-connect-hook.js -l ./frida-interception-and-unpinning/native-tls-hook.js -l ./frida-interception-and-unpinning/android/android-certificate-unpinning.js -l ./frida-interception-and-unpinning/android/android-certificate-unpinning-fallback.js -l ./frida-interception-and-unpinning/android/android-disable-root-detection.js -l ./frida-interception-and-unpinning/android/android-proxy-override.js -l ./frida-interception-and-unpinning/android/android-system-certificate-injection.js -p 27517
     ____
    / _  |   Frida 17.5.1 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
   . . . .
Attaching...

== Redirecting all TCP connections ==
== Hooked native TLS lib libssl.so ==
== Certificate unpinning completed ==
== Unpinning fallback auto-patcher installed ==

La aplicación se desplegará y será posible monitorizar todas las conexiones de red con un proxy si que la aplicación falle debido a las técnicas de SSL y TLS Pinning.

Conclusión

En definitiva, el uso combinado de Frida, Objection y técnicas como el Gadget Patching ofrece un entorno de análisis dinámico potente y realista para estudiar nuestras propias aplicaciones Android.