hacktricks/pentesting-web/h2c-smuggling.md

142 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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

# アップグレードヘッダースマグリング
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
- [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
</details>
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
最も重要な脆弱性を見つけて修正を迅速化しましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリやクラウドシステムまで、技術スタック全体で問題を見つけます。[**無料でお試しください**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
## H2Cスマグリング <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
### クリアテキスト上のHTTP2H2C<a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
通常、HTTP接続は単一のリクエストの期間だけ続きます。しかし、H2Cまたは「**クリアテキスト上のhttp2**」は、通常の一時的なhttp接続をアップグレードして、平文のhttpプロトコルではなく、**http2バイナリプロトコルを使用して連続的に通信する永続接続**を作成します。
スマグリングの2番目の部分は、**リバースプロキシが使用される**場合に発生します。通常、httpリクエストがリバースプロキシに送信されると、プロキシはリクエストを処理し、一連のルーティングルールを処理してからバックエンドにリクエストを転送し、応答を返します。httpリクエストに`Connection: Upgrade`ヘッダーが含まれる場合websocket接続など、リバースプロキシはクライアントとサーバー間の**永続接続を維持**し、これらのプロトコルに必要な連続的な通信を可能にします。H2C接続の場合、RFCでは3つのヘッダーが存在することが要求されます
```
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
Connection: Upgrade, HTTP2-Settings
```
バグはどこにあるのでしょうか?**接続をアップグレードすると、リバースプロキシは個々のリクエストの処理を停止**し、接続が確立されたら、そのルーティングの役割は終了したと想定します。H2C Smugglingを使用すると、H2C接続を最初に確立できれば、リバースプロキシがリクエストの処理時に使用するルールパスベースのルーティング、認証、WAF処理などをバイパスできます。
![](<../.gitbook/assets/image (454).png>)
### 脆弱なプロキシ <a href="#exploitation" id="exploitation"></a>
脆弱性の説明からわかるように、プロキシサーバーは**Upgradeヘッダーを転送する必要があり**、**Connectionヘッダー**も正常に転送する必要がある場合があります。
デフォルトでは、次のサービスはプロキシパス中に**Upgrade**と**Connectionヘッダーを転送**し、h2c smugglingをすぐに有効にします。
* HAProxy
* Traefik
* Nuster
デフォルトでは、これらのサービスはプロキシパス中にUpgradeとConnectionヘッダーの両方を転送しませんが、**安全でない方法で構成できます**フィルタリングされていないUpgradeとConnectionヘッダーを渡すことにより
* AWS ALB/CLB
* NGINX
* Apache
* Squid
* Varnish
* Kong
* Envoy
* Apache Traffic Server
### 悪用 <a href="#exploitation" id="exploitation"></a>
元のブログ記事では、準拠したH2C接続のために必要なヘッダーをすべてのサーバーが転送しないことがわかりました。これは、AWS ALB/CLB、NGINX、Apache Traffic ServerなどのロードバランサーはデフォルトではH2C接続を防ぎます。しかし、ブログ記事の最後で、彼は「すべてのバックエンドが準拠していないため、`Connection: Upgrade`バリアントでテストできることに注意しています。この場合、`Connection`ヘッダーから`HTTP2-Settings`の値が省略されます。」
{% hint style="danger" %}
`proxy_pass` URLプロキシが接続を転送するエンドポイントが`http://backend:9999/socket.io`などの特定の**パス**を指していた場合でも、接続は`http://backend:9999`と確立されるため、このテクニックを悪用してその内部エンドポイント内の他のパスにアクセスできます。したがって、proxy_passのURLにパスが指定されているかどうかは重要ではありません。
{% endhint %}
[**https://github.com/BishopFox/h2csmuggler**](https://github.com/BishopFox/h2csmuggler) **および** [**https://github.com/assetnote/h2csmuggler**](https://github.com/assetnote/h2csmuggler)というツールを使用して、H2C接続を確立し、プロキシで保護されたリソースにアクセスするためにプロキシによって課せられた保護を**回避**することができます。
[**Nginxのこの脆弱性に関する詳細情報については、こちらのリンクを参照してください**](../network-services-pentesting/pentesting-web/nginx.md#proxy\_set\_header-upgrade-and-connection)。
## Websocket Smuggling
前のテクニックと同様に、このテクニックは**HTTP2トンネル**をプロキシ経由でアクセス可能なエンドポイントに作成するのではなく、**同じ目的のためにWebsocketトンネル**を作成し、**潜在的なプロキシの制限をバイパス**してエンドポイントに直接アクセスします。
![](<../.gitbook/assets/image (651) (2) (1).png>)
### シナリオ1
バックエンドには公開された**WebSocket API**と、外部からは利用できない**内部REST API**が公開されています。悪意のあるクライアントは内部REST APIにアクセスしたいと考えています。
**最初の**ステップでは、クライアントは**Upgradeリクエスト**をリバースプロキシに送信しますが、ヘッダー`Sec-WebSocket-Version`内に**間違ったプロトコルバージョン**を含めます。**プロキシ**は`Sec-WebSocket-Version`ヘッダーを検証せず、**Upgradeリクエストが正しい**と思います。さらに、リクエストをバックエンドに変換します。
**2番目の**ステップでは、バックエンドは**ステータスコード`426`のレスポンスを送信します**(プロトコルバージョンが正しくないため)。しかし、**リバースプロキシは**バックエンドからの応答(ステータスコードを含む)を**十分にチェックせず、バックエンドがWebSocket通信の準備ができていると思います**。さらに、リクエストをクライアントに変換します。
最終的に、リバース**プロキシは**クライアントとバックエンドの間に**WebSocket接続が確立されたと思います**。実際にはWebSocket接続は存在しません-バックエンドはUpgradeリクエストを拒否しました。同時に、プロキシはクライアントとバックエンドの間のTCPまたはTLS接続を開いたままにします。**クライアントはこの接続を介して簡単にプライベートREST APIにアクセスできます。**
![](https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png)
次のリバースプロキシが影響を受けることがわかりました。
* Varnish - チームは説明された問題を修正することを拒否しました。
* Envoy proxy 1.8.0(またはそれ以前)- 新しいバージョンではアップグレードメカニズムが変更されました。
* その他 - TBA。
### シナリオ2
ほとんどのリバースプロキシNGINXは、ハンドシェイクの一部でバックエンドからのステータスコードを**チェック**します。これにより、攻撃は難しくなりますが、不可能ではありません。
2番目のシナリオを見てみましょう。バックエンドには公開されたWebSocket APIと、外部からは利用できない**内部REST API**があります。悪意のあるクライアントは内部REST APIにアクセスしたいと考えています。リバースプロキシとしてNGINXが使用されています。WebSocket APIはパス`/api/socket.io/`で利用可能で、ヘルスチェックAPIはパス`/api/health`で利用可能です。
ヘルスチェックAPIは、POSTリクエストを送信して呼び出され、名前が`u`のパラメータがURLを制御します。バックエンドは外部リソースに到達し、ステータスコードをクライアントに返します。
**最初の**ステップでは、クライアントは**ヘルスチェックAPIを呼び出すためのPOSTリクエストを送信しますが、追加のHTTPヘッダー`Upgrade: websocket`を含めます**。NGINXはこれを**通常のUpgradeリクエスト**と見なし、リクエストの他の部分をスキップして`Upgrade`ヘッダーのみを確認します。さらに、プロキシはリクエストをバックエンドに変換します。
**2番目の**ステップでは、バックエンドがヘルスチェックAPIを呼び出します。悪意のあるユーザーが制御する外部リソースに到達し、HTTP **ステータスコード`101`のレスポンスを返します**。バックエンドはその応答をリバースプロキシに変換します。NGINXは
### ラボ
両方のシナリオをテストするために、[https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git)のラボをチェックしてください。
## 参考文献
* [https://blog.assetnote.io/2021/03/18/h2c-smuggling/](https://blog.assetnote.io/2021/03/18/h2c-smuggling/)
* [https://bishopfox.com/blog/h2c-smuggling-request](https://bishopfox.com/blog/h2c-smuggling-request)
* [https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git)
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
最も重要な脆弱性を見つけて修正できるようにしましょう。Intruderは、攻撃対象を追跡し、予防的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステム全体にわたる問題を見つけます。[**無料でお試しください**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- **サイバーセキュリティ企業で働いていますか?** **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
- [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
- **[💬](https://emojipedia.org/speech-balloon/) Discordグループ**に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter**で**私をフォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
</details>