# クロスサイトWebSocketハイジャッキング(CSWSH)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
## WebSocketsとは
WebSocket接続は**HTTP**を介して開始され、通常は**長時間維持**されます。メッセージは**いつでもどちらの方向にも送信**でき、トランザクション的な性質はありません。接続は通常、クライアントまたはサーバーがメッセージを送信する準備ができるまで開いたままになります。\
WebSocketsは、金融データのリアルタイムフィードなど、**低遅延またはサーバー起点のメッセージ**が必要な状況で特に有用です。
## WebSocket接続はどのように確立されますか?
(ここでは概要を示しますが、**WebSocket接続の詳細なガイド**は[**こちら**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)で見つけることができます)。\
WebSocket接続は通常、次のようなクライアントサイドのJavaScriptを使用して作成されます:
```javascript
var ws = new WebSocket("wss://normal-website.com/chat");
```
**`wss`**プロトコルは、暗号化された**TLS**接続上でWebSocketを確立しますが、**`ws`**プロトコルは**暗号化されていない**接続を使用します。
接続を確立するために、ブラウザとサーバーはHTTP上でWebSocketハンドシェイクを実行します。ブラウザは以下のようなWebSocketハンドシェイクリクエストを発行します:
```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
```
もしサーバーが接続を受け入れる場合、以下のようなWebSocketハンドシェイクのレスポンスを返します。
```javascript
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
この時点では、ネットワーク接続は開いたままであり、双方向にWebSocketメッセージを送信するために使用することができます。
**注意**
WebSocketのハンドシェイクメッセージのいくつかの**特徴**について以下に示します:
* リクエストとレスポンスの**`Connection`**と**`Upgrade`**ヘッダーは、これがWebSocketのハンドシェイクであることを示しています。
* リクエストヘッダーの**`Sec-WebSocket-Version`**は、クライアントが使用したいWebSocketプロトコルのバージョンを指定します。通常は`13`です。
* リクエストヘッダーの**`Sec-WebSocket-Key`**には、ベース64でエンコードされた**ランダムな値**が含まれており、各ハンドシェイクリクエストでランダムに生成する必要があります。
* レスポンスヘッダーの**`Sec-WebSocket-Accept`**には、プロトコル仕様で定義された特定の文字列と、`Sec-WebSocket-Key`リクエストヘッダーに提出された値のハッシュが含まれています。これにより、誤って設定されたサーバーやキャッシュプロキシからの誤った応答が防止されます。
**`Sec-WebSocket-Key`**ヘッダーには、キャッシュプロキシからのエラーを防ぐためのランダムな値が含まれており、認証やセッション管理の目的では使用されません(_CSRFトークンではありません_)。
### Linuxコンソール
`websocat`を使用してWebSocketとの生の接続を確立することができます。
```bash
websocat --insecure wss://10.10.10.10:8000 -v
```
または、websocatサーバーを作成するには:
```bash
websocat -s 0.0.0.0:8000 #Listen in port 8000
```
## MitM WebSocket接続
現在のローカルネットワークからクライアントが**HTTP WebSocket**に接続していることがわかった場合、[ARPスプーフィング攻撃](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing)を試して、クライアントとサーバーの間でMitM攻撃を実行することができます。\
クライアントが接続しようとしている場合、次のコマンドを使用できます:
```bash
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
## Websocketsの列挙
[**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **というツール**を使用すると、Websocketsで自動的に既知の**脆弱性を発見、指紋認証、検索**することができます。
## Websocketデバッグツール
* **Burp Suite**は、通常のHTTP通信と同様に、MitM Websockets通信をサポートしています。
* [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**"の略で、Node.jsで書かれたこのツールは、クライアントとサーバー間のすべてのWebSocketおよびSocket.IO通信を**キャプチャ、インターセプト、カスタムメッセージの送信**、表示するためのユーザーインターフェースを提供します。
* [**wsrepl**](https://github.com/doyensec/wsrepl)は、特にペネトレーションテスト向けに設計された**対話型WebSocket REPL**です。これにより、**受信したWebSocketメッセージを観察し、新しいメッセージを送信**するためのインターフェースが提供され、この通信を**自動化**するための使いやすいフレームワークが備わっています。
* [**https://websocketking.com/**](https://websocketking.com/)は、**websockets**を使用して他のウェブサイトと**通信するためのウェブ**です。
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket)は、他の種類の通信/プロトコルと共に、**websockets**を使用して他のウェブサイトと**通信するためのウェブ**を提供します。
## Websocket Lab
[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course)には、Websocketsを使用してウェブを起動するためのコードがあり、[**この投稿**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/)には説明があります。
## クロスサイトWebSocketハイジャッキング(CSWSH)
または、_クロスオリジンWebSocketハイジャッキング_とも呼ばれます。\
これは、WebSocketハンドシェイクにおける**クロスサイトリクエストフォージェリ(CSRF)**です。
これは、**WebSocketハンドシェイク**リクエストがセッション管理に**HTTPクッキーのみ**を使用し、**CSRFトークンや他の予測不可能な値を含まない**場合に発生します。\
攻撃者は、**自分のドメイン上に悪意のあるウェブページ**を作成し、脆弱なアプリケーションに**クロスサイトWebSocket接続**を確立します。アプリケーションは、**被害者ユーザーのセッションのコンテキスト**で接続を処理します。
### 簡単な攻撃
**websocket**接続を**確立**する際に、**クッキー**が**サーバーに送信**されることに注意してください。**サーバー**は、**送信されたクッキーに基づいて各特定のユーザーを彼のwebsocketセッションに関連付ける**かもしれません。
その後、**例えば**、**websocket**サーバーがユーザーの会話の履歴を返す場合、メッセージに "**READY**" が送信されると、**単純なXSS**が接続を確立します(**クッキー**は自動的に送信され、被害者ユーザーを認証します)。 "**READY**" を**送信**することで、会話の履歴を**取得**することができます。
```markup
```
### クロスオリジン + 異なるサブドメインのクッキー
このブログ記事[https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](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
//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