需要云计算吗? 即刻开始体验

你让我“一见中毒”——基于 Mirai 的 NoaBot 现身

Stiv Kupchik

寫於

Stiv Kupchik

January 10, 2024

Stiv Kupchik

寫於

Stiv Kupchik

Stiv Kupchik 是 Akamai 安全研究员团队的负责人。他的研究项目主要涉及操作系统内核、漏洞研究和恶意软件分析等领域。他曾在 Black Hat、Hexacon 和 44CON 等会议上展示过他的研究成果。除了是一名网络安全专业人士外,Stiv 还拥有物理学学士学位。

NoaBot 是另一种基于 Mirai 的僵尸网络。Mirai 僵尸网络是一种蠕虫僵尸网络,可攻击基于 Linux 的物联网 (IoT) 设备。

执行摘要

  • Akamai 安全研究人员发现一种新的加密货币挖矿活动,该活动自 2023 年初以来一直处于活跃状态。

  • 该恶意软件使用经过攻击者修改的自定义 Mirai 僵尸网络通过 SSH 协议进行传播。

  • 新僵尸网络 NoaBot 的功能包括蠕虫自传播程序和 SSH 密钥后门,用于下载并执行其他二进制文件或将自身传播给新的受害者。

  • 在攻击过程中,将投放修改版的 XMRig 挖矿程序。此挖矿程序会对其配置进行混淆处理,还会使用自定义矿池来避免暴露挖矿程序所使用的钱包地址。

  • 我们已发现该僵尸网络与 P2PInfect 蠕虫(2023 年 7 月 被 Unit 42 发现 )存在关联的证据。

  • 恶意软件混淆和自定义代码显示出很高的操作安全性,这通常表明攻击者相当成熟,但恶意软件二进制文件的命名及其包含的一些字符串十分幼稚。这使得归因分析变得复杂。

  • 2023 年我们发现了 800 多个不同的攻击 IP,它们均匀分布在世界各地。

  • 我们已 发布 可用于测试感染情况的入侵指标 (IOC)、查询、签名和脚本。

简介

NoaBot 是另一种基于 Mirai的僵尸网络。Mirai 僵尸网络 是一种蠕虫僵尸网络,可攻击基于 Linux 的物联网 (IoT) 设备。该僵尸网络被用于实施分布式拒绝服务 (DDoS) 攻击。原始 Mirai 僵尸网络于 2016 年 被发现 ,但其源代码已 被公开,因此现在可以看到很多变体。

我们在 2023 年年初首次检测到 NoaBot 活动。从那时起,我们发现该恶意软件发生了两次演变,包括额外的混淆处理或命令和控制 (C2) 以及矿池域的变化(图 1)。我们还发现了几次投放 P2PInfect 蠕虫样本的事件,这表明两次攻击活动存在关联。

随时间变化的恶意软件活动的示意图。示意图开始于 2023 年 1 月前,结束于 2023 年 11 月后。 图 1:随时间变化的 Noabot 恶意软件活动

关于该僵尸网络

NoaBot 僵尸网络具有原始 Mirai 僵尸网络的大部分功能(例如,扫描器模块和攻击器模块、隐藏其进程名称等),但我们也看到它与 Mirai 原始源代码之间存在许多差异。首先,该恶意软件的传播程序基于 SSH,而 Mirai 基于 Telnet。

SSH 扫描器似乎是自定义的,而且非常古怪——建立连接后,该僵尸网络只发送了字符串“hi”便终止连接(图 2)。对于扫描器来说,快速终止连接是合理的,因为它不需要保持连接处于打开状态,只需要验证其存在即可。但为什么还要发送“hi”呢?这是一个谜。

Wireshark 数据包屏幕截图,显示带有“hi”的 SSH 数据包。 图 2:带有“hi”字符串的 SSH 数据包。它不是有效的 SSH 数据包,因此 Wireshark 将它标记为格式错误。

该恶意软件的另一个奇怪之处是嵌入的歌词。其早期样本包含 Rat Boy 与 IBDY 共同演绎的歌曲“Who's Ready for Tomorrow”的歌词(图 3)。据我们所知,这些歌词没有任何作用。后来的样本中没有歌词。

