挖矿程序入侵服务器导致cpu 100%排查
现象:服务器cpu占用100%,但是使用top命令又找不出具体的进程,top中显示出来的进程都很正常,如下:
根据经验,很大概率是中病毒了,可能是有挖矿进程入侵服务器了,一般这种病毒的进程会隐藏,可以学习一下常见隐藏进程的办法。所以我们现在的目的主要是找出隐藏的进程。
解决办法如下:
1.挖矿程序一般会有socket链接,所以使用netstat -natp命令查看一下:
果然有异常的socket,进程id是隐藏的,并且ip比较特殊,一查ip,如下:
竟然是荷兰的,肯定是病毒创建的socket。
2.找出隐藏的进程:(参考:https://www.sohu.com/a/237795183_354899)
查看cat /etc/ld.so.preload文件内容,刚好最近有被修改过,大概率是病毒程序修改的,备份改文件,然后删除改文件rm ld.so.preload。这时候再使用top命令,隐藏的病毒进程显形了,如下:
直接kill -9即可,不过根据经验,kill了进程之后,很快又会自动启动,这种病毒一般是会通过crontab创建定时任务,定时启动的,所以,要把定时任务也关闭才行,否则没用,执行crontab -l如下:
果然有一个异常的定时任务,不知道这个kworkers程序在哪里,尝试使用ps找一下:
原来是在/root/.git/目录下(crontab定时任务执行文件的默认位置是当前目录的根目录),来到/root/.git目录看一下:
根据经验,一般会在/root目录下面创建一些文件和程序,如下:
根据时间过滤,看到果然有好几个非法文件,并且病毒进程文件dbus也在该目录下。
看了一下hideproc.sh文件的内容:
从这个文件里面也能看到一些逻辑。
3.开始处理:
(1)使用kill -9杀掉进程
cpu立马就降下来了。
(2)删除crontab定时任务
(3)删除一些相关的文件
虽然删除了相关文件,但是还是没能彻底解决这个问题,过几天进程又会起来,又把cpu给占满了,就算改了root密码也不行,咨询了相关朋友,建议重装系统,但是里面有很多数据和系统,虽说不是重要的数据,重装系统的话还是比较麻烦,所以想到了一个办法,写shell脚本定时监测并删除挖矿程序就行,为了保险起见,另外再写一个脚本3负责监控系统进程是否存在,不存在的话就自动启动。遂写了两个脚本,脚本1定期检查crontab,如果有挖矿程序的定时任务,及时删除。脚本2监测挖矿进程,如果存在,立刻删除。相关脚本如下:
脚本1-protect.sh:每10秒钟检查一次,有挖矿程序,就删除,并输出相关日志到文件,作为后台任务一直run,启动脚本:nohup ./protect.sh > protect.log &
#!/bin/bash
# 启动脚本:nohup ./protect.sh > protect.log & proccessname=dbus while [ true ]; do rm -rf /etc/ld.so.preload pids=$(ps -ef | grep $proccessname | grep -v grep | grep -v $0 | awk '{print $2}') pid_array=($pids) for x in ${pid_array[@]}; do date echo "find pid: " $x kill -9 $x echo "kill -9 pid:" $x done sleep 10 done
脚本2-protect_cron.sh:每10秒钟检查一次,有挖矿程序的定时任务,就删除,并输出相关日志到文件,作为后台任务一直run,启动脚本:nohup ./protect_cron.sh > protect_cron.log &
#!/bin/bash
# 启动脚本:nohup ./protect_cron.sh > protect_cron.log & crontabname=kworkers while [ true ]; do dbus=`crontab -l | grep $crontabname` if [ -n "$dbus" ]; then date echo "delete crontab job ${dbus}" crontab -l | grep 'kworkders' | crontab - fi sleep 10 done
脚本3 protect_xxx.sh:每分钟监控系统进程是否存在,不存在就执行系统启动脚本,保证系统稳定,脚本如下:
#/bin/bash #启动脚本:nohup sh protect_xxx.sh > protect.log & while [ true ]; do proccessname=xxx pname=`jps -l | grep -v 'sun.tools.jps.Jps' ` if [ ! -n "$pname" ]; then date echo "restarting" ./deploy.sh echo "restart success" fi sleep 60 done