让僵尸网络意外崩溃
执行摘要
Akamai 研究人员持续研究加密挖矿僵尸网络 KmsdBot,并见证了本文作者如何让其意外崩溃。
在我们的受控环境下,我们能够向爬虫程序发送命令以测试其功能和攻击特征。
在此次分析的过程中,语法错误导致爬虫程序停止发送命令,从而有效地终止了僵尸网络。
由于此特定僵尸网络不会在系统上持久驻留,因此它只有在重新感染系统后才能继续其任务。
前言
本月早些时候,Akamai 安全研究团队发布了一篇关于 KmsdBot 的博文。KmsdBot 是一个通过 SSH 和弱凭据感染受害者系统的加密挖矿僵尸网络。在 KmsdBot 感染了我们的一个蜜罐系统后,我们迅速分析并报告了此僵尸网络。
不过,在那次发布之后,我们仍然持续监控该僵尸网络,并有一些更新内容要在这篇博文中分享,比如我们是如何让其失去用武之地的。在本文中,我们将概述我们检查 KmsdBot 所采取的步骤,在采取这些步骤以后,我们得以执行命令并最终令其消亡。
对 C2 服务器执行 C2
任何恶意实体的首要致命因素是获得命令和控制 (C2) 的能力。由于 KmsdBot 具有 C2 功能,因此我们想测试与之相关的各种场景。该测试过程包括修改近期的 KmsdBot 样本,以与 RFC 1918 地址空间中的 IP 地址通信。
这使我们能够在受控环境下进行测试,因此,我们能够向爬虫程序发送我们自己的命令来测试其功能和攻击特征。值得注意的是,当我们发送了一个格式不正确的命令后,爬虫程序就停止了发送命令。于是,我们开始了调查。并不是每天都会遇到能让攻击者自毁长城的僵尸网络。
我们的发现过程
图 1:sys.main.connect() 函数的反汇编
可以看到字符串片段存储在内存位置 0x00632f19。我们可以跳转到二进制文件中的该地址并修改其内容以指向 RFC 1918 空间中的网络地址,即我们控制的 192.168.0.0/24 中的某个位置。
通过这种方式,我们可以像 C2 服务器一样发送示例攻击命令,将攻击流量定向到我们可以记录网络流量的目标。
图 2:由于字节顺序,采用十六进制 .861.291 形式反向写入地址
因此,我们的新 C2 服务器是端口 57388 上的 192.168.0.31(图 2)。我们知道 C2 服务器以明文形式进行通信,因此可以使用 Netcat发送恶意软件命令。然后,我们设置了两个虚拟机:一个用于“引爆”恶意软件,另一个用作我们的 C2 服务器。
在测试期间,我们注意到僵尸网络在观测到到达的单个格式错误的命令后即停止发送攻击命令。该命令如下:
!bigdata www.bitcoin.com443 / 30 3 3 100
敏锐的观察者会注意到目标网站和端口之间没有空间。该爬虫程序的代码中没有内置错误检查功能来验证命令的格式是否正确。
因此,格式不正确的命令将导致 Go 二进制文件崩溃,并显示堆栈跟踪,指出“索引超出范围”错误。这是因为提供了错误的参数数量。我们通过我们的 C2 服务器和爬虫程序设置测试了这一理论(图 3)。
图 3:模拟 C2 并重现正在发送的格式错误的命令
图 4:爬虫程序崩溃是因为提供了错误的参数数量。
这个格式错误的命令可能会导致在受感染计算机上运行并与 C2 服务器通信的所有僵尸网络代码崩溃,说到底,就是终止僵尸网络。由于爬虫程序在受感染的计算机上没有任何持久功能,因此唯一的恢复方法是重新感染并从头开始重新构建僵尸网络。
结论
在网络安全领域,我们很少遇到这样的案例。在我们这个零日漏洞频发、让人精疲力竭的世界,发现只需要利用拼写错误级别的编码就能抵御威胁,这绝对是大快人心的。这个僵尸网络一直在对一些大型的奢侈品牌和游戏公司穷追猛打,但是,一个失败的命令就能让其偃旗息鼓。这充分体现了技术千变万化的本质以及擅用技术的攻击者如何自作自受。
Akamai 安全研究团队致力于跟踪、检测、记录和发布全新发现,以保护 Akamai、Akamai 客户以及整个互联网的安全性和稳定性。我们将继续监测这些攻击,并相应地更新本博客。如需了解实时安全研究更新信息, 请在 Twitter 上关注我们。