Bypass de Certificate Pinning

Las auditorías Android muchas veces son un quebradero de cabeza ya que la mayoría de las veces el cliente nos proporciona un fichero .apk con validación de certificados o SSL Pinning, de forma que no somos capaces de capturar las peticiones HTTPS. Son muchas las formas de saltarse el SSL Pinning pero la más efectiva, al menos para mí, es utilizar Frida y Objection como veremos en este artículo.

CERTIFICATE PINNING

Certificate Pinning es una funcionalidad implementada en aplicaciones móviles que proporcionan una capa extra de seguridad y que consiste en verificar que el servidor al que se está conectando la aplicación es el esperado, el sitio legítimo. Para llevar a cabo este proceso cuando se ejecute la aplicación, se compara el Certificado presentado por el servidor legítimo (certificado X509 o la clave pública) con el Certificado distribuido con la aplicación, que tendría que ser el mismo. Una vez comparados y verificados, se permite la comunicación. Para entenderlo un poco mejor, hemos creado este pequeño esquema:

Los pasos numerados se detallan a continuación:

  1. El cliente intenta establecer una comunicación cifrada SSL, comprobando la veracidad de la cadena de confianza del Certificado del servidor y que el nombre de host solicitado coincide con el del Certificado.
  2. Una vez realizada la primera comprobación, el servidor presenta su Certificado (x509).
  3. La aplicación verifica que el Certificado presentado por el servidor coincide con el Certificado distribuido con la aplicación.
  4. Si la validación del Certificado es correcta, se permite la comunicación entre cliente y servidor. Si la validación es incorrecta, no se permitirá la comunicación entre cliente y servidor, mostrándose un mensaje de error.

Muchas veces durante una auditoría de seguridad de un APK de Android no somos capaces de capturar el tráfico utilizando un proxy intermedio y es debido a esta técnica. En resumen, fijar un certificado significa que su aplicación está verificando que el sitio con el que se está comunicando la aplicación es el sitio real comparando el certificado presentado por el sitio con uno incluido en la aplicación.

Tipos de implementación de Certificate Pinning

Son varios los métodos que implementan las aplicaciones para poder llevar a cabo este control de seguridad, cada cual con su correspondiente complejidad:

  • SHA256 del certificado: se compara el hash del certificado con el hash embebido en la aplicación.
  • Certificado en la aplicación: se compara el certificado del servidor con el certificado embebido en la aplicación.
  • Listado de CAs permitidas: se verifica que la CA que ha emitido el certificado se encuentra en el listado embebido en la aplicación.
  • Ficheros de configuración con variables: se verifica el valor de una variable, ya sea en una clase o en un fichero XML. En este ejemplo se identificó una clase con una variable booleana para habilitar la verificación del certificado:

En este caso se editaría la clase .smali que contiene el código y se modificaría el valor de la variable para deshablitar el SSL Pinning, compilando, firmando e instalando de nuevo el .apk .

A continuación vamos a ver otro método para poder evadir el SSL Pinning y poder capturar el tráfico HTTPS de la aplicación, haciendo uso de dos herramientas como son Frida y Objection.

Frida y Objection

Frida es un framework que permite inyectar código o librerías propias en aplicaciones nativas con el objetivo de modificar su comportamiento o funcionalidad.

Objection es un conjunto de herramientas específicas para aplicaciones móviles, que se ejecutan en tiempo de ejecución y que permiten interactuar con el sistema de ficheros, interactuar con bases de datos, listar clases y métodos utilizados, etc… . Fue impulsado por Frida.

Métodos de instalación

La instalación de FRIDA (https://www.frida.re/docs/home/) la llevaremos a cabo a través del administrador de paquetes de Python pip utilizado en el comando pip install frida-tools :

Posteriormente, realizaremos la instalación de OBJECTION (https://github.com/sensepost/objection) utilizando el mismo administrador de paquetes pero de Python3, con el comando pip3 install objection :

Para poder hacer uso de estas herramientas, es necesario tener instalado en el móvil el servidor de Frida, tenerlo arrancado y posteriormente utilizar Objection para hacer hooking de las librerías de SSL (TrustManager, etc..). A través del comando frida –version veremos la versión de Frida que se ha instalado:

Deberemos descargarnos para este ejemplo la versión 12.2.8 del servidor de Frida para la arquitectura ARM de Android de la siguiente página https://github.com/frida/frida/releases ya que haremos las pruebas con un Nexus 4 :

 

Con el servidor descargado, procedemos a subirlo al dispositivo móvil a través de adb con el comando adb push <fichero> <ruta> , establecer los permisos correspondientes al servidor de Frida para poder arrancarlo con el comando adb shell “chmod 755 <ruta>” y arrancarlo con el comando adb shell “<ruta>” :

Ya tenemos el servidor de Frida en el móvil, veámos el siguiente paso.

Haciendo Bypass del Certificate Pinning

Para poder ejecutar Objection tendremos que identificar cual es el proceso de la aplicación, lo que conseguiremos con el comando frida-ps -U :

  1.  Ejecutamos frida-ps -U para ver los procesos activos del móvil.
  2.  Abrimos la aplicación en el dispositivo móvil.
  3.  Volvemos a ejecutar frida-ps -U e identificamos el nuevo proceso, que se corresponderá con la aplicación abierta.

En la siguiente imagen, tras hacer los procesos descritos, identificamos nuestra aplicación:

En este punto ya tenemos nuestro servidor Frida corriendo en el dispositivo y el proceso de nuestra aplicación identificado. Sólo falta arrancar Objection e indicarle el proceso sobre el que queremos hookear con el comando objection –gadget <proceso> explore :

Lo que nos ha aparecido es un mensaje de error indicando que Objection no ha podido encontrar el proceso indicado, y ¿por qué?. Pues porque se nos había cerrado la aplicación a la hora de ejecutarlo y es necesario que la aplicación se encuentre corriendo en el dispositivo. Volvemos a abrir la aplicación y a ejecutar Objection:

Ahroa sí, Objection ha encontrado el proceso y nos muestra su interfaz. A medida que vayamos escribiendo, se nos mostrará una especie de ayuda autocompletada para llevar a cbo todo tipo de comandos y tareas. Nuestro objetivo aquí es ejecutar el comando android sslpining disable para hookear las librerías de SSL implementadas y deshabilitar así la validación del certificado:

Al abrir nuestro proxy web al que hemos enrutado el tráfico de la aplicación, observamos que ya se captura el tráfico HTTPS:

De esta forma, evitariamos tener que perder el tiempo buscando la manera de saltarse esta validacion o tener que solicitar de nuevo la aplicacion sin esta funcionalidad.

Espero que os haya gustado.

“Don’t give up, great things take time.”

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *