hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial
2024-01-03 13:23:35 +00:00
..
exploiting-content-providers.md Translated ['mobile-pentesting/android-app-pentesting/README.md', 'mobil 2024-01-03 13:23:35 +00:00
README.md Translated ['mobile-pentesting/android-app-pentesting/README.md', 'mobil 2024-01-03 13:23:35 +00:00

Tutorial de Drozer

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Consejo para bug bounty: regístrate en Intigriti, una plataforma premium de bug bounty creada por hackers, para hackers. Únete a nosotros en https://go.intigriti.com/hacktricks hoy mismo, y comienza a ganar recompensas de hasta $100,000.

{% embed url="https://go.intigriti.com/hacktricks" %}

APKs para probar

Instalación

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

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

Descargue e instale el APK de drozer desde los últimos lanzamientos. En este momento es este.

adb install drozer.apk

Iniciando el Servidor

El Agente se está ejecutando en el puerto 31415, necesitamos redirigir el puerto para establecer la comunicación entre el Cliente Drozer y el Agente, aquí está el comando para hacerlo:

adb forward tcp:31415 tcp:31415

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

Y conéctate a ella:

drozer console connect

Comandos Interesantes

Comandos Descripción
Help MODULE Muestra 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 módulos para los que no tienes permisos adecuados.
shell Inicia una shell Linux interactiva 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 Linux que inicie.
set Almacena un valor en una variable que se pasará como una variable de entorno a cualquier shell Linux iniciada por drozer.
shell Inicia una shell Linux interactiva 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:

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

Información Básica del paquete:

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:

run app.package.manifest jakhar.aseem.diva

Superficie de ataque del paquete:

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
  • Activities: Quizás puedas iniciar una actividad y eludir algún tipo de autorización que debería impedirte lanzarla.
  • Content providers: Quizás puedas acceder a datos privados o explotar alguna vulnerabilidad (SQL Injection o Path Traversal).
  • Services:
  • is debuggable: Aprende más

Activities

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

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

Listar actividades exportadas:

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.

{% code overflow="wrap" %}

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

{% endcode %}

También puedes iniciar una actividad exportada desde adb:

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

Proveedores de Contenido

Esta publicación era tan grande para estar aquí que puedes accederla en su propia página aquí.

Servicios

Un servicio exportado se declara dentro del Manifest.xml:

{% code overflow="wrap" %}

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

{% endcode %}

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

Listar servicio

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

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

Ejemplo

Echa un vistazo a la ayuda de drozer para app.service.send:

Ten en cuenta que estarás enviando primero 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.
Utilizando 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)
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 Broadcast

Las aplicaciones de Android pueden enviar o recibir mensajes broadcast del sistema Android y otras aplicaciones Android, similar al patrón de diseño [publish-subscribe](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe\_pattern). Estos broadcasts se envían cuando ocurre un evento de interés. Por ejemplo, el sistema Android envía broadcasts cuando ocurren varios eventos del sistema, como cuando el sistema se inicia o el dispositivo comienza a cargarse. Las aplicaciones también pueden enviar broadcasts personalizados, por ejemplo, para notificar a otras aplicaciones de algo que podría interesarles (por ejemplo, se han descargado nuevos datos).

Las aplicaciones pueden registrarse para recibir broadcasts específicos. Cuando se envía un broadcast, el sistema automáticamente enruta los broadcasts a las aplicaciones que se han suscrito para recibir ese tipo particular de broadcast.

Esto podría aparecer dentro del archivo Manifest.xml:
<receiver android:name=".MyBroadcastReceiver"  android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>

De: https://developer.android.com/guide/components/broadcasts

Después de descubrir estos Broadcast Receivers, debes revisar el código de los mismos. Presta especial atención a la función onReceive, ya que será la encargada de manejar los mensajes recibidos.

Detectar todos los broadcast receivers

run app.broadcast.info #Detects all

Verificar los receptores de difusión de una app

#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 con Broadcast

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 Content Provider de FourGoats apk 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.

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 real, 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 Manifiesto:

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

Puedes encontrar todas las aplicaciones depurables con Drozer:

run app.package.debuggable

Tutoriales

Más información

Consejo para bug bounty: regístrate en Intigriti, una plataforma premium de bug bounty creada por hackers, para hackers. ¡Únete a nosotros en https://go.intigriti.com/hacktricks hoy y comienza a ganar recompensas de hasta $100,000!

{% embed url="https://go.intigriti.com/hacktricks" %}

Aprende a hackear AWS desde cero hasta héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: