如何识别并清除服务器上的挖矿木马:一份从告警到康复的处置手册

【免费下载链接】xmrig RandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark 【免费下载链接】xmrig 项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig

当一台服务器的 CPU 持续满载、风扇昼夜狂转,而业务流量却毫无起色时,它很可能已经被挖矿木马(一种悄悄占用你机器算力为别人打工的恶意程序)寄生。本文面向运维人员、服务器管理员和刚入门的安全新手,以一次真实事件的处置时间线为骨架,完整演示如何检测挖矿进程、固定证据、彻底清除并加固防线。你不需要攻防背景,只要照着操作,就能把被劫持的服务器抢救回来。

一句话结论:挖矿木马并不神秘,它只是“偷偷运行、悄悄连外、偷偷自启”三个动作的组合。我们的任务,就是把这三个动作逐一揪出来。

第一幕 从"体检单"看异常:三分钟定位可疑进程

一切始于一条告警。凌晨 3 点 47 分,监控平台推送:某台 16 核业务服务器的 CPU 使用率连续 20 分钟超过 95%。运维登录后发现,业务进程实际只占用了不到 5% 的算力——剩下的 90% 去哪了?

这就是排查的起点。如何检测挖矿进程,不需要花哨的工具,先做三件最基本的“体检”。

动作一:按 CPU 占用排序,找出“隐形房客”

ps aux --sort=-%cpu | head -n 15

这段命令把所有进程按 CPU 占用从高到低排列,只看前 15 行。挖矿是纯算力买卖,最直接的痕迹就是 CPU 打满。正常业务服务器常年会有几个高占用进程,但名字往往一目了然;一旦出现陌生的、以纯字母或系统名伪装的高占用进程,就值得警惕。

动作二:看网络连接,谁在向外“打工”

ss -antp | grep ESTABLISHED

挖出来的算力必须通过矿池变现,所以木马必然要主动向外建立 TCP 连接。ss 是查看网络连接的现代工具,-p 参数会显示每个连接对应的进程。重点看两个信号:一是目标 IP 归属地为境外或云服务商;二是目标端口是挖矿常见端口——3333、5555、4444、14444、443 等。

动作三:全盘点名,揪出改名换姓的进程

pgrep -af 'xmrig|miner|kworker|systemd-log|\.sh$'

挖矿木马最爱用 xmrig 及其变体(这是一个开源的 CPU/GPU 挖矿程序,功能本身合法,但常被恶意改造),也爱把进程伪装成 kworker(真实的内核线程名)或 systemd-xxx。pgrep -af 会同时显示进程号与完整命令行,快速扫一遍,可疑对象基本现形。

挖矿木马排查:被劫持服务器上满载运行的xmrig终端输出

上图是一台机器运行 xmrig 时终端会呈现的画面:哈希率、矿池地址(示例中为 hashvault.pro)、线程数一应俱全。如果你在服务器上看到类似输出,而这份“业绩”与你无关——那你的机器正在替别人挖矿。

观察维度健康服务器的正常表现值得警惕的异常信号
CPU 占用随业务波动,空闲时回落持续 90%+,且与业务进程无关
网络连接连接固定的业务端口/域名出现未知境外 IP,端口为 3333/5555/443 等
进程列表名称可辨认,可追溯启动方式陌生二进制名,或伪装成 kworker/systemd-*
日志行为有启动记录、有退出痕迹无日志输出,或日志文件被删除

第二幕 先别急着 kill:把"案发现场"固定下来

很多人发现可疑进程后的第一反应是 kill -9。但专业的处置顺序恰恰相反——先取证,再动手。原因有两个:

第一,误杀风险。pkill -f xmrig 这类命令会匹配“命令行里包含 xmrig 字样”的所有进程。如果你自己或同事恰好在跑合法的监控脚本、分析工具,甚至只是文件名里带这两个字,都会被误伤。

第二,反查需要。进程是活的线索库:它的可执行文件路径、启动参数、工作目录、甚至删除了哪些文件,都记在 /proc/<进程号>/ 目录里。一旦杀掉,这些信息全部消失,攻击者是怎么进来的、藏在哪里,就无从考证。

所以正确姿势是:先做一次“快照”再动手。

PID=12345                                    # 换成你查到的进程号
cat /proc/$PID/cmdline | tr '\0' ' ' && echo # 完整启动参数
readlink -f /proc/$PID/exe                   # 真实可执行文件路径
ls -l /proc/$PID/fd                          # 进程打开的文件句柄
cat /proc/$PID/cgroup                        # 判断是否被容器/服务托管

核心警示:/proc/<PID>/exe 是破解“进程伪装”的钥匙。无论进程名字起得多像系统组件,readlink 一读,真实路径立刻现形——木马常藏在 /tmp、/dev/shm、/var/tmp 这类可写目录里,与它的“系统进程”人设完全不搭。

第三幕 解剖一个嫌疑进程的五个切口