IDA 对僵尸网络样本中所嵌入歌词的反编译结果。 图 3:嵌入的歌词,似乎没有任何作用。

其他与 Mirai 的不同之处在于,该僵尸网络对其 SSH 扫描器使用了不同的凭据字典,并且它包含很多入侵后的功能,例如安装新的 SSH 授权密钥作为后门,用于下载并执行其他二进制文件或将自身传播给新的受害者(图 4)。

该僵尸网络支持的各种感染后命令的开关实例反编译结果。 图 4:僵尸网络的命令开关实例

还有一个不同之处在于,Mirai 通常使用 GCC 进行编译(至少根据其源代码和 作者指南来看是这样的),而 NoaBot 使用 uClibc 进行编译,这似乎改变了防病毒引擎对恶意软件的检测方式。其他 Mirai 变体通常被检测到带有 Mirai 签名,但 NoaBot 的防病毒签名是 SSH 扫描器或常规木马的签名(图 5)。

该恶意软件还经过静态编译并去除了任何符号。再加上它采用了非标准编译,因此进行逆向工程会更加麻烦。

该僵尸网络较新的样本还对其字符串进行了混淆处理,而不会将其保存为明文。这使得从二进制文件中提取详细信息或浏览反汇编部分变得更加困难,但编码本身并不复杂,而且易于进行逆向工程。 

我们还发现命令行参数会随着时间推移而增加。其中最有意思的是“noa”标识,它会使该僵尸网络以 crontab 条目的形式安装一个用于在重新启动后运行的持久性方法。

巧合的是,该僵尸网络样本的一些防病毒检测结果也带有前缀“Noa-”,这表明该标志似乎已被广泛利用。

还有一个演变是入侵后的操作,如图 4 中所示。在我们已调查的早期样本中,这些操作并不存在。

左:VirusTotal 对 NoaBot 的检测结果。大多数检测结果为类似于“Trojan.Linux.Generic”或“SSHScan”的内容。右:VirusTotal 对 Mirai 变体样本的检测结果。大多数检测结果明确提到 Mirai。 图 5:NoaBot 检测结果(左)与另一个 Mirai 变体的检测结果(右)

关于挖矿程序,以及找不到钱包地址的原因

挖矿程序本身要简单得多,尽管也是自编译的,但它是标准的 XMRig 挖矿程序。攻击者在该挖矿程序执行之前添加了一些代码来提取挖矿配置,而不是通过命令行提供挖矿配置或以明文形式将其保存在二进制文件中(图 6)。

挖矿程序主函数的反编译结果。开始是一堆函数调用,然后是各种信号。 图 6:挖矿程序的主函数

我们可以看到,在构建 XMRig 配置的函数调用之前还有一些其他函数调用。如果调用失败,挖矿程序便会终止,否则会进入标准的 XMRig 挖矿程序逻辑。(您可以将上方的反编译与实际的 XMRig 源代码进行比较。)作为研究人员,我们为什么要关注 XMRig 配置?通常,该配置会包含程序所连接到的矿池的详细信息,以及用于接收挖矿收益的钱包地址。通过获取钱包地址并跟踪支付到该地址的款项(通常公共矿池会进行跟踪),我们可以估算加密货币挖矿作业的盈利能力。

但是,这次攻击者走在了我们前面。所以,让我们来深入了解一下配置的构建。在 XMRig 开源代码中,挖矿程序可以通过命令行或者环境变量接受配置。在我们的案例中,攻击者选择不修改 XMRig 原始代码,而是在主函数前添加了一些代码。为了规避对命令行参数(可以是入侵指标 IOC 和告警防御程序)的需要,攻击者会在将控制权交给 XMRig 代码之前让该挖矿程序将它自己的命令行(专业术语为替换参数)替换为更“有意义”的参数。该僵尸网络使用(最多)一个参数来运行挖矿程序,该参数会指示其输出日志。

但是,在替换其命令行之前,该挖矿程序必须构建其配置。首先,它会复制以明文形式存储的基本参数,即 rig-id 标志(用三个随机字母标识挖矿程序)、线程标志和矿池 IP 地址占位符(图 7)。

