使用 html5 websockets 绕过防火墙 TCP 策略

信息安全 网络套接字 防火墙 恶意软件
2021-09-02 14:20:15

我读过 html5 可以在其“websocket”功能中从客户端打开 tcp 套接字。

我记得的防火墙可能被配置为通过查找 SYN 数据包来阻止从“外部”发起的 tcp 连接,但是利用这个 html5 功能可以简单地绕过这个策略。

我在这里错过了什么吗?谁将监视那些隐式的打开套接字调用?看来这种行为是免费提供的“反向 tcp shell”......

2个回答

首先,websocket 连接由客户端上的网络浏览器执行的 javascript 初始化。这意味着典型的 websocket 连接是出站连接,而不是入站连接。只有在主机运行 websocket服务器时,才能进行入站 websocket 连接普通浏览器通常不会这样做。即使主机出于某种原因运行 websocket 服务器:在通常的客户端网络中正确配置的防火墙也可以、应该并且将阻止这种情况。

其次,websockets 不是普通的 TCP 套接字。他们在 TCP 之上使用自定义帧协议。这意味着 websocket 连接只能打开到理解 websocket 协议的服务。因此,即使 websocket API 可用于让用户(尝试)连接到任何远程主机,他们也无法让他们使用任何不打算通过 websockets 使用的服务。

第三,这不是“远程 TCP 外壳”,因为 websocket 只存在于 web 浏览器的 javascript 引擎和当前访问的 HTML 文档的上下文中。它不会赋予用户正在访问的网站更多在本地计算机上执行操作的权限,而不是它已经拥有的权限。当然,它使 javascript 应用程序能够与远程服务器通信,但是已经有很多方法可以做到这一点,比如 AJAX。

那么还有哪些可能的滥用潜力呢?

作为恶意网站的所有者,我可以传播一个 javascript,使用户连接到 websocket 服务器并对其执行一些恶意活动。我可以用它把我的访问者变成垃圾邮件僵尸,让其他人向一些基于 websocket 的应用程序发送垃圾邮件。但是websocket 有一个内置功能来防止这种情况。用户的 webbrowser 使用每个 websocket 连接发送网站的 URL。这意味着服务可以轻松忽略任何不是源自已知 URL 的连接。

有关更多信息,我推荐RFC-6455,它描述了协议本身和Web 浏览器中 Javascript API的 W3C 标准

WebSocket 不是普通的 TCP 套接字,而是提供类似于 HTTP 隧道内的 TCP 套接字的行为。要实际使用它们连接到任意端口,您必须有一些服务器端后端,它将从 WebSocket 与请求的端口建立“真正的” TCP 连接。

除此之外,这个问题最好在 security.stackexchange.com 上提出。