拿到快照后,进入“xmrig 恶意进程排查”的核心环节:判断它到底是什么、为谁工作、怎么实现开机自启。五个切口依次查。

切口一:查配置文件,看它“为谁打工”

xmrig 类木马通常与一个 config.json 配置同目录或同目录附近。找到它,重点看四个字段:

{
  "donate-level": 0,          // 官方默认是 1% 捐赠;恶意变种往往改成 0
  "background": true,         // 后台运行,隐藏窗口
  "log-file": null,           // 关闭日志,不留下运行痕迹
  "pools": [ { "url": "strange-pool.example.com:443", "user": "钱包地址" } ]
}

判断逻辑很简单:矿池地址不是你认识的,钱包地址不是你的,它就是在偷你的电。顺带一提,官方 xmrig 默认矿池是 donate.v2.xmrig.com:3333,且 donate-level 默认值为 1;凡是把捐赠改成 0 的,极大概率是被人改造过的变种。

切口二:查哈希与签名,验明正身

sha256sum /proc/$PID/exe
file /proc/$PID/exe

sha256sum 算出二进制指纹,file 判断编译平台。然后拿着这个哈希去比对官方发布的校验值。更严谨的做法是校验签名:官方项目随仓库附带 GPG 公钥(位于 doc/gpg_keys/xmrig.asc),正式发布版均有对应签名。恶意变种通常无法伪造签名,哈希也对不上。

如果需要直接对照源码或核对版本号,可以拉取官方仓库:

git clone https://gitcode.com/GitHub_Trending/xm/xmrig
cd xmrig && git tag | tail -n 5

用二进制里打印的版本 banner 与仓库 tag 比对,版本对不上或源码对不上,基本坐实是魔改版。

切口三:查启动项,挖出“持久化”通道

木马最怕重启,所以必然给自己装“续命装置”。四个地方逐一查:

crontab -l                                          # 当前用户计划任务
cat /etc/crontab && ls /etc/cron.d/                 # 系统级计划任务
systemctl list-unit-files | grep -iE 'xmrig|miner'  # systemd 服务
grep -n xmrig ~/.bashrc ~/.profile /etc/rc.local 2>/dev/null

另外还有一个容易被忽略的高阶手法:LD_PRELOAD 注入。攻击者会在 /etc/ld.so.preload 里写入一个共享库,让 ps、top 等命令“选择性失明”。顺手检查:

cat /etc/ld.so.preload 2>/dev/null

一旦这个文件非空,说明进程可能已经会“隐身”,前面的 ps 结果都不可信,必须用 ls /proc | grep -E '^[0-9]+$' 直接枚举进程号来交叉验证。

切口四:查网络对端,画出入侵地图

ss -antp | grep $PID

按进程号过滤它的所有连接,记录对端 IP。这一步有两个用途:一是确认木马连通的外部矿池;二是把 IP 交给防火墙/EDR 封禁,属于“断其后路”。建议把 IP、时间、进程行为一并记入处置工单。

切口五:查宿主目录,锁定藏身文件

ls -la /proc/$PID/cwd

查看进程的工作目录。木马常把全套文件(二进制、配置、启动脚本)放在同一个临时目录,找到 cwd 就等于找到了它的“老巢”,下一步清理时才能一锅端。

Windows 服务器对照:命令体系不同,思路完全一致——用 PowerShell 查进程、路径与命令行,再查注册表与计划任务:

Get-CimInstance Win32_Process | Where-Object {$_.Name -match 'xmrig|miner'} | Select ProcessId,ExecutablePath,CommandLine
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
schtasks /query /fo list | findstr /i xmrig

第四幕 清除四连:断、杀、清、验

确认是挖矿木马后,按“断 → 杀 → 清 → 验”四步执行。这四步构成一套完整的 Linux 挖矿木马清除教程,每一步都在前一步的基础上推进。

第一步:断——切断与外界的连接

先封堵木马的通信,再处置本体,避免它一边被清理一边继续回传或下载新载荷。在防火墙上封禁已确认的对端 IP(示例为 iptables,Cloudflare/云安全组同理):

iptables -A OUTPUT -d 203.0.113.10 -j DROP

如果服务器没有业务需要对外发起大量连接,也可以直接按端口封,把 3333/5555/4444 这类挖矿端口一律设为出站拒绝。

第二步:杀——按进程号精确终止

用第一步取证得到的 PID 精确处理,不要用模糊匹配:

kill $PID          # 先发温和信号
sleep 2
kill -9 $PID       # 10 秒后仍在,再强制终止

Windows 侧对应 taskkill /f /pid 1234。若该进程由 systemd 托管,先停掉服务单元再杀进程,否则会被自动拉起:

systemctl disable --now miner.service

第三步:清——连同“老巢”一起删除

按第三幕查到的 cwd 与真实路径,把整个目录删除。动手前务必 ls -la 再确认一遍路径,避免误删系统目录:

