hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial
2023-08-27 20:06:50 +00:00
..
exploiting-content-providers.md Translated ['1911-pentesting-fox.md', 'README.md', 'ctf-write-ups/try-ha 2023-06-07 04:36:55 +00:00
README.md Translated ['mobile-pentesting/android-app-pentesting/drozer-tutorial/RE 2023-08-27 20:06:50 +00:00

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, la versión es esta.

adb install drozer.apk

Iniciando el Servidor

El agente se está ejecutando en el puerto 31415, necesitamos hacer un reenvío de 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, lanza la aplicación y presiona el botón "ON"

Y conéctate a ella:

drozer console connect

Comandos Interesantes

Comandos Descripción
Ayuda MÓDULO Muestra la ayuda del módulo seleccionado
lista Muestra una lista de todos los módulos de drozer que se pueden ejecutar en la sesión actual. Esto oculta los módulos para los cuales no tienes los permisos adecuados para ejecutarlos.
shell Inicia una shell interactiva de Linux en el dispositivo, en el contexto del Agente.
limpiar Elimina los archivos temporales almacenados por drozer en el dispositivo Android.
cargar Carga un archivo que contiene comandos de drozer y los ejecuta en secuencia.
módulo Encuentra e instala módulos adicionales de drozer desde Internet.
desestablecer Elimina una variable con nombre que drozer pasa a cualquier shell de Linux que inicia.
establecer 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
ejecutar MÓDULO Ejecuta un módulo de drozer
explotar Drozer puede crear exploits para ejecutar en el dispositivo. drozer exploit list
carga útil Los exploits necesitan una carga útil. 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

Lee 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 evadir algún tipo de autorización que debería impedirte lanzarla.
  • Proveedores de contenido: Tal vez puedas acceder a datos privados o aprovechar alguna vulnerabilidad (Inyección SQL o Traversal de Ruta).
  • Servicios:
  • es depurable: Más información

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>

Lista de actividades exportadas:

Para obtener una lista de las actividades exportadas de una aplicación Android, puedes utilizar la herramienta drozer. Sigue los siguientes pasos:

  1. Asegúrate de tener drozer instalado en tu máquina de trabajo.

  2. Conecta tu dispositivo Android al equipo mediante un cable USB.

  3. Abre una terminal y ejecuta el siguiente comando para iniciar una sesión de drozer:

    drozer console connect
    
  4. Una vez que estés en la consola de drozer, ejecuta el siguiente comando para listar las actividades exportadas de la aplicación:

    run app.activity.info -a <nombre_del_paquete_de_la_aplicación>
    

    Reemplaza <nombre_del_paquete_de_la_aplicación> con el nombre del paquete de la aplicación que deseas analizar.

  5. drozer mostrará una lista de las actividades exportadas de la aplicación, junto con otra información relevante, como el nombre de la actividad y el nombre del paquete.

Con esta lista de actividades exportadas, podrás identificar posibles puntos de entrada para realizar pruebas de penetración en la aplicación Android.

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 evadir 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:

  • 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:

{% code overflow="wrap" %}

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

{% endcode %}

Dentro del código verifica 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

To interact with a service, you can use the run command in drozer. This command allows you to execute various actions on the target service.

Para interactuar con un servicio, puedes utilizar el comando run en drozer. Este comando te permite ejecutar varias acciones en el servicio objetivo.

The basic syntax for the run command is as follows:

La sintaxis básica para el comando run es la siguiente:

run <module> <action> [options]

Where:

Donde:

  • <module> is the name of the module you want to run.

  • <module> es el nombre del módulo que deseas ejecutar.

  • <action> is the action you want to perform on the module.

  • <action> es la acción que deseas realizar en el módulo.

  • [options] are any additional options or parameters required by the module.

  • [options] son cualquier opción o parámetro adicional requerido por el módulo.

For example, to interact with the activity module and launch an activity, you can use the following command:

Por ejemplo, para interactuar con el módulo activity y lanzar una actividad, puedes utilizar el siguiente comando:

run app.activity.start --component <package_name>/<activity_name>

Replace <package_name> with the package name of the target app and <activity_name> with the name of the activity you want to launch.

Reemplaza <package_name> con el nombre del paquete de la aplicación objetivo y <activity_name> con el nombre de la actividad que deseas lanzar.

You can also use the run command to perform other actions, such as sending intents, querying content providers, and executing shell commands.

También puedes utilizar el comando run para realizar otras acciones, como enviar intents, consultar proveedores de contenido y ejecutar comandos de shell.

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 puedes crear 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 otras aplicaciones de Android, de manera 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 el sistema se inicia o el dispositivo comienza a cargarse. Las aplicaciones también pueden enviar difusiones personalizadas, por ejemplo, para notificar a otras aplicaciones algo en lo que podrían estar interesadas (por ejemplo, se ha descargado nuevos datos).

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 transmisión, debes verificar 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 receptores de transmisión

run app.broadcast.info #Detects all

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

To check the broadcast receivers of an app, you can use the drozer tool. This tool allows you to interact with the Android operating system at the application layer, providing a convenient way to analyze and test the security of Android apps.

To begin, make sure you have drozer installed on your machine. You can find installation instructions in the drozer GitHub repository.

Once drozer is installed, follow these steps to check the broadcast receivers of an app:

  1. Connect your Android device to your machine via USB debugging mode.

  2. Open a terminal and start the drozer console by running the following command:

    drozer console connect
    
  3. Once connected, you can use the run app.broadcast.info command to retrieve information about the broadcast receivers of a specific app. For example, to check the broadcast receivers of an app with package name com.example.app, run the following command:

    run app.broadcast.info -a com.example.app
    

    This command will display a list of all the broadcast receivers registered by the app, along with their corresponding permissions and intent filters.

By checking the broadcast receivers of an app, you can identify potential security vulnerabilities or misconfigurations that could be exploited by attackers. It is an important step in the process of mobile app penetration testing.

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

Las interacciones de broadcast son una parte fundamental del análisis de seguridad de aplicaciones Android. Los mensajes de broadcast son eventos que se envían a través del sistema operativo Android y pueden ser recibidos por múltiples componentes de la aplicación. Estas interacciones pueden ser utilizadas por los atacantes para obtener información sensible o ejecutar acciones maliciosas en la aplicación.

En el contexto de la pentesting de aplicaciones Android, es importante identificar las interacciones de broadcast y evaluar su seguridad. Esto implica buscar componentes de la aplicación que registren receptores de broadcast y analizar cómo se manejan los mensajes recibidos. Algunas vulnerabilidades comunes asociadas con las interacciones de broadcast incluyen la divulgación de información confidencial, la ejecución de código no autorizado y la suplantación de identidad.

Drozer es una herramienta popular utilizada para realizar pruebas de penetración en aplicaciones Android. Proporciona una serie de comandos que permiten interactuar con las interacciones de broadcast de una aplicación y evaluar su seguridad. Al utilizar Drozer, los pentesters pueden descubrir posibles vulnerabilidades y ayudar a los desarrolladores a corregirlas antes de que sean explotadas por atacantes malintencionados.

En resumen, las interacciones de broadcast son un aspecto crítico a considerar durante la pentesting de aplicaciones Android. Mediante el uso de herramientas como Drozer, los pentesters pueden identificar y evaluar la seguridad de estas interacciones, ayudando a garantizar que las aplicaciones sean seguras y protegidas contra posibles ataques.

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 proveedor de contenido de la aplicación 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 proveedor de contenido.

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 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 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" %}

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