From 4b9a2c30b476988c734a240702f1eadda045bb3b Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 12 Jul 2025 18:08:50 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/ios-pentesting/ios-pentesting-without --- .../ios-pentesting-without-jailbreak.md | 24 ++--- .../request-smuggling-in-http-2-downgrades.md | 95 ++++++++++++++++++- 2 files changed, 106 insertions(+), 13 deletions(-) diff --git a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md index 70e5fdf06..7cff53537 100644 --- a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md +++ b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md @@ -4,9 +4,9 @@ ## Main idea -**entitlement `get_task_allow`** で署名されたアプリケーションは、初期アプリケーションのプロセスIDを引数として **`task_for_pid()`** という関数を実行することを許可し、その上でタスクポートを取得(制御し、メモリにアクセスできるように)します。 +**entitlement `get_task_allow`** で署名されたアプリケーションは、初期アプリケーションのプロセスIDを引数として **`task_for_pid()`** という関数を実行することを許可し、その上でタスクポートを取得(制御し、メモリにアクセスできるようにする)します。 -しかし、単にIPAを引き出し、権限で再署名してデバイスに戻すだけでは簡単ではありません。これはFairPlay保護のためです。アプリの署名が変更されると、DRM(デジタル著作権管理)キーが **無効化され、アプリは動作しなくなります**。 +しかし、単にIPAを引き出し、権限で再署名し、デバイスに戻すだけでは簡単ではありません。これはFairPlay保護のためです。アプリの署名が変更されると、DRM(デジタル著作権管理)キーが **無効化され、アプリは動作しなくなります**。 古い脱獄デバイスを使用すれば、IPAをインストールし、**お気に入りのツールを使用して復号化**(Iridiumやfrida-ios-dumpなど)し、デバイスから引き出すことが可能です。ただし、可能であれば、復号化されたIPAをクライアントにそのまま依頼することをお勧めします。 @@ -17,15 +17,15 @@ 1. ペンテストするアプリをiPhoneにインストールします。 2. macOS内で[Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12)をインストールして起動します。 3. Macの`Terminal`を開き、`/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`にcdします。後でこのフォルダにIPAが表示されます。 -4. iOSデバイスが表示されるはずです。ダブルクリックして、上部メニューバーからAdd + → Appsをクリックします。 +4. あなたのiOSデバイスが表示されるはずです。それをダブルクリックし、上部メニューバーからAdd + → Appsをクリックします。 5. Addをクリックすると、ConfiguratorがAppleからIPAをダウンロードし、デバイスにプッシュしようとします。前に私の推奨に従ってIPAをすでにインストールしている場合、アプリを再インストールするように求めるプロンプトが表示されます。 -6. IPAは`/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`内にダウンロードされ、そこから取得できます。 +6. IPAは `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` 内にダウンロードされ、そこから取得できます。 このプロセスに関する詳細情報は[https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)を確認してください。 ### Decrypting the app -IPAを復号化するために、インストールします。ただし、古い脱獄iPhoneを持っている場合、アプリケーションがサポートするのは通常最新のバージョンのみであるため、バージョンがサポートされない可能性があります。 +IPAを復号化するために、インストールします。ただし、古い脱獄iPhoneを持っている場合、アプリケーションがサポートするバージョンではない可能性があります。通常、アプリは最新のバージョンのみをサポートします。 したがって、インストールするには、IPAを解凍するだけです: ```bash @@ -46,9 +46,9 @@ ideviceinstaller -i no-min-version.ipa -w インストールが完了したら、Cydia から **Iridium tweak** を使用して復号化された IPA を取得できます。 -### エンタイトルメントのパッチと再署名 +### 権限のパッチと再署名 -`get-task-allow` エンタイトルメントでアプリケーションを再署名するために、`app-signer`、`codesign`、および `iResign` のようなツールがいくつか利用可能です。`app-signer` は非常にユーザーフレンドリーなインターフェースを持ち、再署名する IPA ファイルを指定し、**`get-task-allow` を設定し**、使用する証明書とプロビジョニングプロファイルを指定することができます。 +`get-task-allow` 権限でアプリケーションを再署名するために、`app-signer`、`codesign`、および `iResign` などのいくつかのツールが利用可能です。`app-signer` は、再署名する IPA を指定し、**`get-taks-allow`** を設定し、使用する証明書とプロビジョニングプロファイルを指定する非常に使いやすいインターフェースを持っています。 証明書と署名プロファイルに関しては、Apple は Xcode を通じてすべてのアカウントに **無料の開発者署名プロファイル** を提供しています。アプリを作成し、1つを設定してください。その後、`Settings` → `Privacy & Security` に移動し、`Developer Mode` をクリックして **iPhone に開発者アプリを信頼させる** ように設定します。 @@ -66,18 +66,18 @@ iOS 16以降、Appleは**Developer Mode**を導入しました。`get_task_allow 2. **設定 → プライバシーとセキュリティ → Developer Mode**に移動し、オンに切り替えます。 3. デバイスが再起動します。パスコードを入力した後、Developer Modeを**オンにする**ように求められます。 -Developer Modeは、無効にするか電話を初期化するまでアクティブなままですので、このステップはデバイスごとに一度だけ実行する必要があります。[Appleのドキュメント](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device)がセキュリティの影響を説明しています。 +Developer Modeは、無効にするか電話を初期化するまでアクティブなままであるため、このステップはデバイスごとに一度だけ実行する必要があります。[Appleのドキュメント](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device)がセキュリティの影響を説明しています。 ### 現代のサイドロードオプション -現在、脱獄なしでサイドロードし、再署名されたIPAを最新の状態に保つための成熟した方法がいくつかあります: +現在、脱獄なしでIPAをサイドロードし、再署名を最新の状態に保つための成熟した方法がいくつかあります: | ツール | 要件 | 強み | 制限 | |------|--------------|-----------|-------------| -| **AltStore 2 / SideStore** | IPAを7日ごとに無料の開発プロファイルで再署名するmacOS/Windows/Linuxのコンパニオン | Wi-Fi経由の自動リロード、iOS 17まで動作 | 同じネットワーク上にコンピュータが必要、Appleによる3アプリ制限 | +| **AltStore 2 / SideStore** | macOS/Windows/Linuxのコンパニオンが7日ごとに無料の開発プロファイルでIPAを再署名 | Wi-Fi経由の自動リロード、iOS 17まで動作 | 同じネットワーク上にコンピュータが必要、Appleによる3アプリ制限 | | **TrollStore 1/2** | CoreTrustバグに脆弱なiOS 14 – 15.4.1のデバイス | *永久的*な署名(7日制限なし);インストール後はコンピュータ不要 | iOS 15.5+ではサポートされていない(バグが修正された) | -現在のiOSバージョンでのルーチンなペンテストには、Alt/Side-Storeが通常最も実用的な選択肢です。 +現在のiOSバージョンでのルーチンのペンテストには、Alt/Side-Storeが通常最も実用的な選択肢です。 ### フック / 動的インスツルメンテーション @@ -93,7 +93,7 @@ frida -U -f com.example.target -l my_script.js --no-pause ### Jailbreakなしの自動動的分析(MobSF) -[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/)は、実際のデバイス上でdevサインされたIPAを同じ技術(`get_task_allow`)を使用してインスツルメントし、ファイルシステムブラウザ、トラフィックキャプチャ、Fridaコンソールを備えたWeb UIを提供します【】。最も簡単な方法は、DockerでMobSFを実行し、USB経由でiPhoneを接続することです: +[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/)は、実際のデバイス上で同じ技術(`get_task_allow`)を使用して、開発者署名されたIPAをインストゥルメント化でき、ファイルシステムブラウザ、トラフィックキャプチャ、Fridaコンソールを備えたWeb UIを提供します【†L2-L3】。最も簡単な方法は、DockerでMobSFを実行し、USB経由でiPhoneを接続することです: ```bash docker pull opensecurity/mobile-security-framework-mobsf:latest docker run -p 8000:8000 --privileged \ diff --git a/src/pentesting-web/http-request-smuggling/request-smuggling-in-http-2-downgrades.md b/src/pentesting-web/http-request-smuggling/request-smuggling-in-http-2-downgrades.md index b532c0074..e8bab848d 100644 --- a/src/pentesting-web/http-request-smuggling/request-smuggling-in-http-2-downgrades.md +++ b/src/pentesting-web/http-request-smuggling/request-smuggling-in-http-2-downgrades.md @@ -2,6 +2,99 @@ {{#include ../../banners/hacktricks-training.md}} -**投稿を確認してください [https://portswigger.net/research/http-2-downgrades](https://portswigger.net/research/http-2-downgrades)** +HTTP/2は一般的に古典的なリクエストスムージングに対して免疫があると考えられていますが、**フロントエンドプロキシがリクエストをHTTP/1.xに「ダウングレード」してバックエンドに転送する際、その保護は消えます**。異なる2つのパーサー(HTTP/2フロントエンドとHTTP/1バックエンド)が、1つのリクエストが終了し次のリクエストが始まる場所について合意しようとすると、古いデシンクトリックがすべて戻ってきます - さらにいくつかの新しいものも。 + +--- +## ダウングレードが発生する理由 + +1. ブラウザはすでにHTTP/2を話しますが、古いオリジンインフラストラクチャはまだHTTP/1.1しか理解していません。 +2. リバースプロキシ(CDN、WAF、ロードバランサー)は、したがって、エッジでTLS + HTTP/2を終了し、**すべてのリクエストをHTTP/1.1としてオリジンに書き換えます**。 +3. 翻訳ステップは、オリジンがボディの長さを決定できるようにするために、*両方の* `Content-Length` **および/または** `Transfer-Encoding: chunked` ヘッダーを作成する必要があります。 + +フロントエンドがHTTP/2フレームの長さを信頼し**ているが**、バックエンドがCLまたはTEを信頼している場合、攻撃者はそれらが不一致になるように強制できます。 + +--- +## 2つの主要なプリミティブクラス + +| バリアント | フロントエンドの長さ | バックエンドの長さ | 一般的なペイロード | +|---------|-----------------|-----------------|-----------------| +| **H2.TE** | HTTP/2フレーム | `Transfer-Encoding: chunked` | 最終的な `0\r\n\r\n` が*送信されない*追加のチャンクメッセージボディを埋め込むことで、バックエンドは攻撃者が提供した「次の」リクエストを待ちます。 | +| **H2.CL** | HTTP/2フレーム | `Content-Length` | 実際のボディよりも*小さい*CLを送信することで、バックエンドは境界を越えて次のリクエストを読み取ります。 | + +> これらは、古典的なTE.CL / CL.TEと精神的に同じであり、単にHTTP/2がパーサーの1つを置き換えています。 + +--- +## ダウングレードチェーンの特定 + +1. TLSハンドシェイクで**ALPN**を使用する(`openssl s_client -alpn h2 -connect host:443`)または**curl**: +```bash +curl -v --http2 https://target +``` +`* Using HTTP2`が表示される場合、エッジはH2を話します。 +2. 意図的に不正なCL/TEリクエストをHTTP/2経由で送信します(Burp RepeaterにはHTTP/2を強制するためのドロップダウンがあります)。応答が`400 Bad chunk`のようなHTTP/1.1エラーである場合、エッジが下流のHTTP/1パーサー用にトラフィックを変換した証拠があります。 + +--- +## 攻撃ワークフロー(H2.TEの例) +```http +:method: POST +:path: /login +:scheme: https +:authority: example.com +content-length: 13 # ignored by the edge +transfer-encoding: chunked + +5;ext=1\r\nHELLO\r\n +0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X +``` +1. **フロントエンド**は正確に13バイト(`HELLO\r\n0\r\n\r\nGE`)を読み取り、リクエストが終了したと考え、その分をオリジンに転送します。 +2. **バックエンド**はTEヘッダーを信頼し、*2番目*の`0\r\n\r\n`を見るまで読み続け、攻撃者の2番目のリクエストのプレフィックス(`GET /admin …`)を消費します。 +3. 残り(`GET /admin …`)は被害者の後ろにキューイングされた*新しい*リクエストとして扱われます。 + +密輸されたリクエストを次のように置き換えます: +* `POST /api/logout` セッション固定を強制するため +* `GET /users/1234` 被害者特有のリソースを盗むため + +--- +## h2cスムグリング(クリアテキストアップグレード) + +2023年の研究では、フロントエンドがクリアテキストHTTP/2をサポートするバックエンドにHTTP/1.1 `Upgrade: h2c`ヘッダーを渡すと、攻撃者が*生*のHTTP/2フレームをHTTP/1.1のみを検証したエッジを通してトンネルできることが示されました。これにより、ヘッダーの正規化、WAFルール、さらにはTLS終端を回避します。 + +主な要件: +* エッジは**両方**の`Connection: Upgrade`と`Upgrade: h2c`を変更せずに転送します。 +* オリジンはHTTP/2に増分し、リクエストキューイングを可能にする接続再利用のセマンティクスを保持します。 + +緩和策は簡単です – WebSocketを除いて、エッジで`Upgrade`ヘッダーを削除またはハードコーディングします。 + +--- +## 注目すべき実世界のCVE(2022-2025) + +* **CVE-2023-25690** – Apache HTTP Serverのmod_proxyリライトルールは、リクエスト分割とスムグリングのために連鎖させることができました。(2.4.56で修正) +* **CVE-2023-25950** – HAProxy 2.7/2.6は、HTXパーサーがパイプライン化されたリクエストを誤って処理した場合にリクエスト/レスポンスのスムグリングが発生しました。 +* **CVE-2022-41721** – Goの`MaxBytesHandler`は、残りのボディバイトを**HTTP/2**フレームとして解析し、クロスプロトコルスムグリングを可能にしました。 + +--- +## ツール + +* **Burp Request Smuggler** – v1.26以降、H2.TE/H2.CLおよび隠れたALPNサポートを自動的にテストします。拡張オプションで「HTTP/2プロービング」を有効にします。 +* **h2cSmuggler** – Bishop Foxによるクリアテキストアップグレード攻撃を自動化するPython PoC: +```bash +python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n' +``` +* **curl**/`hyper` – 手動ペイロードの作成:`curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target`。 + +--- +## 防御策 + +1. **エンドツーエンドHTTP/2** – ダウングレード翻訳を完全に排除します。 +2. **長さの真実の単一ソース** – ダウングレード時には、*常に*有効な`Content-Length`を生成し、**ユーザー提供の`Content-Length`/`Transfer-Encoding`ヘッダーを**削除**します。 +3. **ルート前の正規化** – ルーティング/リライトロジックの*前に*ヘッダーのサニタイズを適用します。 +4. **接続の隔離** – ユーザー間でバックエンドTCP接続を再利用しないでください。「1接続あたり1リクエスト」はキューに基づく攻撃を無効にします。 +5. **WebSocketでない限り`Upgrade`を削除** – h2cトンネリングを防ぎます。 + +--- +## 参考文献 + +* PortSwigger Research – “HTTP/2: The Sequel is Always Worse” +* Bishop Fox – “h2c Smuggling: request smuggling via HTTP/2 clear-text” {{#include ../../banners/hacktricks-training.md}}