Ingenieria Inversa de Apps Android con Frida y RMS

En este articulo veremos cómo aplicar ingeniería inversa a una aplicación Android, en este caso conectada a Firebase. Recuperaremos los id’s de los usuarios y a traves de la sobreescritura de metodos podremos obtener informacion real.

Para ello mediante un análisis dinámico de la aplicación, obtendremos datos de usuarios registrados en la aplicación, vulnerables a una exposición de información sensible.

En este ejemplo podremos ver como a través de la monitorización de los metodos de la aplicacion podremos obtener identificadores de usuarios en la base de datos.

Teniendo el identificador de cada usuario, podremos sobreescribir los metodos de la aplicacion para hacer creer al programa que somos dicho usuario. Y de esta manera podremos obtener informacion sensible de todos los usuarios de la base de datos simplemente cambiando este identificador

Pero vamos a empezar desde el principio para que se pueda entender mejor:

  • Es necesario un dispositivo Android con permisos de administracion (root), ya sea emulado o fisico.
  • Sera necesaria la instalacion del servicio Frida-server
  • En este ejemplo utilizamos RMS Runtime Mobile Security, para probar inyecciones sobre los metodos o las clases criticas.
  • Para las pruebas usaremos, Meal and Meet, una app de uso libre.

Lo primero que tendremos que hacer es ejecutar nuestro emulador e instalar la app que queramos testear. En el ejemplo vemos que es una app de una red social donde se ven datos de los usuarios registrados, grupos compuestos por otros usuarios y sus geolocalizaciones.

Podeis seguir el ejemplo del video.

Una vez hayamos instalado la app, tendremos que poner Frida a servir.

adb shell “/data/local/tmp/frida-server &”

Se quedara a la espera de recibir comandos, ya sea desde otra terminal o desde nuestro Framework RSM.

Para poder trabajar con RSM tendremos que instalarlo y ponerlo a servir

Python mobilesecurity.py”

Una vez en ejecucion podremos visitar la ip http://127.0.0.1:5000 por defecto que nos permitira manipular la app desde RSM.

El primer paso para Hookear nuestra app es setear el nombre del paquete.

A continuacion debemos elegir las clases que queremos sobreescribir, para poder detectarlas sera necesario navegar dentro de la app para que Frida y RSM puedan ser notificados de la creacion de las clases que queremos modificar.

En el ejemplo tomaremos las clases:

  • User.class: Es la clase dedicada a los objetos usuario, del que obtendremos sus id’s cuando carguemos los diferentes grupos de usuarios que hay dentro de la app. 
  • MyProfile.class: Es la activity dedicada a mostrar los datos del usuario concreto referido a una id.

Cargaremos todos los metodos y los hookearemos.

Si navegamos a un grupo concreto de la aplicacion, podremos ver que se muestran todos los usuarios que conforman dicho grupo. Es en este momento donde en el apartado I/O Hooked methods podremos ver que para poder mostrar los usuarios que vemos se llama a la clase User.class y sus getters y setters la misma cantidad de veces que usuarios tiene el grupo.

Y si miramos con mas detenimiento observamos que existe un metodo getId() con una salida concreta por cada usuario. Asi podemos apuntar todas los identificadores de los usuarios relacionados en este grupo.

Una vez hayamos guardado los identificadores que queramos investigar tendremos que ir a la pestana Heap Search o Hook LAB, seleccionar aquella clase que queramos sobreescribir y elegir el metodo que modificaremos. En nuestro caso es la activity MyProfile.class y su metodo loadUser() que hemos deducido que sirve para mostrar los datos del usuario registrado en la app.

Una vez extraido el metodo podemos cambiar la variable que entra por parametros y harcodearla con la id de otro usuario, haciendo creer a la app que somos otra persona.

Nos dirigiremos a Load Frida Script y ejecutaremos el codigo, en ese momento los datos mostrados perteneceran a la id que le hayamos pasado y no al usuario real que se ha autenticado.

Mas abajo os dejo la llamada al método loadUser() que uso en la activity MyProfile.

Java.performNow(function () {
  var classname = "com.example.cosmo.comer8.MyProfile"
  var classmethod = "loadUser";

  send("Heap Search - START ("+classname+")\n");

  Java.choose(classname, {
    onMatch: function (instance) {
      
      var s="";
      s=s+"[*] Instance Found: " +instance.toString()+"\n";
      s=s+"Calling method: " +classmethod+"\n";
      
      //public void loadUser(java.lang.String)
      var ret = instance.loadUser(""); //<-- Inserta aqui el String del que quieres hacer la consulta.
      s=s+"Output: "+ ret + "\n";
      send(s);

    }
  });
  send("Heap Search - END ("+classname+")");
});

Deja un comentario