利用HTTP 404错误页面构建隐蔽C2通信的技术解析

本文详细介绍了如何利用HTTP 404错误页面构建隐蔽的命令与控制(C2)通信通道,包括服务器配置、客户端设计及数据传输方法,探讨了该技术在绕过网络监控方面的潜在风险与防御思路。

如何构建基于404页面的C2通信系统

作者:Matthew Pawelski(特邀博客)

C2(命令与控制)是攻击者用于控制受感染系统的机制。大多数C2控制着大型僵尸网络,但有些仅用于让攻击者访问系统,以便横向移动或窃取凭据以获得“合法”访问权限。

我曾见过或听说过多种C2类型,如IRC、P2P、DNS、Twitter、Gmail、ICMP等。这个列表不断增长,C2的实现方式也越来越有创意。但有一天,在与John Strand的对话中,他提到了一种使用HTTP 404(文件未找到)错误的C2。这引起了我的注意。作为安全专业人员,大多数这类技术(尽管不是全部)都相对容易检测和阻止。

虽然HTTP 404错误可能更难检测,但完全过滤/阻止HTTP 404错误却很容易。但有多少环境会阻止HTTP 404?实际上,有多少环境会监控和查看网站的HTTP 404错误?如果你像我一样,在查看网络流量时,HTTP 404通常会被忽略或跳过。在梳理流量时,我主要关注流量中的异常、流向互联网奇怪位置的流量或其他类似情况。

出于兴趣,我开始研究是否有人使用过这种攻击方式,以及是否有人在野外检测到这种C2。我找到了几篇文章,一篇是Black Hat白皮书《Hiding in Plain Sight》(Pierre-Marc Bureau和Christian Dietrich著,https://www.blackhat.com/docs/eu-15/materials/eu-15-Bureau-Hiding-In-Plain-Sight-Advances-In-Malware-Covert-Communication-Channels-wp.pdf),另一篇是He Xu的《Hiding Malicious Traffic Under the HTTP 404 Error》(https://blog.fortinet.com/2015/04/09/hiding-malicious-traffic-under-the-http-404-error)。Black Hat白皮书引用了He Xu的Fortinet论文,我使用Fortinet论文来建模我的概念验证。

在He Xu的文章中,他们实际检测并观察到了HTTP 404 C2,文章涵盖了他们的发现和发生的情况。基本上,受感染的设备会访问Web服务器,但会收到HTTP 404错误。HTTP 404看起来无害,但源代码页面中的注释包含base64编码的命令。这些命令是让机器人复制自身到USB驱动器、下载并执行可执行文件,最后更改一些注册表键的指令。基于这篇文章和机器人的行为方式,我决定创建自己的HTTP 404 C2。不过,不仅仅是让受感染系统获取命令并运行这些指令,我还希望通过HTTP 404错误来控制系统并获取响应。

第一部分是设置Web服务器,通过添加和配置.htaccess文件将所有错误页面重定向到我选择的.html文件(下面我将其重定向到evil.html)。

作为攻击者,这个Web服务器可以是他们直接设置和控制的,或者是他们具有“访问”权限的服务器。一旦网站设置完成且HTTP 404错误设置并工作,我转到第二部分:C2服务器。

这是代码中最简单的部分。代码会等待我输入要发送给受控设备的命令:base64编码它,将其放入带有预定义标题的HTML注释中,并包装到HTML文件中。然后它会覆盖当前的HTTP 404 HTML文件。这仅在我输入新命令时覆盖HTTP 404文件。在我的测试中,我设置并控制了Web服务器,但如果它是受感染的服务器,我可以轻松使用FTP上传新的HTML文件。

下一步是创建C2客户端。我希望客户端具备一些功能:能够通过适用于Windows和Linux的命令控制客户端,并将命令的响应发送回监听服务器。

客户端必须访问一个域名。我使用了静态URL,但这可以轻松更改为请求随机页面。一旦它从站点请求页面,首先确定是否是404页面。如果不是404页面,则忽略并等待下一次请求。如果是404页面,则检查源代码中是否有注释。如果找到注释,则检查注释中的标题是否匹配预定义标题。如果标题匹配,则解码base64字符串并执行命令。

这部分代码稍微复杂一些,因为我不仅希望在客户端系统上执行命令,还希望能够向Linux和Windows发送基本命令。最后,我需要将执行命令的结果发送回服务器。

我在C2客户端上解决这个问题的方法是确定受感染系统是Linux还是Windows。如果是Linux系统,则像Windows操作系统一样执行命令,然后将其作为重新base64编码的PowerShell脚本执行。在Windows操作系统上使用PowerShell可以提供与Linux相同的一些基本命令。

C2客户端的最后部分是将命令的结果发送回监听服务器。为了测试,我选择了一个Python服务器作为监听器。发送命令回传的方式可以更复杂以绕过出口过滤和数据包过滤。但为了简单和方便,我仅使用了Python服务器监听器。

最后,我创建了C2接收器用于接收C2客户端发送的命令结果。这只是一个基本的Python服务器,等待连接。

在我的演示中,我使用Windows 10机器作为“受害者”,Ubuntu桌面作为Web服务器、C2控制器和C2接收器。

你可以看到网站是一个Office 365登录页面。

但一旦我访问不存在的页面,我应该收到404错误。

你会注意到源代码页面没有任何注释,只是一个基本的网页。

C2服务器启动并等待命令。

C2命令接收器打开端口并等待传入连接。

然后在受害机器上运行C2客户端(没有太多可看的,文件启动后在后台运行)。

现在我们可以执行一个简单的命令,比如ls。

如你所见,客户端将Desktop的内容(程序运行的位置)发送回接收器。我将创建一个文件,列出内容,然后显示404页面和页面的源代码。

从C2服务器我可以运行命令,我使用了PowerShell命令并在当前目录(桌面)创建了一个空文件。

C2接收器显示文件已创建。

你现在可以看到我从C2服务器创建的文件显示在桌面上。

404页面看起来仍然相同。

但如果你查看源代码,你会看到页面底部有一个新注释。

如果你解码TmV3LUl0ZW0gLU5hbWUgRW1wdHlGaWxlLnR4dCAtSXRlbVR5cGUgRmlsZQ==,你会得到: New-Item -Name EmptyFile.txt -ItemType File

总之,这可能是一个非常强大的工具,并且容易被忽略。这是一个有趣的小项目,你可以在以下位置查看源代码: https://github.com/theG3ist/foOhfo 好吧,真正的网站是: https://github.com/theG3ist/404

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计