记一次服务器被当成矿机挖矿,CPU一直99%不下

1,886 阅读3分钟

问题排查与解决过程

top 查询CPU占用过高的程序

Tasks: 254 total,   1 running, 253 sleeping,   0 stopped,   0 zombie
%Cpu(s):  99.2 us,  0.5 sy,  0.0 ni, 91.0 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16266124 total,   196652 free, 15210732 used,   858740 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   439680 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                              
17194 root  20   0 7391168   1.3g  34748 S  59.5  558.2   8083:37 -bash                                                                         
26099 root      20   0 3558676  80924   4120 S   1.7  0.5 113:04.64 cmagent                                                                              
30400 clouder+  20   0 8143696   1.6g  13308 S   1.0 10.3  67:36.12 java   

发现-bash占用550%的CPU,导致CPU总占用为99%

kill -9 pid后发现,过一会,-bash又启动了

查询定时任务

crontab -e 
****** /mnt/.systemd/-bash > /dev/null 2>&1

发现在用户的定时任务crontab中 /mnt/.systemd/-bash 每分钟定时跑一次,-bash内容如下:

#!/bin/bash
cd -- /mnt/.systemd
mkdir -- .-bash
cp -f -- x86_64 .-bash/-bash
./.-bash/-bash -c
rm -rf -- .-bash

发现真实的挖矿程序为x86_64,最终删除-bash脚本和x86_64程序

但是,过几分钟后,发现挖矿程序又启动了 ,想着是不是有小时的定时脚本在跑,发现重启的时间正好是整点后的

查询定时任务执行日志

查询定时任务执行日志,分析是否还有其他定时任务在跑

vim /var/log/cron

# 分钟的,正好对应 crontab -e 中的定时脚本
May 30 23:59:01 hadoop2 CROND[29320]: (root) CMD (/mnt/.systemd/-bash > /dev/null 2>&1;)
May 31 00:00:01 hadoop2 CROND[29427]: (root) CMD (/mnt/.systemd/-bash > /dev/null 2>&1;)
May 31 00:01:01 hadoop2 CROND[29529]: (root) CMD (/mnt/.systemd/-bash > /dev/null 2>&1;)

# 小时整点的
May 31 00:01:02 hadoop2 run-parts(/etc/cron.hourly)[29530]: starting sync
May 31 00:01:02 hadoop2 run-parts(/etc/cron.hourly)[29601]: finished sync

通过查询定时任务执行日志发现,还存在小时的定时任务sync在执行,去到/etc/cron.hourly小时任务目录下查看,发现一个脚本为sync,脚本内容为:

#!/bin/bash
#
# Start/Stop the pwnrig clock daemon
#
# chkconfig 2345 90 60
# description: sync clock (GNU System)
cp -f -r -- /bin/sysdrr /usr/bin/-bash 2>/dev/null
cd /usr/bin/ 2>/dev/null
./-bash -c >/dev/null
rm -rf -- -bash 2>/dev/null

分析脚本内容为:复制/bin/sysdrr文件到/usr/bin/下,改名为-bash,启动服务,并删除-bash。从这可以看出/bin/sysdrr基本就是此次被入侵的源头

/bin/ 下找到 sysdrr 挖矿源病毒程序,并删除!同时也可以使用 find / -name sysdrr全盘查找源病毒程序,并删除!

/etc/cron.monthly/ , /etc/cron.weekly/ , /etc/cron.daily/ , /etc/cron.hourly/ 这些定时目录里找到sync程序并删除!

但是在删除/bin/sysdrr文件和sync脚本时发现,使用rm -f命令删除:

rm -f sysdrr 
rm: 无法删除"sysdrr": 不允许的操作

# 使用 lsattr 查看
lsattr /bin/sysdrr 
----i--------e-- /bin/sys

# 解除限制
chattr -R -i /bin/sysdrr
lsattr /bin/sysdrr 
-------------e-- /bin/sysdrr

# 删除成功
rm -f sysdrr

同步骤删除/etc/cron.monthly/ /etc/cron.weekly/ /etc/cron.daily//etc/cron.hourly/下的sync脚本

至此,问题挖矿定时任务和程序文件全部清除,服务器的CPU使用情况恢复正常

总结

服务器的账号的登录密码不能设置的太简单,mysql、redis等服务的端口号尽量不使用默认端口号,相关的账号和密码不能设置过于简单