零基础搭建Websocket | 如何对websocket进行渗透测试

作者:FancyPig | 发布时间: | 更新时间:

相关阅读

data-postsbox="{"id":35060,"title":"黑客是如何黑进实时聊天的 | Websocket渗透测试技巧","author":"FancyPig","author_id":1,"cover_image":"https://static.pigsec.cn/wp-content/uploads/2023/04/20230412141050633.png","cover_video":"https://v.pigsec.cn/Hacking%20Live%20Chat%20-%20With%20WebSockets_ts.m3u8","views":2401,"comment_count":2,"category":"knowledge","is_forum_post":false}">{"id":35060,"title":"黑客是如何黑进实时聊天的 | Websocket渗透测试技巧","author":"FancyPig","author_id":1,"cover_image":"https://static.pigsec.cn/wp-content/uploads/2023/04/20230412141050633.png","cover_video":"https://v.pigsec.cn/Hacking%20Live%20Chat%20-%20With%20WebSockets_ts.m3u8","views":2401,"comment_count":2,"category":"knowledge","is_forum_post":false}

视频讲解

本期视频,我们将从零开始,使用Node.js和前端编写Websocket协议,并展示websocket的运作方式。之后,我们将带大家对Websocket进行渗透测试,这其中包括PortSwigger的两个实验,通过常见的注入及CSRF方式如何截获Websocket中的聊天内容,很多人会表示这在实际公网中出现的情况几乎很少,但在内网中,这样的情况非常多,因此这样的攻击方式还是非常有效的,并且在学习渗透测试过程中,我们也应当多关注其背后的技术原理,而不是复制粘贴payload到自己的笔记本里,否则你只会最终成为一个脚本小子。

图文讲解

好了,欢迎回来看另一个视频。现在,我非常兴奋地分享今天关于网络套接字(websockets)的话题,因为这确实不是我过去花了很多时间研究的东西,但鉴于我最近的重点是攻击内部网络应用和红队web利用攻击模拟,这绝对是一个令人兴奋的话题。如果我能够通过利用Websocket攻击用户,特别是像IT Helpdesk这样的特权用户,通过像即时聊天和票务系统这样的东西,那么我们将朝着拥有整个网络的方向迈进。当然,不要误会我的意思,这完全不是在挖苦任何在服务台工作的人,但我经常发现他们可以访问很多敏感信息,或者简单地说,他们可能有域名管理权限。所以这使他们成为首要目标。像往常一样,我们首先要做一个关于网络套接字(websockets)的入门课程。我会告诉你一个我构建的简单的应用程序,然后我们将看看我们如何去实际攻击他们。我们要介绍的第二个实验室特别有趣,因为我们基本上重复使用了我为学习网络套接字所写的代码。你很少有机会复制和发布你的应用程序代码,以作为一个漏洞。像往常一样,如果你喜欢这个视频,不要忘记喜欢和订阅,当然,如果你认为其他人会得到一些价值,不要犹豫,分享视频。让我们深入了解一下。当我开始研究网络套接字时,我想,我真的不知道底层发生了什么。当然,我以前也见过网络套接字的使用,但我从来没有真正建立过使用它们的网络应用或对其进行故障排除。而在我看来,这样做有很大的价值。所以我的第一站是Web Dev Simplified。

现在,如果你想快速了解很多主题,这是一个很好的资源。即使你不是一个开发人员,如果你只是对AppSec感兴趣,它也绝对值得你花时间。不幸的是,这次只有一个关于Sockets.io的视频,这当然是类似的,但不是我所追求的。接下来,我看了MDN的网络文档,像往常一样,这给了我一个非常好的起点,让我知道如何创建网络套接字对象,发送数据,以及一些实际的例子,比如如何发送JSON等等。

