# Drozer Tutorial {{#include ../../../banners/hacktricks-training.md}} ## APKs zum Testen - [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (von mrwlabs) - [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz) **Teile dieses Tutorials wurden aus der** [**Drozer-Dokumentation pdf**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)** extrahiert.** ## Installation Installieren Sie den Drozer-Client auf Ihrem Host. Laden Sie ihn von den [neuesten Versionen](https://github.com/mwrlabs/drozer/releases) herunter. ```bash pip install drozer-2.4.4-py2-none-any.whl pip install twisted pip install service_identity ``` Laden Sie die drozer APK von den [neueste Versionen](https://github.com/mwrlabs/drozer/releases) herunter und installieren Sie sie. Im Moment ist es [dieses](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk). ```bash adb install drozer.apk ``` ### Starten des Servers Der Agent läuft auf Port 31415, wir müssen [Port-Forwarding](https://en.wikipedia.org/wiki/Port_forwarding) einrichten, um die Kommunikation zwischen dem Drozer-Client und dem Agenten herzustellen. Hier ist der Befehl dazu: ```bash adb forward tcp:31415 tcp:31415 ``` Starten Sie schließlich die **Anwendung** und drücken Sie die Schaltfläche "**EIN**" ![](<../../../images/image (459).png>) Und verbinden Sie sich damit: ```bash drozer console connect ``` ## Interessante Befehle | **Befehle** | **Beschreibung** | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Help MODULE** | Zeigt die Hilfe des ausgewählten Moduls | | **list** | Zeigt eine Liste aller drozer-Module, die in der aktuellen Sitzung ausgeführt werden können. Dies blendet Module aus, für die Sie nicht die entsprechenden Berechtigungen haben. | | **shell** | Startet eine interaktive Linux-Shell auf dem Gerät im Kontext des Agenten. | | **clean** | Entfernt temporäre Dateien, die von drozer auf dem Android-Gerät gespeichert wurden. | | **load** | Lädt eine Datei mit drozer-Befehlen und führt sie nacheinander aus. | | **module** | Findet und installiert zusätzliche drozer-Module aus dem Internet. | | **unset** | Entfernt eine benannte Variable, die drozer an alle Linux-Shells übergibt, die es startet. | | **set** | Speichert einen Wert in einer Variablen, die als Umgebungsvariable an alle von drozer gestarteten Linux-Shells übergeben wird. | | **shell** | Startet eine interaktive Linux-Shell auf dem Gerät im Kontext des Agenten. | | **run MODULE** | Führt ein drozer-Modul aus | | **exploit** | Drozer kann Exploits erstellen, die im Gerät ausgeführt werden. `drozer exploit list` | | **payload** | Die Exploits benötigen eine Payload. `drozer payload list` | ### Paket Finden Sie den **Namen** des Pakets, indem Sie nach einem Teil des Namens filtern: ```bash dz> run app.package.list -f sieve com.mwr.example.sieve ``` **Grundinformationen** des Pakets: ```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 ``` Lese **Manifest**: ```bash run app.package.manifest jakhar.aseem.diva ``` **Angriffsfläche** des Pakets: ```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 ``` - **Aktivitäten**: Vielleicht kannst du eine Aktivität starten und eine Art von Autorisierung umgehen, die dich daran hindern sollte, sie zu starten. - **Inhaltsanbieter**: Vielleicht kannst du auf private Daten zugreifen oder eine Schwachstelle ausnutzen (SQL-Injection oder Path Traversal). - **Dienste**: - **is debuggable**: [Learn more](./#is-debuggeable) ### Aktivitäten Der Wert des exportierten Aktivitätskomponenten “android:exported” ist im AndroidManifest.xml-Datei auf **“true”** gesetzt: ```markup ``` **Liste der exportierten Aktivitäten**: ```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 ``` **Start activity**: Vielleicht kannst du eine Aktivität starten und eine Art von Autorisierung umgehen, die dich daran hindern sollte, sie zu starten. ```bash dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList ``` Sie können auch eine exportierte Aktivität von **adb** starten: - PackageName ist com.example.demo - Exported ActivityName ist com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` ### Content Providers Dieser Beitrag war zu groß, um hier zu sein, also **kannst du** [**darauf auf seiner eigenen Seite hier zugreifen**](exploiting-content-providers.md). ### Services Ein exportierter Dienst wird in der Manifest.xml deklariert: ```markup ``` Im Code **überprüfen** Sie die \*\*`handleMessage`\*\* Funktion, die die **Nachricht** **empfängt**: ![](<../../../images/image (82).png>) #### Listendienst ```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 ``` #### **Interagieren** Sie mit einem Dienst ```bash app.service.send Send a Message to a service, and display the reply app.service.start Start Service app.service.stop Stop Service ``` #### Beispiel Schau dir die **drozer** Hilfe für `app.service.send` an: ![](<../../../images/image (1079).png>) Beachte, dass du zuerst die Daten in "_msg.what_" sendest, dann "_msg.arg1_" und "_msg.arg2_", du solltest im Code **überprüfen, welche Informationen verwendet werden** und wo.\ Mit der Option `--extra` kannst du etwas senden, das von "_msg.replyTo_" interpretiert wird, und mit `--bundle-as-obj` erstellst du ein Objekt mit den bereitgestellten Details. Im folgenden Beispiel: - `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 ``` ![](<../../../images/image (647).png>) ### Broadcast-Empfänger **Im Abschnitt über grundlegende Android-Informationen können Sie sehen, was ein Broadcast-Empfänger ist**. Nachdem Sie diese Broadcast-Empfänger entdeckt haben, sollten Sie **den Code** von ihnen überprüfen. Achten Sie besonders auf die **`onReceive`**-Funktion, da sie die empfangenen Nachrichten verarbeitet. #### **Alle** Broadcast-Empfänger erkennen ```bash run app.broadcast.info #Detects all ``` #### Überprüfen Sie die Broadcast-Receiver einer App ```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 ``` #### Broadcast **Interaktionen** ```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 ``` #### Nachricht senden In diesem Beispiel wird der [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider missbraucht, um **eine beliebige SMS** an ein nicht-premium Ziel **ohne Erlaubnis** des Benutzers zu senden. ![](<../../../images/image (415).png>) ![](<../../../images/image (573).png>) Wenn Sie den Code lesen, müssen die Parameter "_phoneNumber_" und "_message_" an den Content Provider gesendet werden. ```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!" ``` ### Ist debuggeable Eine Produktions-APK sollte niemals debuggeable sein.\ Das bedeutet, dass Sie einen **Java-Debugger** an die laufende Anwendung anhängen, sie zur Laufzeit inspizieren, Haltepunkte setzen, Schritt für Schritt vorgehen, Variablenwerte sammeln und sogar ändern können. [Das InfoSec Institute hat einen ausgezeichneten Artikel](../exploiting-a-debuggeable-applciation.md) darüber, wie man tiefer gräbt, wenn Ihre Anwendung debuggeable ist und zur Laufzeit Code injiziert. Wenn eine Anwendung debuggeable ist, wird sie im Manifest angezeigt: ```xml