hacktricks/pentesting-web/h2c-smuggling.md

121 lines
12 KiB
Markdown
Raw Normal View History

# アップグレードヘッダーのスモグリング
2022-04-28 16:01:33 +00:00
{% hint style="success" %}
AWSハッキングを学び、実践する<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>HackTricksをサポートする</summary>
2022-04-28 16:01:33 +00:00
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
### H2Cスモグリング <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
#### HTTP2オーバークリアテキスト (H2C) <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
H2C、または**http2オーバークリアテキスト**は、標準のHTTP**接続を持続的なものにアップグレードする**ことで、一時的なHTTP接続の規範から逸脱します。このアップグレードされた接続は、平文HTTPの単一リクエストの性質とは対照的に、継続的な通信のためにhttp2バイナリプロトコルを利用します。
スモグリングの問題の核心は、**リバースプロキシ**の使用にあります。通常、リバースプロキシはHTTPリクエストを処理し、バックエンドに転送し、その後バックエンドの応答を返します。しかし、HTTPリクエストに`Connection: Upgrade`ヘッダーが存在する場合(一般的にウェブソケット接続で見られる)、リバース**プロキシはクライアントとサーバー間の持続的な接続を維持し、特定のプロトコルに必要な継続的な交換を促進します**。H2C接続の場合、RFCに従うためには、3つの特定のヘッダーが必要です
```
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
Connection: Upgrade, HTTP2-Settings
```
脆弱性は、接続をアップグレードした後、リバースプロキシが個々のリクエストの管理を停止し、接続確立後にルーティングの仕事が完了したと仮定する場合に発生します。H2Cスムージングを悪用することで、H2C接続が正常に開始されると仮定して、リクエスト処理中に適用されるリバースプロキシルールパスベースのルーティング、認証、WAF処理などを回避できます。
#### 脆弱なプロキシ <a href="#exploitation" id="exploitation"></a>
この脆弱性は、リバースプロキシが`Upgrade`および時には`Connection`ヘッダーをどのように処理するかに依存します。以下のプロキシは、プロキシパス中にこれらのヘッダーを本質的に転送し、H2Cスムージングを本質的に可能にします
2022-06-19 13:37:58 +00:00
* HAProxy
* Traefik
* Nuster
2022-06-19 13:37:58 +00:00
逆に、これらのサービスはプロキシパス中に両方のヘッダーを本質的に転送しません。しかし、設定が不適切である場合、`Upgrade`および`Connection`ヘッダーのフィルタリングされていない転送を許可することがあります:
* AWS ALB/CLB
* NGINX
* Apache
* Squid
* Varnish
* Kong
* Envoy
* Apache Traffic Server
2022-06-19 13:37:58 +00:00
#### 悪用 <a href="#exploitation" id="exploitation"></a>
すべてのサーバーが準拠したH2C接続アップグレードに必要なヘッダーを本質的に転送するわけではないことに注意することが重要です。そのため、AWS ALB/CLB、NGINX、Apache Traffic Serverなどのサーバーは、自然にH2C接続をブロックします。それにもかかわらず、`Connection: Upgrade`の非準拠バリアントを使用してテストする価値があります。これは、`Connection`ヘッダーから`HTTP2-Settings`値を除外します。一部のバックエンドは標準に準拠していない可能性があります。
2022-06-19 13:37:58 +00:00
{% hint style="danger" %}
`proxy_pass` URLに指定された特定の**パス**(例:`http://backend:9999/socket.io`)に関係なく、確立された接続はデフォルトで`http://backend:9999`になります。これにより、この技術を利用して、その内部エンドポイント内の任意のパスと対話できます。したがって、`proxy_pass` URLにパスを指定してもアクセスは制限されません。
2022-06-19 13:37:58 +00:00
{% endhint %}
ツール[**h2csmuggler by BishopFox**](https://github.com/BishopFox/h2csmuggler)および[**h2csmuggler by assetnote**](https://github.com/assetnote/h2csmuggler)は、H2C接続を確立することにより、**プロキシによって課せられた保護を回避する**試みを支援し、プロキシによって保護されたリソースへのアクセスを可能にします。
この脆弱性に関する追加情報、特にNGINXに関しては、[**この詳細なリソース**](../network-services-pentesting/pentesting-web/nginx.md#proxy\_set\_header-upgrade-and-connection)を参照してください。
## Websocketスムージング
Websocketスムージングは、プロキシを介してアクセス可能なエンドポイントへのHTTP2トンネルを作成するのとは異なり、Websocketトンネルを確立して潜在的なプロキシの制限を回避し、エンドポイントとの直接通信を促進します。
### シナリオ1
このシナリオでは、公開WebSocket APIとアクセスできない内部REST APIを提供するバックエンドが、内部REST APIへのアクセスを求める悪意のあるクライアントによって標的にされます。攻撃は以下のいくつかのステップで展開されます
1. クライアントは、ヘッダーに不正な`Sec-WebSocket-Version`プロトコルバージョンを含むUpgradeリクエストをリバースプロキシに送信します。プロキシは`Sec-WebSocket-Version`ヘッダーを検証せず、Upgradeリクエストが有効であると信じてバックエンドに転送します。
2. バックエンドは、`Sec-WebSocket-Version`ヘッダーに不正なプロトコルバージョンを示すステータスコード`426`で応答します。リバースプロキシはバックエンドの応答ステータスを見落とし、WebSocket通信の準備が整ったと仮定し、応答をクライアントに中継します。
3. その結果、リバースプロキシはクライアントとバックエンドの間にWebSocket接続が確立されたと誤解しますが、実際にはバックエンドはUpgradeリクエストを拒否しました。それにもかかわらず、プロキシはクライアントとバックエンドの間にオープンなTCPまたはTLS接続を維持し、この接続を介してクライアントがプライベートREST APIに無制限にアクセスできるようにします。
影響を受けるリバースプロキシには、問題に対処しなかったVarnishや、アップグレードメカニズムが変更されたEnvoyプロキシバージョン1.8.0以前が含まれます。他のプロキシも脆弱である可能性があります。
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png)
### シナリオ2
このシナリオでは、公開WebSocket APIとヘルスチェック用の公開REST API、さらにアクセスできない内部REST APIを持つバックエンドが関与します。攻撃はより複雑で、以下のステップが含まれます
1. クライアントは、ヘルスチェックAPIをトリガーするためにPOSTリクエストを送信し、追加のHTTPヘッダー`Upgrade: websocket`を含めます。リバースプロキシとして機能するNGINXは、`Upgrade`ヘッダーのみに基づいてこれを標準のUpgradeリクエストとして解釈し、リクエストの他の側面を無視してバックエンドに転送します。
2. バックエンドはヘルスチェックAPIを実行し、攻撃者が制御する外部リソースにアクセスし、ステータスコード`101`を持つHTTP応答を返します。この応答はバックエンドによって受信され、NGINXに転送されると、プロキシはステータスコードのみを検証するため、WebSocket接続が確立されたと誤解します。
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png)
> **警告:** この技術の複雑さは、ステータスコード101を返すことができるエンドポイントと対話する能力を必要とするため、増加します。
最終的に、NGINXはクライアントとバックエンドの間にWebSocket接続が存在すると誤解します。実際には、そのような接続は存在せず、ヘルスチェックREST APIがターゲットでした。それにもかかわらず、リバースプロキシは接続をオープンに保ち、クライアントがそれを介してプライベートREST APIにアクセスできるようにします。
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png)
ほとんどのリバースプロキシはこのシナリオに脆弱ですが、悪用は通常低Severityの問題と見なされる外部SSRF脆弱性の存在に依存します。
#### ラボ
両方のシナリオをテストするためのラボを確認してください:[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)
{% hint style="success" %}
AWSハッキングを学び、実践する<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricksをサポートする</summary>
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
</details>
{% endhint %}