奇怪的是,由于配置是通过 xmm 寄存器加载的,因此 IDA 实际上会漏掉前两个已加载的参数,即二进制名称和矿池 IP 占位符。

为挖矿程序构建新参数的反编译结果。程序加载配置字符串的偏移量,然后分配新的字符串数组并循环复制到该数组。 图 7:复制挖矿程序基本配置

接下来,该挖矿程序会解密矿池的域名。该域名经过加密后存储在几个数据块中,这些数据块通过 XOR 运算进行解密。尽管 XMRig 可以处理域名,但攻击者决定采取额外的步骤,实施自己的 DNS 解析功能。他们直接与 Google 的 DNS 服务器 (8.8.8.8) 进行通信并解析其响应,以便将该域名解析为 IP 地址。

配置的最后一部分内容也以类似方式进行加密,它是挖矿程序连接到矿池时使用的密钥。总体而言,挖矿程序的整个配置如下所示:

<miner_binary_name> -o <pool_ip> --rig-id <random_id> --threads <cpus> –pass espana*tea

发现少了什么吗?是的,没有钱包地址。

我们认为,攻击者选择了运行自己的私人矿池而不是公共矿池,从而不再需要指定钱包(他们的矿池,他们做主!)。但是,我们在样本中观察到挖矿程序的域名并未通过 Google 的 DNS 进行解析,因此我们无法真正地证实自己的观点,也无法从矿池中收集更多数据,因为我们得到的域名已无法再进行解析。最近我们没有发现任何投放挖矿程序的事件,因此也有可能攻击者已决定放弃,转而寻找更好的方法。

Mirai 的过时催生出采用 Rust 编写的蠕虫

我们最近发现的事件中还有 P2PInfect 的一些样本,P2PInfect 是采用 Rust 编写的一种点对点自我复制蠕虫。虽然这种蠕虫于 2023 年 7 月首次被发现,但我们从 2023 年 1 月开始就已经观察到 NoaBot 活动,这意味着后者比 P2PInfect 出现得更早一些。攻击者为什么从 Mirai 切换到其他僵尸网络?甚至可能是自定义的僵尸网络?我们没有明确的答案,但有几点猜测。

首先,由于自定义代码是经过修改的,因此它比重用代码更难进行逆向工程。其次,攻击者似乎非常精通技术,因此他们可能出于好奇或无聊(或兼而有之)而尝试进行恶意软件开发。最后,由于 P2PInfect 的目标是 Redis 服务器,因此这可能只是一个使用不同工具来达成不同目的的案例。

如何知道是相同的攻击者,而不是某种合作?我们无法 100% 确定,但已经很接近答案了。这一切可以归结为恶意软件的技术专业性,以及青少年在圈内笑话方面所表现出的成熟度,包括在挖矿程序的名称中插入粗俗用语,在恶意软件二进制文件内嵌入游戏中的流行歌曲的歌词以及在扫描开放端口时发送“hi”。 

P2PInfect 继承了这一传统。它看似是一个复杂的工具,但使用的是 Unix 套接字并将其命名为“NunzombiE”(图 8)。该蠕虫病毒会在运行时对 NunzombiE 进行混淆处理和解码,同时还嵌入了“fast_vuln_file”和“slow_vuln_file”字符串,对于可执行文件来说这是完全合法的字符串,因此这里不会产生危险信号。

13904 socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3 13904 bind(3, {sa_family=AF_UNIX, sun_path=@"NunzombiE"}, 12) = 0 图 8:通过 Strace 跟踪到 P2PInfect 蠕虫创建了名为 NunzombiE 的 Unix 套接字

受害者研究

2023 年有 849 个不同的源 IP 攻击了我们的蜜罐。通过查看地理位置,我们可以看到攻击活动在世界各地的分布相当均匀。这很容易理解,由于该恶意软件是蠕虫式恶意软件,因此每个新的受害者自身都会变为攻击者。但是有一个很突出的活动热点,那就是中国,在我们于 2023 年发现的所有攻击中占比接近 10%,是图 9 中最亮的热点。

NoaBot 攻击源的地理热图。欧洲、美国、南美和亚洲的活动水平一致。只有中国中部地区的活动水平增加。 图 9:NoaBot 攻击源的全球地理位置热图

抵御、检测、模拟

