diff --git a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md index 7f41d6836..23fd190f7 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md +++ b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md @@ -4,13 +4,13 @@ ## タスク、バックスタックとフォアグラウンドアクティビティ -Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた時に基づいて順序付けられ、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。 +Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた順に並べられ、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。 アクティビティの遷移の簡単な内訳は以下の通りです: - **アクティビティ 1** はフォアグラウンドの唯一のアクティビティとして開始されます。 -- **アクティビティ 2** を起動すると、**アクティビティ 1** がバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに表示されます。 -- **アクティビティ 3** を開始すると、**アクティビティ 1** と **アクティビティ 2** がスタックのさらに後ろに移動し、**アクティビティ 3** が前面に出ます。 +- **アクティビティ 2** を起動すると、**アクティビティ 1** はバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに来ます。 +- **アクティビティ 3** を開始すると、**アクティビティ 1** と **アクティビティ 2** はスタックのさらに後ろに移動し、**アクティビティ 3** が前面に出ます。 - **アクティビティ 3** を閉じると、**アクティビティ 2** が再びフォアグラウンドに戻り、Androidの効率的なタスクナビゲーションメカニズムを示します。 ![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>) @@ -19,25 +19,31 @@ Androidにおいて、**タスク**はユーザーが特定の作業を完了す ### タスクアフィニティと起動モードの概要 -Androidアプリケーションにおいて、**タスクアフィニティ**はアクティビティの好ましいタスクを指定し、通常はアプリのパッケージ名に一致します。この設定は、攻撃を示すための概念実証(PoC)アプリを作成する際に重要です。 +Androidアプリケーションにおいて、**タスクアフィニティ**はアクティビティの好ましいタスクを指定し、通常はアプリのパッケージ名に一致します。この設定は、攻撃を示すための概念実証(PoC)アプリを作成するのに重要です。 ### 起動モード -`launchMode`属性は、タスク内のアクティビティインスタンスの処理を指示します。**singleTask**モードはこの攻撃にとって重要であり、既存のアクティビティインスタンスとタスクアフィニティの一致に基づいて3つのシナリオを指示します。この脆弱性は、攻撃者のアプリがターゲットアプリのタスクアフィニティを模倣する能力に依存し、Androidシステムを誤導して攻撃者のアプリを起動させることにあります。 +`launchMode`属性は、タスク内のアクティビティインスタンスの処理を指示します。**singleTask**モードはこの攻撃にとって重要であり、既存のアクティビティインスタンスとタスクアフィニティの一致に基づいて3つのシナリオを指示します。攻撃者のアプリがターゲットアプリのタスクアフィニティを模倣する能力に依存し、Androidシステムを誤導して攻撃者のアプリを起動させます。 ### 詳細な攻撃手順 1. **悪意のあるアプリのインストール**: 被害者は攻撃者のアプリをデバイスにインストールします。 2. **初期アクティベーション**: 被害者は最初に悪意のあるアプリを開き、攻撃の準備をします。 3. **ターゲットアプリの起動試行**: 被害者はターゲットアプリを開こうとします。 -4. **ハイジャックの実行**: 一致するタスクアフィニティにより、悪意のあるアプリがターゲットアプリの代わりに起動されます。 +4. **ハイジャックの実行**: ある時点でアプリが**singleTask**ビューを開こうとします。タスクアフィニティが一致するため、悪意のあるアプリがターゲットアプリの代わりに起動されます。 5. **欺瞞**: 悪意のあるアプリはターゲットアプリに似た偽のログイン画面を表示し、ユーザーを騙して機密情報を入力させます。 +> [!TIP] +> この攻撃が機能するためには、脆弱なビューが**exported to true**である必要はなく、メインアクティビティである必要もありません。 + この攻撃の実践的な実装については、GitHubのTask Hijacking Strandhoggリポジトリを参照してください: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg)。 ### 予防策 -このような攻撃を防ぐために、開発者は`taskAffinity`を空の文字列に設定し、`singleInstance`起動モードを選択することで、他のアプリからの隔離を確保できます。`onBackPressed()`関数をカスタマイズすることで、タスクハイジャックに対する追加の保護を提供します。 +このような攻撃を防ぐために、開発者は以下を行うことができます: +- **`taskAffinity`**を**singleTask**ビューの空文字列に設定する (`android:taskAffinity=""`) +- **`singleInstance`**起動モードを選択し、他のアプリからの隔離を確保する。 +- **`onBackPressed()`**関数をカスタマイズして、タスクハイジャックに対する追加の保護を提供する。 ## **参考文献** diff --git a/src/mobile-pentesting/android-app-pentesting/react-native-application.md b/src/mobile-pentesting/android-app-pentesting/react-native-application.md index 665eecbe5..6d2b65522 100644 --- a/src/mobile-pentesting/android-app-pentesting/react-native-application.md +++ b/src/mobile-pentesting/android-app-pentesting/react-native-application.md @@ -6,25 +6,33 @@ 1. APK ファイルの名前を zip 拡張子に変更し、コマンド `cp com.example.apk example-apk.zip` と `unzip -qq example-apk.zip -d ReactNative` を使用して新しいフォルダーに抽出します。 -2. 新しく作成された ReactNative フォルダーに移動し、assets フォルダーを見つけます。このフォルダー内に、minified 形式の React JavaScript を含む `index.android.bundle` ファイルがあるはずです。 +2. 新しく作成された ReactNative フォルダーに移動し、assets フォルダーを見つけます。このフォルダー内に、React JavaScript がミニファイされた形式で含まれている `index.android.bundle` ファイルがあるはずです。 3. コマンド `find . -print | grep -i ".bundle$"` を使用して JavaScript ファイルを検索します。 -JavaScript コードをさらに分析するために、同じディレクトリに `index.html` という名前のファイルを作成し、以下のコードを記述します: +## Javascript コード + +`index.android.bundle` の内容を確認すると、アプリケーションの JavaScript コード(ミニファイされていても)を見つけることができれば、**機密情報や脆弱性を見つけるために分析できます**。 + +バンドルには実際にアプリケーションのすべての JS コードが含まれているため、**異なるファイルに分割することが可能です**(逆アセンブルを容易にする可能性があります) **ツール [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)** を使用して。 + +### Webpack + +JavaScript コードをさらに分析するには、ファイルを [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) にアップロードするか、以下の手順に従ってください。 + +1. 同じディレクトリに `index.html` という名前のファイルを作成し、次のコードを記述します: ```html ``` -ファイルを[https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/)にアップロードするか、次の手順に従ってください。 +2. `index.html`ファイルをGoogle Chromeで開きます。 -1. Google Chromeで`index.html`ファイルを開きます。 +3. **OS Xの場合はCommand+Option+J**、**Windowsの場合はControl+Shift+J**を押してDeveloper Toolbarを開きます。 -2. **OS Xの場合はCommand+Option+J**、**Windowsの場合はControl+Shift+J**を押してDeveloper Toolbarを開きます。 - -3. Developer Toolbarで「Sources」をクリックします。フォルダーとファイルに分割されたJavaScriptファイルが表示され、メインバンドルを構成しています。 +4. Developer Toolbarで「Sources」をクリックします。フォルダとファイルに分かれたJavaScriptファイルが表示され、メインバンドルを構成しています。 `index.android.bundle.map`というファイルが見つかれば、ソースコードを未圧縮形式で分析できます。マップファイルにはソースマッピングが含まれており、圧縮された識別子をマッピングすることができます。 -機密の資格情報やエンドポイントを検索するには、次の手順に従ってください。 +機密の資格情報やエンドポイントを検索するには、次の手順に従います。 1. JavaScriptコードを分析するための機密キーワードを特定します。React Nativeアプリケーションは、Firebase、AWS S3サービスエンドポイント、プライベートキーなどのサードパーティサービスを使用することがよくあります。 @@ -32,8 +40,42 @@ JavaScript コードをさらに分析するために、同じディレクトリ 3. 再コンプロセス中にJavaScriptコード内で機密のハードコーディングされた資格情報が見つかったのは幸運でした。 +### JSコードを変更して再構築 + +この場合、コードを変更するのは簡単です。アプリの名前を`.zip`拡張子に変更し、抽出するだけです。次に、このバンドル内の**JSコードを修正してアプリを再構築**できます。これで、テスト目的でアプリに**コードを注入**することができるはずです。 + +## Hermesバイトコード + +バンドルに**Hermesバイトコード**が含まれている場合、アプリのJavaScriptコードに**アクセスできなくなります**(圧縮版にもアクセスできません)。 + +バンドルにHermesバイトコードが含まれているかどうかは、次のコマンドを実行して確認できます: +```bash +file index.android.bundle +index.android.bundle: Hermes JavaScript bytecode, version 96 +``` +しかし、ツール **[hbctool](https://github.com/bongtrop/hbctool)**、**[hermes-dec](https://github.com/P1sec/hermes-dec)**、または **[hermes_rs](https://github.com/Pilfer/hermes_rs)** を使用して **バイトコードを逆アセンブル**し、さらに **それを擬似JSコードにデコンパイル**することができます。これを行うために、例えば以下のコマンドを使用します: +```bash +hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm +hbc-decompiler ./index.android.bundle /tmp/my_output_file.js +``` +### コードの変更と再構築 + +理想的には、逆アセンブルされたコードを修正(比較や値の変更など)し、**バイトコードを再構築**してアプリを再構築できるべきです。 + +ツール **[hbctool](https://github.com/bongtrop/hbctool)** は、バンドルを逆アセンブルし、変更後に再構築することをサポートしていますが、**古いバージョン**のHermesバイトコードのみをサポートしています。 + +ツール **[hermes-dec](https://github.com/P1sec/hermes-dec)** は、バイトコードの再構築をサポートしていません。 + +ツール **[hermes_rs](https://github.com/Pilfer/hermes_rs)** は、バイトコードの再構築をサポートしていますが、実際にはライブラリでありCLIツールではありません。 + +## 動的分析 + +アプリを動的に分析する方法として、Fridaを使用してReactアプリの開発者モードを有効にし、**`react-native-debugger`** をアタッチすることが考えられます。ただし、これにはアプリのソースコードが必要なようです。詳細については、[https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/)を参照してください。 + ## 参考文献 - [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7) +- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications) +- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/tapjacking.md b/src/mobile-pentesting/android-app-pentesting/tapjacking.md index da718c3ae..71fb1f86e 100644 --- a/src/mobile-pentesting/android-app-pentesting/tapjacking.md +++ b/src/mobile-pentesting/android-app-pentesting/tapjacking.md @@ -4,27 +4,29 @@ ## **基本情報** -**Tapjacking** は、**悪意のある** **アプリケーション** が起動し、**被害者アプリケーションの上に位置する** 攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、その間にその対話を被害者アプリに渡します。\ +**Tapjacking**は、**悪意のある** **アプリケーション**が起動し、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、同時にその対話を被害者アプリに渡します。\ 実際には、**ユーザーが実際に被害者アプリでアクションを実行していることを知らないようにしています**。 ### 検出 -この攻撃に対して脆弱なアプリを検出するには、Androidマニフェスト内の**エクスポートされたアクティビティ**を検索する必要があります(インテントフィルターを持つアクティビティはデフォルトで自動的にエクスポートされることに注意してください)。エクスポートされたアクティビティを見つけたら、**それらが何らかの権限を必要とするか確認してください**。これは、**悪意のあるアプリケーションもその権限を必要とするためです**。 +この攻撃に対して脆弱なアプリを検出するには、androidマニフェスト内の**エクスポートされたアクティビティ**を検索する必要があります(インテントフィルターを持つアクティビティはデフォルトで自動的にエクスポートされることに注意してください)。エクスポートされたアクティビティを見つけたら、**それらが何らかの権限を必要とするか確認してください**。これは、**悪意のあるアプリケーションもその権限を必要とするためです**。 + +アプリの最小SDKバージョンを確認することもできます。**`AndroidManifest.xml`**ファイル内の**`android:minSdkVersion`**の値を確認してください。値が**30未満**の場合、そのアプリはTapjackingに対して脆弱です。 ### 保護 #### Android 12 (API 31,32) 以降 -[**この情報源によると**](https://www.geeksforgeeks.org/tapjacking-in-android/)**、** tapjacking攻撃はAndroid 12 (API 31 & 30) 以降、Androidによって自動的に防止されます。したがって、アプリケーションが脆弱であっても、**それを悪用することはできません**。 +[**この情報源によると**](https://www.geeksforgeeks.org/tapjacking-in-android/)**、**Tapjacking攻撃はAndroid 12 (API 31 & 30) 以降で自動的に防止されます。したがって、アプリケーションが脆弱であっても、**それを悪用することはできません**。 #### `filterTouchesWhenObscured` -**`android:filterTouchesWhenObscured`** が **`true`** に設定されている場合、`View` は別の可視ウィンドウによってウィンドウが隠されているときにタッチを受け取ることはありません。 +**`android:filterTouchesWhenObscured`**が**`true`**に設定されている場合、`View`は別の可視ウィンドウによってウィンドウが隠されているときにタッチを受け取ることはありません。 #### **`setFilterTouchesWhenObscured`** -属性 **`setFilterTouchesWhenObscured`** を true に設定することでも、この脆弱性の悪用を防ぐことができます。\ -例えば、**`true`** に設定されている場合、ボタンは自動的に**隠されている場合無効化される**ことがあります: +属性**`setFilterTouchesWhenObscured`**がtrueに設定されている場合、Androidバージョンが低い場合でもこの脆弱性の悪用を防ぐことができます。\ +例えば、**`true`**に設定されている場合、ボタンは**隠されている場合に自動的に無効化される**ことがあります: ```xml