服务器CPU被偷到100%?挖矿木马排查与清除实战手记
【免费下载链接】xmrigRandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig
服务器CPU异常飙到100%却找不到原因?这篇文章把挖矿木马排查的完整流程讲透:从发现挖矿进程清理,到阻断持久化,再到系统加固,手把手带你走完一次真实的挖矿病毒应急。文中所有命令、顺序和清单都来自一线实战,你可以直接复制到终端里照做。
第一章 凌晨三点,告警把值班群炸醒了
先说个真实场景。凌晨 3:17,值班手机连响十几声,监控平台弹出红色告警:一台 8 核 16G 的数据库从库 web-03,CPU 占用率连续 15 分钟维持在 98% 以上,load average 从 0.2 一路飙到 42。更诡异的是,当晚业务流量并没有任何增长。
登录服务器后敲下top,满屏的进程几乎全是红的。仔细一看,占用最高的不是 Java、不是 MySQL,而是一堆名字"似曾相识"的陌生进程:kworker、sysupd,以及一串随机字母组成的可执行文件。这就是典型的"CPU 被征用"——你的算力正在被偷偷拿去挖矿。
先别急着杀进程。按照下表的症状对照,确认自己处在哪个阶段,再跳转到对应章节处理,这一步很关键:
| 你观察到的现象 | 常见诱因 | 建议直接看 |
|---|---|---|
| CPU 长期 90%+,多核一起打满且无业务高峰 | 挖矿进程多线程并行计算 | 第二章 |
| 进程名像系统进程,但真实路径在 /tmp、/dev/shm | 伪装进程 + 文件隐藏 | 第三章 |
| 非业务时段仍高频外连陌生 IP | 矿池通信 | 第二章 |
| 杀掉进程几分钟后又自己冒出来 | 持久化/守护进程反复拉起 | 第四章 |
| 多台机器同一时间集体异常 | 横向扩散或同源批量入侵 | 第五章 |
第二章 CPU占用100%排查:从 top 到 /proc 的取证链
确认"CPU 异常"是第一步,接下来要做的是定位"是谁在吃 CPU"。请按下面的顺序逐步执行:
# 1. 按 CPU 占用排序,看清完整命令行 top -c # 或者直接输出快照 ps aux --sort=-%cpu | head -20你会看到进程名只是表象,top -c会显示完整参数行。接着用/proc文件系统给可疑进程"做体检"——这一步很关键,它能揭开伪装的画皮:
# PID 换成你发现的可疑进程号 ls -l /proc/PID/exe # 符号链接指向真实的可执行文件 cat /proc/PID/cmdline | tr '\0' ' ' # 完整启动参数 readlink /proc/PID/cwd # 进程的工作目录 file /proc/PID/exe # 识别文件类型(ELF 还是脚本)同时别忘了查网络连接。挖矿进程必须和矿池通信,顺着这条线往往能一击致命:
ss -antp | grep ESTAB lsof -i :5555请留意:3333、5555、14444、137 是历史上最常被挖矿木马使用的矿池端口,443 常用于加密隧道混淆。如果某个进程频繁连接境外 IP 的这类端口,基本可以实锤。
上图是一份"合法挖矿程序长什么样"的参照样本:界面中会明确显示矿池地址、算法名称(如 rx/0 RandomX)、算力数值(H/s)和 accepted 记录。如果你在服务器上抓到的是这种进程,且确认不是自己部署的,那同样属于被入侵——只是入侵者连伪装都懒得做了。
第三章 挖矿进程伪装识别:sysupd 到底是什么?
回到案例。刚才那个叫sysupd的进程,名字模仿的是 Linux 系统更新守护进程,乍一看人畜无害。但执行readlink /proc/PID/exe之后,真面目立刻暴露:它的真实二进制位于/dev/shm/.X11/sysupd。
请留意这个路径。/dev/shm是内存盘,重启即消失,非常适合藏匿可执行文件;隐藏目录名.X11也很有欺骗性。继续深挖还会发现三个疑点:
- 二进制没有任何数字签名,
strings提取后能看到一串矿池地址和donate-level 0参数; - 文件时间戳被动过手脚(用了
touch -r伪造成年份久远的系统文件); - 全程没有日志输出,标准输出被重定向到
/dev/null。
下面这张对比表,是挖矿进程伪装识别最实用的工具,建议收藏:
| 对比维度 | 正常服务进程 | 可疑挖矿进程 |
|---|---|---|
| CPU 占用 | 随业务波动,有低谷有高峰 | 恒定 90%+,24 小时不降 |
| 可执行文件位置 | 系统目录或业务目录 | /tmp、/dev/shm、/var/tmp |
| 进程名与文件 | 名实一致,可签名校验 | 仿冒 kworker/sysupd 等,路径对不上 |
| 网络行为 | 内网或已知业务端口 | 高频外连矿池,3333/5555/14444 |
| 日志行为 | 有完整日志可追溯 | 无日志或输出丢弃 |
| 被 kill 后 | 守护进程按规则拉起 | 被计划任务/服务反复拉起 |
对照这张更老的挖矿程序界面你也会发现:即便被伪装成系统进程,只要把进程参数、连接目标、文件路径三项一交叉,伪装必然露馅。
第四章 挖矿持久化清理与挖矿病毒清除命令:先拆钉子再拔牙
定位到元凶后,最忌讳的就是直接kill -9——很多新手在这里栽过跟头。挖矿木马几乎都配置了多重持久化机制,进程死了,几秒钟后就会被重新拉起,看起来像"杀不死"。
所以正确的顺序是:先拆持久化,再杀进程,最后删文件。
# 第一步:盘点持久化入口 crontab -l # 当前用户计划任务 ls /etc/cron.d/ && cat /etc/crontab systemctl list-unit-files --state=enabled ls -la /etc/systemd/system/ # 找最近新增的 .service cat /etc/rc.local # 开机启动脚本 grep -i 'sysupd\|xmrig' ~/.bashrc /etc/profile.d/* 2>/dev/null本例中,攻击者一共埋了三处钉子:一个名为systemd-update.service的 systemd 服务、一条每分钟执行的 root crontab,以及/etc/rc.local里的启动行。三处都指向同一个脚本,脚本负责拉起挖矿进程。处置时按下面的挖矿病毒清除命令执行:
# 第二步:逐个拆除持久化 systemctl disable --now systemd-update rm -f /etc/systemd/system/systemd-update.service crontab -r # 或精确删除对应条目 # 第三步:终止进程 pkill -9 -f sysupd kill -9 <PID> # 第四步:清理落盘文件 rm -rf /dev/shm/.X11 /var/tmp/.sysupdate清剿完成后不要急着收工,重启服务器复查一遍:确认进程不再出现、端口不再监听、计划任务列表干净,才算是真正结束。整体处置链路可以用下面的图概括:
第五章 亡羊补牢:端口、口令、配置三件套加固
清剿只是治标,把后门堵上才是治本。本次入侵的入口,最终追溯到这台机器把 Docker 的 2375 端口(未授权远程 API)暴露到了公网——攻击者直接调用 Docker API 起了一个挂载宿主目录的容器,把挖矿程序送了进来。
加固请按三件套执行:
- 端口收敛:2375 这类管理端口绝不监听 0.0.0.0,要么走内网,要么上 TLS 双向认证;用
ufw/firewalld把对外端口收敛到白名单。 - 口令硬化:排查 SSH 弱口令,禁用 root 直接登录,改为密钥认证,并检查
~/.ssh/authorized_keys里有没有被塞入陌生公钥。 - 配置防篡改:如果你自己也在运行 xmrig 这类开源矿工程序,别让配置文件裸奔——参考
src/config.json中的 http 配置段,开启access-token并设置restricted,防止 API 被未授权读取或改写;算法与接口细节可查阅doc/ALGORITHMS.md和doc/API.md。
{ "http": { "enabled": true, "access-token": "替换为强随机字符串", "restricted": true } }第六章 总结与行动清单
一次完整的挖矿木马应急,本质上就是"发现 → 定位 → 识别 → 清剿 → 加固 → 复盘"的闭环。下面是浓缩后的行动清单,建议打印出来贴在工位上:
发现阶段
- 收到 CPU 高占用告警,先确认业务是否真的有高峰
top -c+ps aux --sort=-%cpu找出异常进程
定位阶段
- 用
/proc/<PID>/exe读取真实路径,交叉验证进程名 ss -antp追踪外连目标,重点盯 3333/5555/14444 端口
识别阶段
- 对照"正常 vs 可疑"对比表逐项打分
- 检查文件时间戳、日志行为、数字签名
清剿阶段
- 先拆持久化(systemd/crontab/rc.local),再 kill 进程,最后删文件
- 重启复查,确认无复活、无残留监听
加固与复盘
- 收敛管理端口、加固口令、开启配置文件访问控制
- 记录本次进程名、矿池 IP、持久化路径,更新监控告警规则
把这份清单沉淀成标准作业流程,下次哪怕换个马甲再来,你也能在十分钟内把它按回去。
【免费下载链接】xmrigRandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考