该恶意软件通过普通的旧式 SSH 凭据字典攻击完成横向移动。

限制对您网络的任意互联网 SSH 访问可以显著降低感染风险。此外,使用高强度密码(而不是默认密码或随机生成的密码)也可以让您的网络更加安全,因为该恶意软件使用基本的可猜测密码列表。我们已经在 GitHub 存储库中共享了该恶意软件所使用的凭据集。

关于该恶意软件的检测方法,除了查找其二进制名称外,没有太多可说的。该软件会从 /lib 下随机生成的文件夹运行,因此查找进程名称也可能有效。如果安装了该软件,应该也可以检测其 cron 作业。我们在存储库中还提供了 IOC CSV 文件及挖矿程序的一些 YARA 签名。

为便于您测试网络环境对该僵尸网络的 SSH 传播程序的抵御能力,我们创建了 Infection Monkey 的 配置文件 ,并在附录中附上了使用方法的简要说明。 Infection Monkey是我们的开源入侵模拟平台。请记住,由于该恶意软件使用了非常大的凭据集,因此要想对所有凭据进行测试并不实际(恶意软件不关心计算或时间成本,但我们关心)。所以,我们选择只在配置中包含更常见的凭据。如果您想添加更多凭据(或添加不同的凭据),可以根据需要按照此配置进行构建并添加您自己的修改内容。

此 Infection Monkey 配置文件还增加了一个伪装字符串,该字符串会导致 YARA 签名在 Monkey 代理负载上触发,因此您可以使用它来测试检测结果。

在完成对环境的测试后,Infection Monkey 会创建一份报告,列出它成功入侵的所有计算机。如果您想将攻击模拟提升到更高级别,并测试更强的凭据,还可以使用其加密劫持插件。

总结

从表面上看,NoaBot 攻击活动不太复杂,似乎“只是”一个 Mirai 变体兼 XMRig 加密货币挖矿程序,而且现在随处可见。但是,该恶意软件中增加的混淆处理以及向原始源代码中增加的代码描绘出了一幅截然不同的画面,这表明攻击者并不简单。尽管攻击者拥有技术能力,但他们的一些命名规范似乎不太成熟(例如,名为“NunzombiE”的 Unix 套接字),即使在不同的恶意软件样本和二进制文件中也仍然如此。我们通过这一特征将 NoaBot 与 P2PInfect 联系起来,也许该检测线索也适用于未来的恶意软件活动。

附录:使用 Infection Monkey 测试您的环境

  1. 根据您的操作系统,安装 Infection Monkey:

    1. Windows

    2. Linux

    3. Docker

  2. 按照 安装说明进行操作。

  3. 从 Infection Monkey UI 的插件页面中下载 SSH 漏洞利用程序插件。

Infection Monkey 插件屏幕。屏幕上有三个切换选项卡,分别对应于可用插件、已安装插件和上传新插件。页面上打开的是“可用插件”选项卡。 图 10:Infection Monkey 插件屏幕。使用搜索栏查找 SSH 漏洞利用程序插件并进行下载。
  1. 导入 配置文件以模拟 NoaBot。

Infection Monkey 岛的配置屏幕。屏幕上有漏洞利用程序部分和已启用的漏洞利用程序列表,列表是空的。 图 11:Infection Monkey 配置屏幕。您可以点击“Import config”(导入配置)按钮来导入我们提供的配置。
  1. 在配置页面的“Network Analysis”(网络分析)选项卡中配置尝试攻击的目标。

  2. 运行 Infection Monkey。

  3. 转到 感染图页面 ,观察攻击情况。 

  4. 如果您想停止模拟,可以随时点按“Kill All Monkeys”(终止所有 Monkey 进程)按钮来结束攻击。



Stiv Kupchik

寫於

Stiv Kupchik

January 10, 2024

Stiv Kupchik

寫於

Stiv Kupchik

Stiv Kupchik 是 Akamai 安全研究员团队的负责人。他的研究项目主要涉及操作系统内核、漏洞研究和恶意软件分析等领域。他曾在 Black Hat、Hexacon 和 44CON 等会议上展示过他的研究成果。除了是一名网络安全专业人士外,Stiv 还拥有物理学学士学位。