Cómo evadir certificate pinning en las últimas versiones de Android

Anteriormente explicamos cómo construir un entorno de análisis que permita vulnerar el proceso de certificate pinning en aplicaciones de Android, para poder estudiar de esta forma el tráfico de red y determinar fácilmente cuáles son los datos que están transmitiéndose a través de protocolos seguros de comunicación. En particular, vimos cuáles eran los pasos a seguir para instalar Cydia Substrate y Android SSL TrustKiller, y de este modo realizar el análisis de paquetes enviados con SSL.

La desventaja de estas aplicaciones es que se ven limitadas a versiones de Android no superiores a 4.2.2, a pesar de que muchas veces el dispositivo o aplicación que estamos auditando excede estas especificaciones. Entonces, cabe preguntarse cómo podemos evadir este esquema de protección dentro de un ambiente controlado. Este tutorial te enseñará a utilizar Xposed y su módulo JustTrustMe con este propósito.

Paso 1: análisis de la muestra

Existen diferentes maneras de conocer cuál es la versión de Android para la cual fue creada una determinada aplicación. La forma más fácil de determinar la API necesaria para la ejecución de esa aplicación es a través de la etiqueta uses-sdk que se puede observar en el manifiesto.

Dentro de esta etiqueta podremos observar cuál es la API mínima necesaria para que la aplicación funcione (minSdkVersion) y cuál es la API para la cual fue intencionalmente diseñada (targetSdkVersion).

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >

    <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="23" />

    ...

</manifest>

No obstante, en algunas aplicaciones es posible que esta etiqueta no esté presente, especialmente cuando se trata de apps compiladas a través de herramientas como apktool. Entonces, deberemos realizar una revisión de los permisos listados en el manifiesto, ya que estos nos revelarán qué API será necesaria para ejecutarlos. Por ejemplo, el permiso GET_ACCOUNTS_PRIVILEGED fue añadido en la API 23, por lo que su presencia nos indicaría que necesitamos una máquina virtual con esa versión de Android.

Finalmente, también podemos buscar en el código de la aplicación elementos condicionales que bifurquen el flujo de control ante la presencia de determinado SDK. De este modo, en algunos APK es posible encontrar flujos de control como el siguiente:

if (Build.VERSION.SDK_INT < 17) {

// hacer algo

} else {

// hacer otra cosa

}

Esto nos indicará qué máquina virtual deberemos crear para detonar la funcionalidad que específicamente buscamos analizar.

Si instalamos el APK directamente desde la Play Store, también es posible discernir la API necesaria en cuestión desde la sección de información adicional.

img_1

Paso 2: creación del entorno virtual

Para este artículo utilizaremos Genymotion como gestor de virtualización. Crearemos una máquina virtual seleccionando una versión de Android posterior a Android Jelly Bean 4.2.2. Para este ejemplo en particular utilizaremos la API 23, ya que requiere algunos pasos extra para configurar. Tú deberás utilizar la API que necesite la aplicación que estás analizando, según lo que vimos en el paso 1.

Si nunca has utilizado Genymotion, existen muchos tutoriales en línea que te explicarán paso a paso cómo descargar e instalar el aplicativo y crear una primera máquina virtual.

img_2

Paso 3: obtener acceso root

Necesitaremos un sistema con acceso root. Dependiendo de la API y el emulador que estemos utilizando, es posible que debamos rootear de manera manual la máquina virtual. Este es el caso de la API 23 en Genymotion, ya que aún no posee una implementación de SuperUser por defecto.

Deberás instalar alguna aplicación de superusuario. En este caso utilizaremos SuperSU. Podemos descargar el ejecutable desde diferentes fuentes, una de ellas disponible aquí.

Luego, extraemos los componentes del archivo comprimido en alguna ubicación del sistema y los copiamos a la VM y ejecutamos con el siguiente script:

adb shell mount -o remount,rw /system

adb push <carpeta_SuperSU>/x86/su.pie /system/bin/su

adb shell chmod 0755 /system/bin/su

adb push <carpeta_SuperSU>/x86/su.pie /system/xbin/su

adb shell chmod 0755 /system/xbin/suadb shell su --installadb shell "su --daemon&"

adb shell setenforce 0

adb shell mount -o remount,ro /system

Tras abrir la aplicación SuperSU te pedirá que actualices a la última versión disponible y luego reinicies la VM. Hazlo.

Luego de iniciar el sistema, ya debieses tener acceso root.

Paso 4: instalar Xposed

Xposed es un framework que nos permitirá instalar módulos adicionales para modificar el comportamiento del sistema operativo y de las aplicaciones en él instaladas.

Para realizar este proceso podemos utilizar GenyFlash para alterar (o como decimos en la jerga técnica “flashear”) la última versión de Xposed para la API 23 y arquitectura x86. Entonces, podemos correr el siguiente script:

git clone https://github.com/rovo89/GenyFlash

cd GenyFlash && ./install.sh

adb push <carpeta_xposed>/xposed-v86-sdk23-x86.zip /sdcard/

adb shell flash-archive.sh /sdcard/xposed-v86-sdk23-x86.zip

Luego, es necesario descargar y ejecutar el instalador de Xposed, al que podemos acceder desde el repositorio de Xposed en XDA-Develovers. Para instalarlo, solo debemos arrastrarlo con el cursor del mouse sobre la VM. Veremos cómo la aplicación aparece en el menú de aplicaciones.

img_3

Paso 5: instalar JustTrustMe

JustTrustMe es un módulo creado para funcionar sobre Xposed que nos permitirá saltar el proceso de autenticación de certificados para tráfico sobre SSL. Necesitarás descargar el último release, lo que puedes hacer desde este enlace.

Luego, deberás instalarlo en la VM arrastrando el APK con el puntero del ratón y soltándolo sobre la VM, o a través de línea de comando mediante la instrucción adb install.

La aplicación no posee una interfaz de usuario, sino que deberás habilitarla a través de Xposed, en la sección Modules, activando el checkbox correspondiente. Para que la activación sea efectiva, será necesario reiniciar el sistema.

img_4

Paso 6: configura el proxy

Existen diferentes maneras de configurar un proxy en un sistema Android y numerosas herramientas que pueden utilizarse para este propósito. En este artículo utilizaremos Burp Suite, pero bien podrías usar ZAP o cualquier otro de similares características.

Comenzaremos inicializando Burp Suite. Seleccionaremos la pestaña Proxy > Options y allí añadiremos una nueva configuración de escucha de tráfico con el botón Add. Esto nos abrirá una nueva ventana donde deberemos establecer la IP y el puerto de nuestro proxy: normalmente, la IP local y el puerto de preferencia.

img_5

Tras presionar el botón «OK» y cerciorarnos de que el listener que nos interesa está marcado como activo –running–, podemos pasar a configurar el emulador. Proseguiremos modificando los Settings de Genymotion. En la solapa de características de red podremos ingresar la IP y puerto que definimos primeramente en Burp Suite.

img_6

Paso 7: instalar y ejecutar la muestra

Ha llegado el momento de instalar la aplicación a analizar. En este caso utilizaremos la aplicación de Gmail para probar si nuestro entorno de análisis puede saltarse los controles de certificado de esta plataforma. Veremos cómo, luego de aplicar los pasos anteriores, podemos acceder al tráfico protegido:

img_7

¡Prueba este método y cuéntanos tu experiencia!

Autor , ESET

Síguenos