现象:服务器cpu占用100%,但是使用top命令又找不出具体的进程,top中显示出来的进程都很正常,如下:
根据经验,很大概率是中病毒了,可能是有挖矿进程入侵服务器了,一般这种病毒的进程会隐藏,可以学习一下常见隐藏进程的办法。所以我们现在的目的主要是找出隐藏的进程。
解决办法如下:
1.挖矿程序一般会有socket链接,所以使用netstat -natp命令查看一下:
果然有异常的socket,进程id是隐藏的,并且ip比较特殊,一查ip,如下:
竟然是荷兰的,肯定是病毒创建的socket。
2.找出隐藏的进程:
查看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