WebSocket Attacks
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
WebSocket接続は、最初のHTTPハンドシェイクを通じて確立され、長期間の使用を目的としており、トランザクションシステムを必要とせずにいつでも双方向のメッセージングを可能にします。これにより、WebSocketは、ライブ金融データストリームなどの低遅延またはサーバー起動の通信を必要とするアプリケーションに特に有利です。
WebSocket接続の確立に関する詳細な説明はこちらでアクセスできます。要約すると、WebSocket接続は通常、以下に示すようにクライアント側のJavaScriptを介して開始されます:
wss
プロトコルはTLSで保護されたWebSocket接続を示し、ws
は保護されていない接続を示します。
接続の確立中に、ブラウザとサーバーの間でHTTPを介してハンドシェイクが行われます。ハンドシェイクプロセスでは、ブラウザがリクエストを送信し、サーバーが応答します。以下の例に示すように:
ブラウザがハンドシェイクリクエストを送信:
サーバーのハンドシェイク応答:
接続は確立されると、双方向でメッセージ交換のためにオープンのままになります。
WebSocketハンドシェイクの重要なポイント:
Connection
およびUpgrade
ヘッダーはWebSocketハンドシェイクの開始を示します。
Sec-WebSocket-Version
ヘッダーは、通常13
の希望するWebSocketプロトコルバージョンを示します。
Base64エンコードされたランダム値がSec-WebSocket-Key
ヘッダーに送信され、各ハンドシェイクがユニークであることを保証し、キャッシュプロキシによる問題を防ぎます。この値は認証のためではなく、応答が誤って構成されたサーバーやキャッシュによって生成されていないことを確認するためのものです。
サーバーの応答におけるSec-WebSocket-Accept
ヘッダーはSec-WebSocket-Key
のハッシュであり、WebSocket接続を開くというサーバーの意図を確認します。
これらの機能は、ハンドシェイクプロセスが安全で信頼性があることを保証し、効率的なリアルタイム通信への道を開きます。
websocat
を使用してWebSocketとの生の接続を確立できます。
または、websocatサーバーを作成するには:
もしクライアントが現在のローカルネットワークからHTTP websocketに接続していることがわかった場合、ARP Spoofing Attackを試みて、クライアントとサーバーの間でMitM攻撃を実行することができます。 クライアントが接続しようとしているときに、次のように使用できます:
ツール https://github.com/PalindromeLabs/STEWS を使用して、Websocketの既知の 脆弱性 を自動的に発見、フィンガープリンティング、検索できます。
Burp Suite は、通常のHTTP通信と非常に似た方法でMitM Websockets通信をサポートしています。
socketsleuth Burp Suite拡張機能 は、履歴を取得し、インターセプションルールを設定し、マッチと置換ルールを使用し、IntruderやAutoRepeaterを使用することで、BurpでのWebsocket通信をより良く管理できるようにします。
WSSiP: "WebSocket/Socket.io Proxy"の略で、このNode.jsで書かれたツールは、クライアントとサーバー間のすべてのWebSocketおよびSocket.IO通信をキャプチャ、インターセプト、カスタムメッセージを送信し、表示するためのユーザーインターフェースを提供します。
wsrepl は、ペネトレーションテスト専用に設計されたインタラクティブWebsocket REPLです。受信Websocketメッセージを観察し、新しいメッセージを送信するためのインターフェースを提供し、この通信を自動化するための使いやすいフレームワークを備えています。
https://websocketking.com/ は、websocketsを使用して他のウェブと通信するためのウェブです。
https://hoppscotch.io/realtime/websocket は、他の通信/プロトコルの種類の中で、websocketsを使用して他のウェブと通信するためのウェブを提供します。
Burp-Suite-Extender-Montoya-Course には、Websocketsを使用してウェブを起動するためのコードがあり、この投稿 で説明を見つけることができます。
クロスサイトWebSocketハイジャック、またはクロスオリジンWebSocketハイジャックは、WebSocketハンドシェイクに影響を与える特定のケースとして**クロスサイトリクエストフォージェリ(CSRF)として特定されます。この脆弱性は、WebSocketハンドシェイクがCSRFトークンや類似のセキュリティ対策なしにHTTPクッキー**のみで認証されるときに発生します。
攻撃者は、脆弱なアプリケーションに対してクロスサイトWebSocket接続を開始する悪意のあるウェブページをホストすることでこれを悪用できます。その結果、この接続はアプリケーションとの被害者のセッションの一部として扱われ、セッション処理メカニズムにおけるCSRF保護の欠如を利用します。
websocket接続を確立する際に、クッキーがサーバーに送信されることに注意してください。サーバーは、送信されたクッキーに基づいて各特定の ユーザーをそのwebsocket セッションに関連付けるためにそれを使用している可能性があります。
次に、例えばwebsocket サーバーがユーザーの会話の履歴を返す場合、"READY"というメッセージが送信されると、単純なXSSが接続を確立し(クッキーは被害者ユーザーを認証するために自動的に送信されます)、"READY"を送信することで会話の履歴を取得できるようになります。
このブログ投稿 https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/ では、攻撃者が サブドメイン で 任意のJavascriptを実行 することに成功しました。これは サブドメイン であったため、クッキー が 送信され、さらに WebsocketがOriginを適切にチェックしなかった ため、通信が可能となり、トークンを盗む ことができました。
なりすましたいウェブアプリケーションをコピーします(例えば .html ファイル)そして、ウェブソケット通信が行われているスクリプト内にこのコードを追加します:
今、wsHook.js
ファイルをhttps://github.com/skepticfx/wshookからダウンロードし、ウェブファイルのフォルダー内に保存してください。
ウェブアプリケーションを公開し、ユーザーがそれに接続することで、websocketを介して送信および受信されたメッセージを盗むことができます:
WebSocketにおけるレースコンディションも存在します。この情報を確認して、詳細を学んでください。
WebSocketはサーバー側とクライアント側にデータを送信するメカニズムであり、サーバーとクライアントが情報をどのように処理するかによって、WebSocketはXSS、SQLi、またはWebSocketからのユーザー入力を使用した他の一般的なWeb脆弱性を悪用するために使用される可能性があります。
この脆弱性により、逆プロキシの制限を回避することができ、WebSocket通信が確立されたと信じ込ませることができます(たとえそれが真実でなくても)。これにより、攻撃者は隠れたエンドポイントにアクセスすることができる可能性があります。詳細については、以下のページを確認してください:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)