14 KiB
アップグレードヘッダースマグリング
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのグッズを手に入れましょう。
-
💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
-
ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。
最も重要な脆弱性を見つけて修正を迅速化しましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリやクラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
H2Cスマグリング
クリアテキスト上のHTTP2(H2C)
通常、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ヘッダーも正常に転送する必要がある場合があります。
デフォルトでは、次のサービスはプロキシパス中にUpgradeとConnectionヘッダーを転送し、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のラボをチェックしてください。
参考文献
- https://blog.assetnote.io/2021/03/18/h2c-smuggling/
- https://bishopfox.com/blog/h2c-smuggling-request
- 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 🎥
-
サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?サブスクリプションプランをチェックしてください!
-
The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのグッズを手に入れましょう。
-
💬 Discordグループに参加するか、telegramグループに参加するか、Twitterで私をフォローしてください🐦@carlospolopm。
-
ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。