挖矿程序入侵服务器导致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

 

posted @ 2023-02-04 20:58  ismallboy  阅读(729)  评论(0编辑  收藏  举报