Drozer Tutorial

Reading time: 9 minutes

tip

AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

APKs to test

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдХреБрдЫ рднрд╛рдЧ Drozer рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ pdf** рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рд╣реИрдВред**

Installation

Drozer Client рдХреЛ рдЕрдкрдиреЗ рд╣реЛрд╕реНрдЯ рдХреЗ рдЕрдВрджрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдЗрд╕реЗ latest releases рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

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

рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ latest releases рд╕реЗ drozer APK рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдЗрд╕ рд╕рдордп рдпрд╣ this рд╣реИред

bash
adb install drozer.apk

рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдирд╛

рдПрдЬреЗрдВрдЯ рдкреЛрд░реНрдЯ 31415 рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд╣рдореЗрдВ port forward рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ Drozer рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдПрдЬреЗрдВрдЯ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХрдорд╛рдВрдб рд╣реИ:

bash
adb forward tcp:31415 tcp:31415

рдЕрдВрдд рдореЗрдВ, launch рдХрд░реЗрдВ application рдФрд░ рдиреАрдЪреЗ "ON" рджрдмрд╛рдПрдВ

рдФрд░ рдЗрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

bash
drozer console connect

Interesting Commands

CommandsDescription
Help MODULEрдЪрдпрдирд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреА рдорджрдж рджрд┐рдЦрд╛рддрд╛ рд╣реИ
listрд╡рд░реНрддрдорд╛рди рд╕рддреНрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА drozer рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдЪрд┐рдд рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВред
shellрдПрдЬреЗрдВрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд▓рд┐рдирдХреНрд╕ рд╢реЗрд▓ рд╢реБрд░реВ рдХрд░реЗрдВред
cleanрдПрдВрдбреНрд░реЙрдЗрдб рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ drozer рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣рдЯрд╛ рджреЗрдВред
loaddrozer рдХрдорд╛рдВрдб рд╡рд╛рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
moduleрдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд drozer рдореЙрдбреНрдпреВрд▓ рдЦреЛрдЬреЗрдВ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
unsetрдПрдХ рдирд╛рдорд┐рдд рдЪрд░ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдЬрд┐рд╕реЗ drozer рдХрд┐рд╕реА рднреА рд▓рд┐рдирдХреНрд╕ рд╢реЗрд▓ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдпрд╣ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
setрдПрдХ рдорд╛рди рдХреЛ рдПрдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ рдЬрд┐рд╕реЗ drozer рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рд▓рд┐рдирдХреНрд╕ рд╢реЗрд▓ рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
shellрдПрдЬреЗрдВрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд▓рд┐рдирдХреНрд╕ рд╢реЗрд▓ рд╢реБрд░реВ рдХрд░реЗрдВред
run MODULEрдПрдХ drozer рдореЙрдбреНрдпреВрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
exploitDrozer рдирд┐рд░реНрдгрдп рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред drozer exploit list
payloadрдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХреЛ рдПрдХ рдкреЗрд▓реЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред drozer payload list

Package

рдирд╛рдо рдЦреЛрдЬреЗрдВ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рдХреЗ рднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реБрдП:

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

рдкреИрдХреЗрдЬ рдХреА рдореВрд▓ рдЬрд╛рдирдХрд╛рд░реА:

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

рдореИрдирд┐рдлреЗрд╕реНрдЯ рдкрдврд╝реЗрдВ:

bash
run app.package.manifest jakhar.aseem.diva

рдкреИрдХреЗрдЬ рдХреА рд╣рдорд▓реЗ рдХреА рд╕рддрд╣:

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
  • Activities: рд╢рд╛рдпрдж рдЖрдк рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреА рдЪрд╛рд╣рд┐рдПред
  • Content providers: рд╢рд╛рдпрдж рдЖрдк рдирд┐рдЬреА рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рдХрдордЬреЛрд░рд┐рдпреЛрдВ (SQL Injection рдпрд╛ Path Traversal) рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред
  • Services:
  • is debuggable: Learn more