在google的时候,我还看了一些其他的帖子,我阅读了一些示例代码,当然,PortSwigger也有一些关于WebSockets的信息和实验室。总而言之,这是一个相当有成效的早晨。但为什么这对分享很重要呢?好吧,我想我给大家简单介绍一下我是如何对待学习新课题的,会很有帮助。在很多情况下,只是查看一些文献或浏览帖子,将有效载荷添加到您的笔记中,然后就上路了,这太容易了。实际上,我们不希望最后成为光荣的人类漏洞扫描器,只是把有效载荷扔到目标上,希望得到最好的结果。因此,在我看来,如果你想在应用安全领域有一个长期成功的职业生涯,学习底层技术和它是如何工作的,这确实是一个关键。是的,这比较难,但从长远来看,这肯定会带来回报。所以,让我们快速看看我拼凑起来的简单的应用程序,以便我们能够理解发生了什么。好吧,让我们快速浏览一下这个应用程序。我们有两个主要文件,即index.js和index.html。所以我只是要把它转起来,然后我们开始运行。然后,如果我们来到我们的浏览器,点击刷新,你可以看到我们得到了这个连接信息。

如果我们检查服务器,我们也得到了连接。这个应用程序所做的就是当我点击发送时,它向服务器发送一条信息,然后服务器回复说,嘿,你的原始信息是这样的。它还会给我们原始信息的base64。所以很好很简单。

然后,如果我们想的话,我们可以直接点击断开连接,

你可以看到我们在服务器上也被断开连接了。

所以让我们快速看一下代码。首先在第一行,我们正在导入ws包,即WebSocket包,并将其分配给WebSocket。然后第三行创建了一个新的WebSocket服务器实例,并基本上说,嘿,请在端口8081上收听。之后,我们为服务器上的连接事件设置了一个事件监听器, 然后当客户端连接到服务器时,基本上会被触发。所以console.log connected将首先被触发。然后在第七行,我们有一个WebSocket连接上的消息事件的事件监听器。所以当服务器收到来自客户端的消息时,这将被触发,回调函数将被执行。在这种情况下,回调函数将执行socket.send,然后它将在第9行进行base64转换,然后它也将发送base64回来。在第13行,我们还有一个事件监听器,这基本上是监听WebSocket连接上的关闭事件,以及客户端关闭连接的时间,这基本上是被执行的,我们在console.log中加入一条消息,说是断开了连接。当然,最后一行在第18行,这基本上只是说,嘿,当我们输入node index.js时,文件正在正确运行。

所以我们也有index.html。所以在这里,我只是有几个按钮。所以我们有文本输入,所以我们有想要发送的消息,然后我们有发送消息和断开连接,我有一个div,这个是消息被附加到的地方。

所以我们得到这个const socket等于新的WebSocket,所以这创建了一个新的连接到服务器,所以localhost:8081,和socket.onopen,当新的连接被创建时,基本上我们抓住这里的div,所以这个id="messages",所以messagesDiv等于document.getElementBy("messages")我们创建一个新的段落标签,然后我们新的message.innerText等于"connected",然后我们把这个新的段落标签附加到这个div上。所以它将在我们的页面上弹出。和onmessage一样,我们抓取messageDiv,然后我们创建一个新的p标签,然后我们改变这个p标签的innerText,然后我们把它追加到messageDiv。

然后在断开连接时,所以断开按钮,在这里,我们只是输入socket.close,所以这关闭了连接,然后发送消息,我们有msg等于document.getElementById("message").value,然后我们把这个发送到服务器。

所以,正如你所看到的,非常直接,实际上我们只是创建了一个连接,并在必要时触发了事件。还有一点需要注意的是,在这里你可能会注意到,我们使用了WS,但如果您传输敏感数据,我认为最好使用WebSocket安全版本,也就是WSS。

现在,在我的本地实验室里,这并不重要,但这是将来要注意的好了,让我们看一下我们的第一个实验室。

所以我只是要切换到我的代理。

在这里,我们只是想注入一些代码,看看应用程序如何反应。所以,如果我们发现了什么,那么我们可以再深入一点,对于注入,特别是跨站脚本,实际上值得首先寻找HTML注入,你可能会问,为什么?好吧,多年来,针对XSS的过滤和保护已经变得越来越普遍,但很多应用程序都依赖于Web应用防火墙或其他过滤方法,而不是转义。因此,HTML注入比有效载荷(如alert1)通过这些过滤器的机会要大得多,因为后者基本上在任何地方都会被阻止。如果你用alert1测试实时应用程序,即使该应用程序有漏洞,你的有效载荷仍然不太可能工作,至少对于生产或加固的系统是这样。对于CTF和实验室以及类似这样的东西,情况就不一样了。好吧,那么我就来到即时聊天室,

