hacktricks/pentesting-web/h2c-smuggling.md

14 KiB
Raw Blame History

アップグレードヘッダースマグリング

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

最も重要な脆弱性を見つけて修正を迅速化しましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリやクラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


H2Cスマグリング

クリアテキスト上のHTTP2H2C

通常、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処理などをバイパスできます。

脆弱なプロキシ

脆弱性の説明からわかるように、プロキシサーバーはUpgradeヘッダーを転送する必要がありConnectionヘッダーも正常に転送する必要がある場合があります。

デフォルトでは、次のサービスはプロキシパス中にUpgradeConnectionヘッダーを転送し、h2c smugglingをすぐに有効にします。

  • HAProxy
  • Traefik
  • Nuster

デフォルトでは、これらのサービスはプロキシパス中にUpgradeとConnectionヘッダーの両方を転送しませんが、安全でない方法で構成できますフィルタリングされていないUpgradeとConnectionヘッダーを渡すことにより

  • AWS ALB/CLB
  • NGINX
  • Apache
  • Squid
  • Varnish
  • Kong
  • Envoy
  • Apache Traffic Server

悪用

元のブログ記事では、準拠した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/assetnote/h2csmugglerというツールを使用して、H2C接続を確立し、プロキシで保護されたリソースにアクセスするためにプロキシによって課せられた保護を回避することができます。

Nginxのこの脆弱性に関する詳細情報については、こちらのリンクを参照してください

Websocket Smuggling

前のテクニックと同様に、このテクニックはHTTP2トンネルをプロキシ経由でアクセス可能なエンドポイントに作成するのではなく、同じ目的のためにWebsocketトンネルを作成し、潜在的なプロキシの制限をバイパスしてエンドポイントに直接アクセスします。

シナリオ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にアクセスできます。

次のリバースプロキシが影響を受けることがわかりました。

  • 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のラボをチェックしてください。

参考文献

最も重要な脆弱性を見つけて修正できるようにしましょう。Intruderは、攻撃対象を追跡し、予防的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステム全体にわたる問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