Análisis forenseAndroidPentestingReversing

Frida en Android – Introducción

Buenas conejetes!!

Hoy vamos a hablar de Frida, pero no de la magnífica pintora mexicana del siglo XX, sino de la potente herramienta utilizada para realizar pestesting de aplicaciones móviles que nos permite modificar dinámicamente el código de la aplicación y así alterar a nuestro gusto su flujo de ejecución.
 

Un poco de teoría e historia

Tal y como se cuenta en la historia de su página web, Frida fue creada por Ole André V. Ravnås (@oleavr) tras la necesidad de convertir en algo más divertido, productivo e interactivo, la ardua tarea de realizar ingeniería reversa manual a las aplicaciones.

El conjunto de herramientas que nos ofrece Frida tiene 4 características que lo han marcado como referente:

  • Programable: es posible inyectar scripts propios para realizar procesos de caja negra, hookear cualquier función, espiar APIs criptográficas o rastrear el código de aplicación sin necesidad de tener el código fuente. Se puede editar, guardar y ver los resultados al instante, sin compilaciones o reinicios.
  • Portable: puede inyectarse en procesos de ejecución de Windows, MacOS, GNU/Linux, iOS, Android, y QNX. Permite además la interacción con Node.js, Python, Swift, .Net, Qt/Qml y C.
  • Gratuita: ha sido desarrollada como software libre para su propia retroalimentación.
  • Confiable: tiene el respaldo de importantes empresas, y una suite de pruebas completa.

 

Instalación

Es importante tener en cuenta que Frida funciona bajo un modelo cliente-servidor, actuando como cliente nuestro equipo, y como servidor nuestro dispositivo móvil (a priori) rooteado o nuestro emulador.

Si bien existen gran cantidad de distros específicas con Frida instalada para análisis de Malware, reversing, y análisis de aplicaciones (como puede ser Androl4b), vamos a mostrar en unos sencillos pasos como instalar el cliente en nuestra máquina de trabajo.

Antes de nada, debemos asegurarnos de que tenemos la última versión de Python actualizada.

La manera más sencilla es gracias a PIP, por lo que podemos realizar la instalación con el siguiente comando:

pip install frida-tools

 

También podemos optar por utilizar directamente los binarios de Frida colgados en GitHub.

Una vez tenemos el cliente instalado en nuestro equipo, nos toca instalar el servidor en el dispositivo móvil/emulador. Para ello, vamos a descargar la aplicación servidor para después copiarla a nuestro dispositivo (es imprescindible tener instalado el adb del SDK de Android). Se recomienda que el dispositivo móvil esté rooteado, aunque esto no sea totalmente imprescindible tal y como cuenta la documentación oficial.

