Tutorial de Drozer

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

APKs para probar

Partes de este tutorial fueron extraídas de la documentación pdf de Drozer.

Instalación

Instala el Cliente Drozer dentro de tu host. Descárgalo de las últimas versiones.

bash
pip install drozer-2.4.4-py2-none-any.whl
pip install twisted
pip install service_identity

Descarga e instala el APK de drozer desde las últimas versiones. En este momento es este.

bash
adb install drozer.apk

Iniciando el Servidor

Agent está corriendo en el puerto 31415, necesitamos port forward para establecer la comunicación entre el Drozer Client y Agent, aquí está el comando para hacerlo:

bash
adb forward tcp:31415 tcp:31415

Finalmente, lanza la aplicación y presiona el botón "ON"

Y conéctate a ella:

bash
drozer console connect

Comandos Interesantes

ComandosDescripción
Help MODULEMuestra la ayuda del módulo seleccionado
listMuestra una lista de todos los módulos de drozer que se pueden ejecutar en la sesión actual. Esto oculta los módulos que no tienes permisos adecuados para ejecutar.
shellInicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente.
cleanElimina archivos temporales almacenados por drozer en el dispositivo Android.
loadCarga un archivo que contiene comandos de drozer y los ejecuta en secuencia.
moduleEncuentra e instala módulos adicionales de drozer desde Internet.
unsetElimina una variable nombrada que drozer pasa a cualquier shell de Linux que genera.
setAlmacena un valor en una variable que se pasará como una variable ambiental a cualquier shell de Linux generado por drozer.
shellInicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente
run MODULEEjecuta un módulo de drozer
exploitDrozer puede crear exploits para ejecutar en el dispositivo. drozer exploit list
payloadLos exploits necesitan un payload. drozer payload list

Paquete

Encuentra el nombre del paquete filtrando por parte del nombre:

bash
dz> run app.package.list -f sieve
com.mwr.example.sieve

Información básica del paquete:

bash
dz> run app.package.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
Process Name: com.mwr.example.sieve
Version: 1.0
Data Directory: /data/data/com.mwr.example.sieve
APK Path: /data/app/com.mwr.example.sieve-2.apk
UID: 10056
GID: [1028, 1015, 3003]
Shared Libraries: null
Shared User ID: null
Uses Permissions:
- android.permission.READ_EXTERNAL_STORAGE
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.INTERNET
Defines Permissions:
- com.mwr.example.sieve.READ_KEYS
- com.mwr.example.sieve.WRITE_KEYS

Leer Manifest:

bash
run app.package.manifest jakhar.aseem.diva

Superficie de ataque del paquete:

bash
dz> run app.package.attacksurface com.mwr.example.sieve
Attack Surface:
3 activities exported
0 broadcast receivers exported
2 content providers exported
2 services exported
is debuggable
  • Actividades: Tal vez puedas iniciar una actividad y eludir algún tipo de autorización que debería impedirte lanzarla.
  • Proveedores de contenido: Tal vez puedas acceder a datos privados o explotar alguna vulnerabilidad (SQL Injection o Path Traversal).
  • Servicios:
  • es depurable: Learn more

Actividades

El valor “android:exported” de un componente de actividad exportado está configurado como “true” en el archivo AndroidManifest.xml:

markup
<activity android:name="com.my.app.Initial" android:exported="true">
</activity>

Lista de actividades exportadas:

bash
dz> run app.activity.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.FileSelectActivity
com.mwr.example.sieve.MainLoginActivity
com.mwr.example.sieve.PWList

Iniciar actividad:

Quizás puedas iniciar una actividad y eludir algún tipo de autorización que debería impedirte lanzarla.

bash
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList

También puedes iniciar una actividad exportada desde adb:

  • PackageName es com.example.demo
  • Exported ActivityName es com.example.test.MainActivity
bash
adb shell am start -n com.example.demo/com.example.test.MainActivity