Activities

An exported activity componentтАЩs тАЬandroid:exportedтАЭ value is set to тАЬtrueтАЭ in the AndroidManifest.xml file:

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

рдирд┐рд░реНрдпрд╛рддрд┐рдд рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА:

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:

рд╢рд╛рдпрдж рдЖрдк рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреА рдЪрд╛рд╣рд┐рдПред

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

рдЖрдк adb рд╕реЗ рдПрдХ рдирд┐рд░реНрдпрд╛рддрд┐рдд рдЧрддрд┐рд╡рд┐рдзрд┐ рднреА рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • PackageName com.example.demo рд╣реИ
  • Exported ActivityName com.example.test.MainActivity рд╣реИ
bash
adb shell am start -n com.example.demo/com.example.test.MainActivity

рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд╛рддрд╛

рдпрд╣ рдкреЛрд╕реНрдЯ рдпрд╣рд╛рдБ рдЗрддрдиреА рдмрдбрд╝реА рдереА рдХрд┐ рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рдЕрдкрдиреА рдкреГрд╖реНрда рдкрд░ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.

рд╕реЗрд╡рд╛рдПрдБ

рдПрдХ рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╕реЗрд╡рд╛ Manifest.xml рдХреЗ рдЕрдВрджрд░ рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:

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

рдХреЛрдб рдХреЗ рдЕрдВрджрд░ check рдХрд░реЗрдВ рдХрд┐ **handleMessage** рдлрд╝рдВрдХреНрд╢рди receive рдХрд░реЗрдЧрд╛ message:

рд╕реЗрд╡рд╛ рд╕реВрдЪреА

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

рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░реЗрдВ

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

рдЙрджрд╛рд╣рд░рдг

Take a look to the drozer help for app.service.send:

Note that you will be sending first the data inside "msg.what", then "msg.arg1" and "msg.arg2", you should check inside the code which information is being used and where.
Using the --extra option you can send something interpreted by "msg.replyTo", and using --bundle-as-obj you create and object with the provided details.

In the following example:

  • 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

Broadcast Receivers

Android рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Broadcast Receiver рдХреНрдпрд╛ рд╣реИред

рдЗрди Broadcast Receivers рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдЙрдирдХрд╛ рдХреЛрдб рдЪреЗрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВ onReceive рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред

рд╕рднреА рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рд░рд┐рд╕реАрд╡рд░реНрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ

bash
run app.broadcast.info #Detects all

рдПрдХ рдРрдк рдХреЗ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рд░рд┐рд╕реАрд╡рд░реНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ

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 Interactions

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

рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ FourGoats apk Content Provider рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЖрдк рдХрд┐рд╕реА рднреА рдЧреИрд░-рдкреНрд░реАрдорд┐рдпрдо рдЧрдВрддрд╡реНрдп рдкрд░ рдордирдЪрд╛рд╣рд╛ SMS рдмрд┐рдирд╛ рдЕрдиреБрдорддрд┐ рдорд╛рдВрдЧреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдХреЛрдб рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ "phoneNumber" рдФрд░ "message" рдкреИрд░рд╛рдореАрдЯрд░ Content Provider рдХреЛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред

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!"

Is debuggeable

рдПрдХ рдкреНрд░реЛрдбрдХреНрд╢рди APK рдХрднреА рднреА рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдбрд┐рдмрдЧрд░ рдХреЛ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрджрдо рд╕реЗ рдХрджрдо рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдорд╛рди рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓ рднреА рд╕рдХрддреЗ рд╣реИрдВред InfoSec institute has an excellent article рдЬрдм рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдкрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЬрдм рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

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

рдЖрдк рд╕рднреА рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ Drozer рдХреЗ рд╕рд╛рде рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ:

bash
run app.package.debuggable

Tutorials

More info

tip

AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