hacktricks/src/mobile-pentesting/android-app-pentesting/exploiting-a-debuggeable-applciation.md

92 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# デバッグ可能なアプリケーションの悪用
{{#include ../../banners/hacktricks-training.md}}
# **ルートおよびデバッグ可能チェックの回避**
この投稿のこのセクションは、投稿の要約です [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
## Androidアプリをデバッグ可能にし、チェックを回避する手順
### **アプリをデバッグ可能にする**
内容は https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0 に基づいています。
1. **APKをデコンパイルする:**
- APKをデコンパイルするためにAPK-GUIツールを利用します。
- _android-manifest_ファイルに`android:debuggable=true`を挿入してデバッグモードを有効にします。
- 修正したアプリケーションを再コンパイル、署名、zipalignします。
2. **修正したアプリケーションをインストールする:**
- コマンド: `adb install <application_name>`を使用します。
3. **パッケージ名を取得する:**
- `adb shell pm list packages 3`を実行してサードパーティアプリケーションのリストを表示し、パッケージ名を見つけます。
4. **アプリをデバッガ接続待機状態に設定する:**
- コマンド: `adb shell am setup-debug-app w <package_name>`
- **注意:** このコマンドは、アプリケーションを開始する前に毎回実行する必要があります。
- 永続性を持たせるために、`adb shell am setup-debug-app w -persistent <package_name>`を使用します。
- すべてのフラグを削除するには、`adb shell am clear-debug-app <package_name>`を使用します。
5. **Android Studioでデバッグの準備をする:**
- Android Studioで _File -> Open Profile or APK_ に移動します。
- 再コンパイルしたAPKを開きます。
6. **重要なJavaファイルにブレークポイントを設定する:**
- `MainActivity.java`(特に`onCreate`メソッド)、`b.java`、および`ContextWrapper.java`にブレークポイントを置きます。
### **チェックの回避**
アプリケーションは、特定のポイントでデバッグ可能かどうかを確認し、ルートデバイスを示すバイナリもチェックします。デバッガを使用してアプリ情報を変更し、デバッグ可能ビットを解除し、検索されたバイナリの名前を変更してこれらのチェックを回避できます。
デバッグ可能チェックについて:
1. **フラグ設定を変更する:**
- デバッガコンソールの変数セクションで、`this mLoadedAPK -> mApplicationInfo -> flags = 814267974`に移動します。
- **注意:** `flags = 814267974`のバイナリ表現は`11000011100111011110`であり、「Flag_debuggable」がアクティブであることを示しています。
![https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png)
これらの手順は、アプリケーションがデバッグ可能であり、特定のセキュリティチェックをデバッガを使用して回避できることを保証し、アプリケーションの動作のより詳細な分析や変更を促進します。
ステップ2では、フラグ値を814267972に変更することが含まれ、これはバイナリで110000101101000000100010100として表されます。
# **脆弱性の悪用**
ボタンとテキストビューを含む脆弱なアプリケーションを使用してデモが提供されました。最初にアプリケーションは「Crack Me」と表示します。目的は、ソースコードを変更せずに、実行時に「Try Again」から「Hacked」にメッセージを変更することです。
## **脆弱性の確認**
- アプリケーションは`apktool`を使用してデコンパイルされ、`AndroidManifest.xml`ファイルにアクセスしました。
- AndroidManifest.xmlに`android_debuggable="true"`が存在することは、アプリケーションがデバッグ可能であり、悪用される可能性があることを示しています。
- `apktool`は、コードを変更せずにデバッグ可能ステータスを確認するためのみに使用されることに注意してください。
## **セットアップの準備**
- プロセスにはエミュレーターの起動、脆弱なアプリケーションのインストール、`adb jdwp`を使用してリスニングしているDalvik VMポートを特定することが含まれました。
- JDWPJava Debug Wire Protocolは、VM内で実行されているアプリケーションのデバッグを可能にし、ユニークなポートを公開します。
- リモートデバッグのためにポートフォワーディングが必要で、その後JDBをターゲットアプリケーションにアタッチしました。
## **実行時にコードを注入する**
- 悪用はブレークポイントを設定し、アプリケーションのフローを制御することによって行われました。
- `classes``methods <class_name>`のようなコマンドを使用してアプリケーションの構造を明らかにしました。
- `onClick`メソッドにブレークポイントを設定し、その実行を制御しました。
- `locals``next`、および`set`コマンドを使用してローカル変数を検査および変更し、「Try Again」メッセージを「Hacked」に変更しました。
- 修正されたコードは`run`コマンドを使用して実行され、アプリケーションの出力がリアルタイムで変更されました。
この例は、デバッグ可能なアプリケーションの動作がどのように操作できるかを示し、アプリケーションのコンテキスト内でデバイスへのシェルアクセスを取得するなどのより複雑な悪用の可能性を強調しています。
## 参考文献
- [https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
- [https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications)
{{#include ../../banners/hacktricks-training.md}}