如何构建基于404页面未找到的C2系统
作者:Matthew Pawelski(特邀博客)
C2(命令与控制)被攻击者用于控制受感染系统。大多数C2控制着大型僵尸网络,而有些则仅用于让攻击者访问系统,以便横向移动或窃取凭据以获取“合法”系统访问权限。
我见过和听说过许多类型的C2,例如IRC、P2P、DNS、Twitter、Gmail、ICMP等。这个列表不断扩大,C2的实现方式也越来越有创意。我很少对听到的任何新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