hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md
2023-06-03 01:46:23 +00:00

16 KiB

Tutorial de Drozer

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Consejo de recompensa por errores: ¡regístrate en Intigriti, una plataforma premium de recompensas por errores 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 desde las últimas versiones.

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

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

adb install drozer.apk

Iniciando el servidor

El agente se está ejecutando en el puerto 31415, necesitamos hacer port forwarding 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, lanza 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 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 apropiados para ejecutar.
shell Inicia una shell interactiva de Linux en el dispositivo, en el contexto del Agente.
clean Elimina los 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 inicia.
set Almacena un valor en una variable que se pasará como variable de entorno a cualquier shell de Linux iniciada por drozer.
shell Inicia una shell interactiva de Linux 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
  • Actividades: Tal vez puedas iniciar una actividad y evitar 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 (Inyección SQL o Traversal de Ruta).
  • Servicios:
  • is debuggable: Aprende más

Actividades

El valor "android:exported" de un componente de actividad exportado se establece 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:

Tal vez puedas iniciar una actividad y evitar algún tipo de autorización que debería impedirte lanzarla.

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

También puedes iniciar una actividad exportada desde adb:

  • El nombre del paquete es com.example.demo
  • El nombre de la actividad exportada es com.example.test.MainActivity
adb shell am start -n com.example.demo/com.example.test.MainActivity

Proveedores de contenido

Este post era demasiado grande para estar aquí, así que puedes acceder a él en su propia página aquí.

Servicios

Un servicio exportado se declara dentro del Manifest.xml:

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

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

Listar servicios

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 primero enviarás los datos dentro de "msg.what", luego "msg.arg1" y "msg.arg2", debes 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)
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

Las aplicaciones de Android pueden enviar o recibir mensajes de difusión del sistema Android y de otras aplicaciones de Android, similar al patrón de diseño publicar-suscribir. Estas difusiones se envían cuando ocurre un evento de interés. Por ejemplo, el sistema Android envía difusiones cuando ocurren varios eventos del sistema, como cuando se inicia el sistema o el dispositivo comienza a cargarse. Las aplicaciones también pueden enviar difusiones personalizadas, por ejemplo, para notificar a otras aplicaciones algo que podrían estar interesadas (por ejemplo, se ha descargado algún dato nuevo).

Las aplicaciones pueden registrarse para recibir difusiones específicas. Cuando se envía una difusión, el sistema enruta automáticamente las difusiones a las aplicaciones que se han suscrito para recibir ese tipo particular de difusión.

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>

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

Después de descubrir estos receptores de difusión, debe verificar el código de los mismos. Preste especial atención a la función **onReceive** ya que será la encargada de manejar los mensajes recibidos.

Detectar todos los receptores de difusión

run app.broadcast.info #Detects all

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

#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 de Difusión

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 la aplicación FourGoats apk, puedes enviar un SMS arbitrario a cualquier destino no premium sin pedirle 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 debería ser depurable. Esto significa que no se puede 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 su 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 de recompensa por errores: ¡regístrese en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers! ¡Únase a nosotros en https://go.intigriti.com/hacktricks hoy mismo y comience a ganar recompensas de hasta $100,000!

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