Proveedores de Contenido

Esta publicación era demasiado grande para estar aquí, así que puedes acceder a ella en su propia página aquí.

Servicios

Un servicio exportado se declara dentro del Manifest.xml:

markup
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>

Dentro del código verifica la función handleMessage que recibirá el mensaje:

Listar servicio

bash
dz> run app.service.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.AuthService
Permission: null
com.mwr.example.sieve.CryptoService
Permission: null

Interactuar con un servicio

bash
app.service.send            Send a Message to a service, and display the reply
app.service.start           Start Service
app.service.stop            Stop Service

Ejemplo

Mira la ayuda de drozer para app.service.send:

Ten en cuenta que primero enviarás los datos dentro de "msg.what", luego "msg.arg1" y "msg.arg2", deberías verificar dentro del código qué información se está utilizando y dónde.
Usando la opción --extra puedes enviar algo interpretado por "msg.replyTo", y usando --bundle-as-obj creas un objeto con los detalles proporcionados.

En el siguiente ejemplo:

  • what == 2354
  • arg1 == 9234
  • arg2 == 1
  • replyTo == object(string com.mwr.example.sieve.PIN 1337)
bash
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg 2354 9234 1 --extra string com.mwr.example.sieve.PIN 1337 --bundle-as-obj

Receptores de Difusión

En la sección de información básica de Android puedes ver qué es un Receptor de Difusión.

Después de descubrir estos Receptores de Difusión, deberías verificar el código de ellos. Presta especial atención a la función onReceive ya que se encargará de manejar los mensajes recibidos.

Detectar todos los receptores de difusión

bash
run app.broadcast.info #Detects all

Verificar los receptores de difusión de una aplicación

bash
#Check one negative
run app.broadcast.info -a jakhar.aseem.diva
Package: jakhar.aseem.diva
No matching receivers.

# Check one positive
run app.broadcast.info -a com.google.android.youtube
Package: com.google.android.youtube
com.google.android.libraries.youtube.player.PlayerUiModule$LegacyMediaButtonIntentReceiver
Permission: null
com.google.android.apps.youtube.app.common.notification.GcmBroadcastReceiver
Permission: com.google.android.c2dm.permission.SEND
com.google.android.apps.youtube.app.PackageReplacedReceiver
Permission: null
com.google.android.libraries.youtube.account.AccountsChangedReceiver
Permission: null
com.google.android.apps.youtube.app.application.system.LocaleUpdatedReceiver
Permission: null

Interacciones Broadcast

bash
app.broadcast.info          Get information about broadcast receivers
app.broadcast.send          Send broadcast using an intent
app.broadcast.sniff         Register a broadcast receiver that can sniff particular intents

Enviar un mensaje

En este ejemplo, al abusar del FourGoats apk Content Provider, puedes enviar un SMS arbitrario a cualquier destino no premium sin pedir permiso al usuario.

Si lees el código, los parámetros "phoneNumber" y "message" deben ser enviados al Content Provider.

bash
run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --component org.owasp.goatdroid.fourgoats.broadcastreceivers SendSMSNowReceiver --extra string phoneNumber 123456789 --extra string message "Hello mate!"

Es depurable

Un APK de producción nunca debería ser depurable.
Esto significa que puedes adjuntar un depurador de java a la aplicación en ejecución, inspeccionarla en tiempo de ejecución, establecer puntos de interrupción, avanzar paso a paso, recopilar valores de variables e incluso cambiarlos. InfoSec institute tiene un excelente artículo sobre cómo profundizar cuando tu aplicación es depurable e inyectar código en tiempo de ejecución.

Cuando una aplicación es depurable, aparecerá en el Manifest:

xml
<application theme="@2131296387" debuggable="true"

Puedes encontrar todas las aplicaciones depurables con Drozer:

bash
run app.package.debuggable

Tutoriales

Más información

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks