【应急响应】服务器中挖矿病毒怎么办?一站式排查与解决方案
前不久,导师实验室的服务器突然出现异常,CPU持续空转,任务却不见进展。导师找来帮忙处理,我第一反应就是:大概率是被挖矿了。果不其然,前后花了近两周时间,才终于把病毒清理干净。这次遇到的挖矿程序非比寻常,隐藏手段相当高明,普通方法很难察觉,特此记录排查过程供参考。
通过SSH远程连接服务器后,我首先使用 top和 htop查看了系统资源占用。尽管没有运行任何计算任务,CPU 使用率却始终维持在90%左右——典型的挖矿症状。但与以往不同的是,这次病毒进程被刻意隐藏,普通命令难以直接发现踪迹。
以下操作均基于 root 权限执行。

top命令下,CPU占用90%,但是显示没有大型计算程序在运行
发现进程被隐藏后,我立刻在网络上进行了一番搜索,了解到隐藏技术分不同级别——轻则只是替换了常用的系统命令,重则可能涉及内核层面的篡改。为了弄清如何让这些被隐藏的进程显现出来,我继续深入查阅资料。
值得注意的是,连像 htop这样的第三方工具都无法检测到异常进程,这通常意味着问题已不止于命令替换,而更可能是更深层的隐藏手段,比如在内核或系统调用层面做了手脚。
# 查到了如下两个命令可以一定程度上发现被隐藏的进程
sysdig -c topprocs_cpu # 该命令可以输出cpu占用的排行,经测试可以显示出被隐藏的进程
unhide proc # 自助搜索隐藏进程,linux系统中一切皆文件,proc目录下保存的就是所有正在运行程序的进程ID,即PID
以上两个命令需要额外安装,不是系统自带命令
# sysdig可用如下命令安装,curl是类似wget的下载命令,这里下载的是一个bash脚本,下载后再通过bash执行安装
curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash
# unhide 可以通过如下命令进行安装
yum install unhide # 中毒的是Centos7系统,所以用的是yum
安装好这两个命令后,首先试了下unhide,发现弹出了很多隐藏进程编号,个人感觉是一个多线程进程的子线程编号然后尝试使用sysdig命令,输出了如下结果。

ab8d393d为挖矿程序
可以看出这个挖矿程序占用了至少54个计算核心。
进入挖矿进程的PID目录下,可看出该进程的运行信息。

这里显式执行程序已被删除,这里单纯只是系统没有识别到的原因,并不是被真的删除。这里先别急直接用将进程删除掉,以免再次挂起。
# 至于为什么不要第一时间用kill删掉病毒进程,这是一个惨痛教训,后面会提到。
# 首先我们用如下命令查询进行是如何被运行的
systemctl status 60818 # 60818为病毒的PID
# 这里的输出结果PID目录下environ文件内容是类似的
结果输出如下

其中bf1e7ddf为病毒进程
这里前前后后删了多次挖矿进程,所以每次挖矿进程的可执行程序的名字和PID都不一样,不过名字都是由8位的16进制数字组成。可以看出这个挖矿进程是被一个mdcheck什么服务启动的。
# 所以这里我先通过如下命令将该服务停掉
journalctl -u mdcheck-4838751a # 终止之前可以用该命令查看服务运行状态
systemctl stop mdcheck-4838751a # 终止该挖矿服务
systemctl disable mdcheck-4838751a # 终止该挖矿服务的开机自启
从上图中可看出终止之后再查看该挖矿进程状态,其中的服务已经变为失败状态。
# 挖矿病毒都会有定时的网络发送信息,所以可用如下命令查看在病毒运行期间,是否存在异常IP地址
netstat -natp
这里我没有截图留念。其中发现了一个来自美国的IP和一堆欧洲IP链接,经过分析后,这个美国IP是黑客日常发送指令的位置,欧洲IP是接收挖矿密钥的位置。
# 知道这些后,我们可以用防火墙firewalld或iptables对这些IP进行封禁
iptables -I INPUT -s IP -j DROP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="IP" reject'
# 其中IP字段替换为真实的黑客IP
但是发现系统提示说是没有iptables指令,我用whereis命令进行查询发现,系统中存在iptables的源文件,但是可执行文件缺失,我就从相同系统环境的另一台机器上把iptables复制过来,并通过如下命令启动防火墙服务。
systemctl enable iptables # 开机自启
systemctl start iptables # 打开服务
然后通过之前的命令把黑客IP进行封禁。但是重启电脑之后,被关闭的病毒服务又回来了,iptables也被第一时间删除。看来简单关闭挖矿服务是不行的,需要完整的删除。在上图中,我们可以看到挖矿服务在/etc/dns/mdcheck-的目录下。但是一通操作后,发现目录下是空的。甚至在/etc/dns/下也查询不到mdcheck-文件下,除非输入完整路径信息。

这里我想复制一份挖矿服务程序出来,系统提示如下报错
Operation not permitter
root都没权限进行操作。一通检索后才知,linux怕用户误删一些系统必要指令和文件进行的保护,可通过如下命令进行解除。
chattr -iR /etc/dns # 解除改目录的误删保护,R为递归执行,但是文件夹下的病毒都被隐藏,所以这里的R其实没有起作用
这里需要分别用chattr对该目录下的文件逐一全名的进行解除。然后通过rm -rf对dns目录进行删除。最后再利用kill -9命令将挖矿进程删掉,再次重启之后,挖矿服务没有再次被启动。
后来分析了一下服务器被挖矿的原因
# 一方面是ssh远程登录没有禁用root的远程登录,此时需要在/etc/ssh/sshd_config中添加
PermitRootLogin no
# 保存后,对ssh服务进行重启
systemctl restart sshd
另一个值得反思的问题是:为了在多台服务器上统一管理HTCondor任务提交系统,我此前直接关闭了防火墙。实际上更安全的做法应是通过配置IP白名单,仅允许可信服务器IP进行连接,而非彻底放开权限。至此,清除挖矿病毒的应急响应告一段落,整个过程也让我对Linux系统运维有了更深入的理解。
与通常仅在Crontab中写入定时任务实现自启的病毒不同,这次遇到的挖矿程序更为隐蔽——它在系统中注入了服务(Service),并对进程与目录进行了隐藏,使得常规排查手段难以发现,其隐藏手法可谓防不胜防。
在安全加固方面,建议有条件的用户将SSH登录方式改为RSA密钥认证,并禁用密码登录,这能够有效防范绝大多数爆破攻击。通常黑客会尝试常见用户名(如root)配合弱密码进行攻击,由于root用户名在多数系统中存在,因此极易成为目标。事实上,世界上最早一批被抓获的黑客,正是利用用户图省事的行为得逞的。例如在上世纪,很多人喜欢使用“author”这类常见用户名,并设置“123456”或“password”等弱密码,从而为攻击者大开方便之门。
在后续日志审计中,我也发现大量非常用用户名(例如maxwell等)的尝试登录记录。因此,除了强化密码和认证方式外,也建议尽量避免在服务器中使用知名人物、常见词汇或默认用户名作为账户名称,以减少被自动化攻击工具识别的风险。