我们得到了一个连接的,现在正在与帮助热线聊天,我只是要发送一个消息说,你好。

我们得到这个正在打字中

对不起,我没有听到这个回应。

因此,让我们来看看在burpsuite中发生了什么。因此,如果我们来到HTTP历史,

我们可以看到我们有这个GET /chat,然后在这里我们可以看到我们有切换协议,

连接是升级(upgrade),我们正在升级到一个网络套接字。所以这是一个指示,我们需要来到网络套接字历史,我们可以看到通过网络套接字发送的消息。所以我们给服务器的信息,我们发送了一个准备好的信息,

然后回到我们这里,我们得到了连接。

我们可以在这里看到,然后给服务器我们得到了你好,

然后回到客户端,我们得到了同样的信息。

然后打字中,

我认为这为前端用户界面提供了动力。所以我们看到了打字,所以如果我只是再发送一个Hello,那么在客户端就会有一些UI的东西发生,

然后从服务器返回实际的消息。所以我想做的是,我先对我们自己进行测试,让有效载荷发挥作用,然后我们再把发送到服务器上。所以我将按下ctrl r键,把这个消息发送到中继器,

而我们要检查的第一件事是HTML注入。所以我只是要做<h1>hello</h1>

发送,我们可以看到,我们确实有注入。

所以我们需要把这个升级为JavaScript注入或跨站脚本。因此,首先,有几个不同的有效载荷,我们应该考虑。因此,一个显然是臭名昭著的脚本alert1脚本,但我想在我们做之前,

我要做一些像<img src=x>,然后输入onerror,输入prompt()。

这只是我喜欢的有效载荷,它们对我来说更多时候是有效的,所以你知道,你显然可以测试很多不同的东西,看看什么对你有用,然后发送这个。第一次很幸运,我们确实得到了一个提示,这很好。

让我们实际测试一下,看看它是否有效。我们发送这个,

不幸的是,它没有工作。所以可能是脚本的关键字被过滤了,或者有什么东西阻挡了这个执行。

所以我们要做的是回来,我们要回到我们的代理,网络服务器,把其中一个信息带到服务器上,

然后把它放在那里,然后发送这个。

然后我们得到,恭喜你,你解决了这个实验室。

因此,对于像这样简单的漏洞,当然,你不太可能在加固的生产系统上发现它们。但是,如果你是一个渗透测试者,或者在一个红色团队的参与下,在内部网络上,那么,你会惊讶地发现只有内部的应用程序是多么可怕。所以你可以进行这样的攻击。我认为这凸显了WebSockets是一个表面区域,你可以应用许多不同的类型的漏洞来尝试和利用目标。让我们进入下一个实验室。好了,下一个实验室超级有趣,因为它使用CSRF。

但它并不是只执行一个动作,而是在连接建立后,让我们与这个服务器进行互动。所以,如果你曾经认为CSRF很无聊或者不重要,那么我希望这能改变你的想法。让我们来看看。所以我们打开了跨站WebSocket劫持实验室,我也要打开攻击服务器,因为我们稍后会需要这个。让我们直接到现场聊天室来吧。我注意到这种行为的第一件事是,我们得到系统中没有聊天记录。

因此,一定有什么事情发生了,它正在检查是否有一些历史或一些以前的聊天。我们将来到burpsuite,来到我们的代理,HTTP历史。在我们检查行为之前,我想看的第一件事是,当我们有这个切换协议时,你想检查一下这里请求是否有一个CSRF Token,而基本上没有。

因此,这意味着我们可以向目标发送一个有效载荷。这将使目标使用他们的会话连接到聊天,然后我们可以很容易地使用JavaScript窃取他们的聊天历史,并将其送回给我们,攻击者。让我们快速浏览一下并发送一些信息。所以,哎呀,有点打错了。我只是要发送你好,把它发回去,

