Frida es una herramienta de instrumentación dinámica y flexible. Esta potente aplicación puede inyectar instrucciones en procesos en ejecución a lo largo de múltiples plataformas: Android, iOS, Windows, Mac y QNX.

Las utilidades de esta herramienta son variadas, desde realizar pruebas sin alterar el código, modificar el flujo de ejecución de un programa o simplemente utilizarse para observar el estado de procesos dentro de una aplicación. Estas utilidades nosotros las veremos orientadas a la búsqueda de vulnerabilidades y como apoyo para otras tareas dentro del pentesting de aplicaciones móviles Android.

Como introducción a la herramienta el primer paso será crear el entorno adecuado para la práctica.

    Requisitos:

    • ADB tools en nuestro PC

    • Si hemos utilizado el SDK de Android contaremos con el, sino simplemente instalaremos en función de nuestra distribución o sistema operativo.

                apt install android-tools-adb
                

    • Frida instalado en nuestro PC

    • Para ello será necesario primeramente Python y su utilidad de paquetes pip

               pip3 install frida-tools
               

    • Frida-server en nuestro dispositivo o emulador Android

    • Para ello será necesario buscar el binario acorde a nuestros requisitos
      https://github.com/frida/frida/releases
    • Una vez tenemos el binario deberemos situarlo en alguna carpeta en nuestro dispositivo y ejecutarlo como root, para esto utilizaremos adb con el móvil o el emulador conectado.

               adb devices -l 
               adb push frida-server /data/local/tmp/
               adb shell
               su
               chmod +x /data/local/tmp/frida-server
               /data/local/tmp/frida-server
               

Una vez todos nuestros requisitos están cumplidos y tenemos nuestro frida-server en nuestro dispositivo Android corriendo podemos comenzar con unas serie de pruebas introductorias utilizando una aplicación que hemos desarrollado con diferentes ejercicios básicos.
Podeis descargarla aqui: APK
Para poder comprender el funcionamiento y obtener los nombres de metodos, clases y variables en este caso utilizaremos un decompilador que nos facilitará las tareas. En este caso utilizaremos Jadx en su versión con interfaz gráfica.

Ejercicio 1- Call me!

Para acceder al ejercicio 1 pulsaremos el botón correspondiente al ejercicio “Call me”. La finalidad de este ejercicio es utilizar la funcionalidad de Frida que nos permite llamar a un método de una clase de manera automática.
Observando el código fuente podemos ver dentro de la actividad Callme una serie de funciones, entre ellas encontramos call_me_win()
Dentro de la función se genera la primera flag y será mostrada al usuario.
Accediendo a la aplicación en el móvil al ejercicio 1 vemos que que no ocurre nada. Si nos leemos el código de la actividad podemos ver que nunca se llama a la función para obtener la flag.



Desarrollaremos el código javascript que buscará una instancia de la actividad mediante el método Java.choose y trabajaremos sobre ella, debe estar iniciada la actividad ya que si no no encontraremos la actividad.

Java.perform(function () {
Java.choose('com.ironhackers.androidlab.Callme', {
  onMatch: function(instance) {
    Java.scheduleOnMainThread(function () { 
        instance.call_me_win();
      });
    },
  onComplete: function() {}
    });
  });

Una vez esta desarrollado nuestro código javascript procedemos a ejecutar frida en nuestro PC.


frida -U --no-pause -l callme.js com.ironhackers.androidlab

Como vemos hemos obtenido el flag!

Ejercicio 2- AlwaysTrue

La finalidad de este ejercicio es conseguir saltarse una función que realiza una serie de comprobaciones.
Observando el código fuente podemos ver dentro de la actividad Always True que al inicio se llamará a una serie de métodos para obtener la flag.
Si accedemos al ejercicio en la propia aplicación veremos que nos devuelve un mensaje de error. Si nos leemos el código de la actividad podemos ver que nunca se llega a mostrar la flag ya que se llama a una función que realizará unas comprobaciones imposibles.



Para este ejercicio sobrescribiremos el método imposible_check utilizando el binding imposible_check.implementation = function () que devuelve un booleano para que siempre sea verdadero. En este caso ejecutaremos el código y posteriormente abriremos la actividad ya que no utilizamos ninguna instancia.

Java.perform(function(){
 var alwaystrueactivity= Java.use('com.ironhackers.androidlab.Alwaystrue');
 alwaystrueactivity.imposible_check.implementation = function () {
    return true;
    }
});

Una vez esta desarrollado nuestro código javascript procedemos a ejecutar Frida en nuestro PC.


frida -U --no-pause -l alwaystrue.js com.ironhackers.androidlab

Como vemos hemos obtenido el flag sobrescribiendo la implementación de un método.

Ejercicio 3- CreateMe

En esta actividad observamos un botón para la compra de ironcoins pero al presionar el botón de compra nos devuelve que no tenemos dinero.
Observando el código desde el decompilador vemos que utiliza un objeto Person que contiene una variable tipo Wallet pero que en ningún caso es instanciada por lo que fallará la comprobación de dinero.



En este caso necesitaremos crear un objeto Wallet y cargarlo mediante el Setter del objeto person obtenido a través de person.value, el cual extraemos de una instancia obtenida con la busqueda de Java.choose. Así conseguimos saltar la comprobación.

Java.perform(function(){
  var wallet=Java.use("com.ironhackers.androidlab.Wallet");
  Java.choose('com.ironhackers.androidlab.Createme', {
    onMatch: function(instance) {
      instance.person.value.setWallet(wallet.$new(100));
     },
    onComplete: function() {}
    });
  });

Una vez esta desarrollado nuestro código javascript procedemos a ejecutar Frida en nuestro PC.


frida -U --no-pause -l createme.js com.ironhackers.androidlab

Como vemos hemos obtenido el flag y hemos aprendido que podemos crear objetos, llamar funciones, etc mediante el binding de lenguajes de Frida – Java.

Ejercicio 4- Sniff

En esta actividad podemos ver una caja de texto y un botón para comprobar. Primero deberemos estudiar el código a través del decompilador para entender el objetivo.



El objetivo es introducir la clave correcta en la caja de texto para que la flag sea mostrada.
Para lograr el objetivo capturaremos los argumentos que son pasados por la función generateFlag y así obtendremos la clave a introducir en la caja de texto.

Java.perform(function(){
  Java.choose('com.ironhackers.androidlab.Sniff', {
    onMatch: function(instance) {
      instance.generateFlag.implementation = function (arg0,arg1) {
        console.log("arg0 -> "+arg0+" | arg1 -> "+arg1);
        this.generateFlag(arg0,arg1);
        }
      },
    onComplete: function() {}
    });
  });

Una vez esta desarrollado nuestro código javascript procedemos a ejecutar Frida en nuestro PC.


frida -U --no-pause -l sniff.js com.ironhackers.androidlab

Podemos trabajar con los argumentos de las funciones como si estuviéramos trabajando en el lenguaje nativo. Una vez obtenido la clave del argumento 2, la introducimos y obtendremos la flag.

Esto ha sido la introducción a Frida con un ejercicio muy básico en el que directamente podríamos obtener las flags del código sin mucha dificultad pero la gracia es hacerlo utilizando Frida.
La variedad de usos esta abierta a cada uno, en la siguiente parte utilizaremos Frida en una auditoría de una aplicación móvil.

Herramientas: Frida documentación, frida-tools Python, Jadx-GUI

¿Me ayudas a compatirlo?