sudo rm -rf /dev/shm/.system-xmrig/ /tmp/.cache-xmrig/

随后做一次全盘搜索,防止有分身或备份:

sudo find / -iname '*xmrig*' -o -iname '*miner*' 2>/dev/null

重点复查 /tmp、/dev/shm、/var/tmp、/usr/lib 这些木马惯用藏身处。接着清理持久化项:把 crontab -l、/etc/cron.d/、systemd 服务文件里与木马相关的内容逐条移除(建议先备份再改)。若 /etc/ld.so.preload 被篡改,恢复为空文件并删除对应 .so 文件。

第四步:验——确认系统完好无损

清除后必须验证两件事:系统文件没被破坏、木马没有复活。

debsums -c     # Debian/Ubuntu 系,校验已安装软件包文件完整性
rpm -Va        # RHEL/CentOS 系,报告被改动的系统文件

再等 10~15 分钟复查 CPU 与进程列表,确认没有“复活”。Windows 侧对应 sfc /scannow 与 DISM /Online /Cleanup-Image /RestoreHealth。

第五幕 给服务器打"疫苗":配置加固与监控规则

清完只是“治标”。如果漏洞不补、监控不建,攻击者随时能再进来。这里给出两层加固,属于企业服务器安全加固的标准动作。

第一层:如果确实需要合法使用 xmrig

xmrig 本身是合法工具,若你的业务就是要用它做性能测试或 RandomX 基准测试,务必把配置“锁死”,避免被远程接管或滥用:

{
  "http": {
    "enabled": true,
    "host": "127.0.0.1",
    "port": 0,
    "access-token": "一段足够长的随机字符串",
    "restricted": true
  },
  "cpu": {
    "enabled": true,
    "max-threads-hint": 50
  },
  "log-file": "/var/log/xmrig.log",
  "background": false
}

这段配置的作用:API 只监听本机回环地址并强制随机令牌认证(restricted: true 禁止远程改配置);max-threads-hint 限制 CPU 占用上限;日志落盘,任何异常都有据可查。

第二层:全服务器层面的监控规则

推荐部署三类规则,让“下一次告警”来得更早:

监控对象建议规则告警动作
CPU 使用率单进程持续 >80% 且超过 10 分钟自动抓取该进程的 exe 路径与命令行快照
网络连接新建到非业务白名单 IP 的出站连接记录对端、端口并触发封禁
文件系统/tmp、/dev/shm 出现新的可执行文件立即告警并纳入哈希比对
启动项crontab、systemd 服务、注册表 Run 键被修改发送变更通知

日常也可以给自己留一个“病历本”:用 cron 每 5 分钟把 CPU 前 10 的进程快照写入日志,出问题时直接翻历史,还原案发时间点。SSH 改用密钥登录并关闭口令认证、及时给中间件打补丁、最小化开放端口,这些常规动作能把木马的“入场券”直接撕掉。

第六幕 实战复盘:一台裸奔 Redis 的 48 小时

理论讲完,来看一次完整的攻防推演。某公司一台承载缓存业务的服务器,因为 Redis 未设密码且未绑定内网,沦陷过程如下:

mermaid

处置过程按本手册推进:先用 ps aux --sort=-%cpu 看到名为 kworker 的进程异常占用 600% CPU,但 readlink /proc/<pid>/exe 指向 /dev/shm/.redis-cache/——真实路径与“内核线程”人设完全矛盾;随后在配置文件中发现 donate-level: 0 和境外矿池地址,证据闭环;最后封禁对端 IP、终止进程、删除 /dev/shm/.redis-cache/、清理 crontab、恢复 Redis 配置并绑定内网、启用密码认证,48 小时内完成从沦陷到康复的全过程。

复盘启示:木马本身不复杂,真正的漏洞往往是你“以为不要紧”的默认配置。未认证的 Redis、弱口令 SSH、开放到公网的管理端口,才是整条攻击链的起点。

离开页面前的行动清单

  1. 今天就做一次体检:在你负责的每台服务器上跑一遍第一幕的三个命令,把异常项截图留档。
  2. 建立取证习惯:遇到可疑进程,先记下 PID、路径、命令行与网络对端,再决定是否终止,不要上来就 kill -9。
  3. 检查一遍持久化通道:crontab、systemd、注册表 Run 键、/etc/ld.so.preload,四选一漏掉都可能留下“复活点”。
  4. 补上监控盲区:给 CPU、出站连接、临时目录写入各配一条告警规则,让木马无所遁形。
  5. 顺手加固入口:Redis/MongoDB 等中间件绑定内网并启用认证,SSH 关闭密码登录,把你的服务器从“裸奔名单”里划掉。

下一期,我们将聚焦文件完整性监控(FIM)在企业服务器上的落地实践,看看如何用“系统快照比对”让任何一次文件篡改都无处可藏,欢迎持续关注。

【免费下载链接】xmrig RandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark 【免费下载链接】xmrig 项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