15 agosto 2014

Alterando el contenido de un APK (parte 2 de 2)

En el artículo anterior vimos lo fácil que es generar con msfpayload un APK que incluya Meterpreter y de forma muy somera la estructura del código generado por la herramienta.

Aprovechando ese conocimiento vamos a alterar una aplicación para que sin perder su funcionalidad original, se incluya el shellcode Meterpreter de regalo.
Para lograr este objetivo, y como no podemos editar directamente el fichero .dex, utilizaremos las herramientas dex2jar para desensamblar el código en Jasmin, alterarlo y re-empaquetarlo.

Segunda disección del payload Meterpreter para Android

A través de su código en Java vimos que todo se desencadenaba realizando una llamada única a una función ubicada en la clase Payload, la cual se encargaría de establecer la conexión con nuestra consola de Metasploit, descargar el payload y ejecutarlo:


Esta vez vamos a ver la llamada a esa función a través de su desensamblado Jasmin. Para ello lanzaremos los siguientes comandos sobre el fichero Meterpreter.apk que generamos anteriormente:


Ejecutando estos comandos se creará un directorio con el código Jasmin organizado según los paquetes en los que se haya estructurado el código de la aplicación:


Si abrimos el fichero MainActivity.j podremos ver el código desensamblado del método onCreate:


He sombreado en la imagen la parte que nos interesa:
  • aload 0: Empuja a la pila la variable "this"
  • invokestatic com/metasploit...: Realiza la llamada al método estático de la clase Payload

Visto esto, podremos inyectar el shellcode en otra aplicación si incluimos en ella:
  1. El código que acabamos de desensamblar de Meterpreter.apk
  2. Las dos instrucciones sombreadas anteriormente sobre un método que sepamos que se va a ejecutar, por ejemplo el onCreate de su actividad inicial

Preparando el entorno

El proceso que vamos a seguir para alterar el fichero es el que propone dex2jar desde su página de la wiki ModifyApkWithDexTool.

Si observáis el proceso veréis que es algo tedioso ya que implica la creación de muchos ficheros diferentes mientras que se hace malabares con ellos. Para simplificar esta tarea he creado un script en Python que automatiza todo ese proceso, lo podéis descargar de GitHub desde este enlace.
El script hace uso de las herramientas apktool y dex2jar, de modo que además de descargar el script tendréis que descargar ambas herramientas y configurarlas en el path para que cuando el script las ejecute las pueda encontrar.

Una vez configurado el entorno, descargaremos el APK que queramos modificar.
Para la prueba de concepto y que así veamos lo increíblemente fácil que es editar cualquier aplicación yo he seleccionado una aplicación conocida: Tapatalk.


Inyectando el código Meterpreter en otra aplicación

Ya tenemos todas las herramientas y el APK que queremos modificar, así que ejecutamos el script sobre la aplicación a editar:


Lo primero que nos permitirá el script es modificar el manifiesto por si queremos incluir alguna actividad, permiso, cambiar la versión, etc. Vamos a utilizar este momento para dirigirnos al directorio indicado, abrir el fichero AndroidManifest.xml y localizar la actividad de inicio de la aplicación:


Presionamos ENTER para que el script continúe con su ejecución. Su siguiente parada será la edición del código:


Como indicamos cuando vimos el código Jasmin de Meterpreter.apk, en este punto tendremos que hacer dos acciones sobre el código ubicado en el directorio que nos indica el script:

1. Copiar la carpeta com/metasploit con el código Jasmin de Meterpreter.apk:


2. Añadir las dos instrucciones de carga del código de Meterpreter al método onCreate ubicado en el fichero com/quoord/tapatalkpro/activity/directory/ics/IcsEntryActivity.j que descubrimos al analizar el manifiesto:


Si todo ha ido correctamente, cuando volvamos a presionar ENTER el script re-empaquetará la aplicación (en mi caso ha mostrado algunas advertencias, pero el proceso ha finalizado correctamente) y la dejará preparada para su instalación:



Ya sólo queda ejecutar, para ello antes configuramos multi/handler en msfconsole y lo ponemos a la escucha:


Desinstalamos la versión previa de Tapatalk (en caso de que la tuviéramos) y reinstalamos la modificada:


Ejecutamos la aplicación en el dispositivo:



Y obtendremos nuestra sesión Meterpreter:



Ultimando detalles


Es muy importante que tengamos en cuenta que al re-empaquetarse la aplicación y para que pueda ser instalada ha tenido que volver a ser firmada, y al no disponerse de la firma original se firmará con una genérica:


El problema de este punto es que, como vimos en el artículo anterior, cuando instalamos una aplicación desde un origen desconocido no se muestra a quién pertenece la firma de esa aplicación, impidiendo que el usuario final pueda saber si está instalando una aplicación original o una alterada.


Lo que sí que hará el sistema operativo es comprobar si la aplicación ya se encuentra instalada para no permitir su instalación en caso de que no coincida la firma.



Otro aspecto relevante es que si recordamos el artículo anterior, la aplicación generada de Meterpreter con msfpayload solicitaba una cantidad importante de permisos para poder explotar todo su potencial, y de aquí podemos sacar dos conclusiones:

1. Los permisos que no existieran previamente y no se incluyan durante la fase de edición del manifiesto limitarán las opciones de la sesión Meterpreter



2. Los permisos que se incluyan se le mostrarán al usuario durante la instalación haciéndose notar una diferencia entre la aplicación original y la modificada


Artículo cortesía de Miguel Ángel García

1 comments :

Jonathan Novel dijo...

Muchas gracias por la Info!
Salu2!