[Actualización: más información aportada por @StooormQ sobre el uso de Frida sin un dispositivo rooteado: https://koz.io/using-frida-on-android-without-root/]

Debemos descargarnos el fichero frida-server para Android del siguiente repositorio de la versión que nos aplique. Para poder saber que fichero tenemos que descargar, tendremos que ver primero qué versión de Frida tenemos instalada, y qué tipo de arquitectura tiene nuestro dispositivo:

Para así buscar la versión correspondiente en el repositorio:

Una vez descargado y descomprimido, lo subimos, le damos permisos, y lo ejecutamos en el dispositivo en segundo plano:

adb root
adb push frida-server /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/frida-server"
adb shell "/data/local/tmp/frida-server &"

 

Debemos tener en cuenta que a la hora de ejecutar el servidor debemos hacerlo con privilegios de administrador, por lo que si lo estamos ejecutando en un móvil rooteado, debemos cerciorarnos de que lo ejecutemos desde una shell con permisos su.

[Para que se vea todo un poco mejor a nivel pantallazos, vamos a utilizar a partir de aquí el emulador que viene preinstalado en androl4b. Hay que seguir exactamente los pasos anteriores, y seleccionar la arquitectura que corresponda]

Como último paso, deberemos asegurarnos de que el adb puede ver nuestro dispositivo:

adb devices -l

Para comprobar que todo ha funcionado correctamente, podemos probar a listar la lista de procesos que se están ejecutando actualmente en el dispositivo con el siguiente comando:

frida-ps -U

 

Podemos hacer una prueba rápida y sencilla con el navegador de nuestro dispositivo. Como podemos ver, actualmente está corriendo el proceso del navegador (con el nombre del paquete de la aplicación): com.android.browser. Podemos utilizar la función trace de Frida para ver «al vuelo» las funciones open() que se están ejecutando en nuestra aplicación (más adelante se explicará la función):

frida-trace -U -i open com.android.browser

 

 

Jugando con una aplicación

Vamos a realizar unas pequeñas pruebas en la aplicación Diva (Damn insecure and vulnerable App), aplicación especialmente diseñada para probar este tipo de herramientas. Antes de nada, lanzamos la aplicación y revisamos que efectivamente se está ejecutando (pudiendo además capturar el nombre del paquete de la aplicación):

  

Tal y como hicimos antes, podemos tracear las llamadas que realiza la aplicación de las funciones que le indiquemos. Esto lo haremos gracias al comando -i. Es interesante el uso de varios parámetros y/o de expresiones regulares para definir nuestra salida a gusto. Con el comando -U estamos indicando que nuestro dispositivo está conectado mediante USB, mientras que si nos conectásemos de manera remota tendríamos que usar el comando -R. Si añadimos al final del la función frida-trace el nombre del paquete, acotaremos la salida a dicha aplicación.

frida-trace -U -i "open*" jakhar.aseem.diva

Pero el objetivo de todo esto, es modificar al vuelo el código de la aplicación y tomar el control de la misma. Antes de poder ver qué código hookear, necesitamos decompilar la APK para así conseguir los ficheros jar desde la APK, ver y analizar el código, y decidir dónde actuar. Para ello, vamos a utilizar la aplicación dex2jar:

cd /home/andro/Desktop/Tools/qark/qark/lib/dex2jar/

 

./d2j-dex2jar.sh /home/andro/Desktop/Labs/diva-android/diva-beta.apk

Una vez decompilado, utilizamos el programa jd-gui para poder visualizar los ficheros java del paso anterior. En Androl4b tenemos la versión 1.0.0. disponible, pero es recomendable siempre bajarse la última versión:

java -jar jd-gui-1.5.1.jar

 
Y seleccionamos el .jar que obtuvimos anteriormente:

Según podemos ver en el código tras bucear un rato (¡vaya!, que suerte que no está ofuscado), existe una clase que controla el login llamada LogActivity. En esta clase existe una función llamada checkout() que se encarga de validar el propio login:

Frida tiene la funcionalidad de poder crear scripts propios para hookear funciones. Para ello, tendremos que ejecutar Frida junto con nuestro script en el que le indicaremos qué debe hacer al encontrarse qué función. Con este breve ejemplo, podemos comprobar cuándo pasamos por la función checkout() y ejecutar un mensaje a modo de debug:

La manera de ejecutar estos scripts es gracias al parámetro -l, y se ejecutarán de la siguiente manera. Recordad que hay que indicar en qué paquete queremos ejecutar el script:

frida -U jakhar.aseem.diva -l '/home/andro/Desktop/frida_script.js' --no-pause

El parámetro –no-pause sirve para no interrumpir el inicio de nuestra aplicación y así dejar que Frida genere el proceso.

Si pulsamos en el menú «1. INSECURE LOGGING» obtendremos un formulario en el que loguearnos. Al pulsar el botón «CHECK OUT» estaremos llamando a la función checkout() con la que estamos interactuando. Tal y como podemos ver a continuación, se mostrará el mensaje definido en el script confirmando que hemos podido inyectar al vuelo nuestro código:


 
 
 
Como veis las posibilidades son infinitas, y esto sólo es el comienzo para mostrar la gran herramienta que es Frida. Para que la entrada no sea un tostón, cortamos por aquí y en la siguiente profundizaremos mucho más en qué hacer con los scripts y con el resto de funcionalidades de Frida.

Cualquier duda, sugerencia o comentario, ya sea de la entrada o de Seguridad en general, pasaos por nuestra comunidad de Telegram.

Gracias a mi amigo Pinki por el bonito diseño de la imagen de la entrada 🙂

Saludos conejiles,
 
gonx0

Deja un comentario

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

Los datos introducidos se guardarán en nuestra base de datos como parte del comentario publicado, como se indica en la política de privacidad.