然后我就刷新一下看看。

是的,我们确实把这个作为历史记录拿回来了。

所以让我们看看这个行为是怎么来的。所以看起来当我刷新的时候,我们向服务器发送了一个准备好的消息,然后我们就得到了历史记录。所以让我们试试这个,

发送这个。

是的,每当我们向服务器发送ready时,它就会给我们提供聊天历史。

现在,这是我们有效载荷的一个重要部分,因为如果我们不加载聊天历史,我们就不会得到任何信息回来,或者我们只会得到目标点击后发生的信息,如果这有意义的话。但我们想从他们的聊天历史中获得所有的信息。所以我要做的是回到Visual Studio Code,创建一个新的文件,叫做payload.js,然后我来到index,简单地复制这个开始。所以这可以作为我的脚本的第一个部分。

所以我们有了const socket = new WebSocket,然后我们要做的是复制这个URL,把它放在这里,

我想这个应该是ws。

我们可能也可以从burpsuite中抓取这个。那么,让我们看看,那复制的是什么?是的,同样的东西,到/chat,所以我不确定这是否需要是ws或wss。我认为最好的做法是wss,所以让我们先试试这个。

然后我们要做的是在打开时,我们要发送“ready”信息。所以我们要复制和粘贴这个,把这个放在这里。

因此,当我们打开连接时,我们正在做用户界面所做的事情,或者网络应用程序所做的事情,并在这里发送这个就绪消息。然后在消息上,我们可以摆脱这个断开连接并发送消息。

在消息中,我们要做的是获取,然后我们要,我们需要,我们要把数据发送到哪里。

因此,让我们使用协作器,开始,复制到剪贴板,

我想你必须使用协作器,因为除了像oastify.com这样的特定网站,Portswigger实验室不会,不会连接到互联网。所以,然后让我们更新一下这个,因为我们也需要方法。所以,我们只是要发布,哎呀,我们希望body是我们的数据,哎呀,像这样。

所以让我们快速阅读一下这个。所以const socket = new WebSocket。我们正在连接到目标。当它打开时,发送一个就绪消息。这将加载聊天历史。然后在消息中,我们抓取数据,并在一个post请求中把它发送到我们控制的这个端点。让我们试一试。所以我只是要复制这个,回到这里,来到漏洞服务器,传递给受害者。

我们也可以在本地进行测试,但它似乎已经成功了。所以,如果我们来到这里,我们已经有了一些结果,请求到协作者的响应,我们也有这个响应体。

所以那是,我想,一个初始信息,让我们看看这里有什么。它们都包含同样的东西。啊,我忘了我的密码。没问题,卡洛斯,这里是你的密码。

所以要解决这个实验室,我想我们只是回来。如果我记得,我们只需要登录就可以了。

所以卡洛斯,我怀疑这是他的密码。这是在进行一些编码。

然后我们就可以了。我们解决了这个实验室。

是的,这是一个非常棒的实验室,而且真的很有趣,因为正如我之前所说,我所做的研究和测试正是我所需要的,来解决这个挑战。像往常一样,Portswigger有很好的内容,如果你对提高你的应用安全或Web应用渗透测试技能感兴趣的话,我绝对推荐通过他们所有的实验室工作。所以,这个视频就到此为止。我希望你喜欢看这个视频,就像我喜欢做这个视频一样。同样,如果你认为其他人会从中获得一些价值,别忘了点赞、订阅和分享。

如果你有其他的话题,你想让我介绍,请在下面的评论中留言,我们下期再见。

标签:渗透测试, websocket, 服务器类型, 网络渗透, 有效载荷, 网络套接字, 红队web利用攻击, Websockets, IT Helpdesk, Websocket攻击, 特权用户, 入门课程, 实验室, Web Dev Simplified, MDN网络文档, PortSwigger, 应用安全领域, 底层技术, 人类漏洞扫描器, JSON, Sockets.io, 域名管理权限