Linux 服务器挖矿病毒排查与清除实战指南
来源:刘军军 | 发布日期:2026-06-13
挖矿病毒是 Linux 服务器最常见的入侵类型之一,特征为 CPU 飙高、进程异常、对外连接矿池。本文通过一次 kinsing 挖矿木马 的真实生产事件,完整复现从发现、分析、清除到加固的全流程。
一、发现异常
告警触发
收到 Prometheus 告警:CPU 使用率持续超 95%。登录服务器查看:
# 查看系统负载和异常进程
top
典型异常特征:
| 现象 | 判断 |
|---|---|
| 多个同名未知进程(如 kinsing)占用 99% CPU | 可疑进程,可能是挖矿病毒 |
| 系统负载高达 30+ | 资源被恶意消耗 |
| Swap 几乎耗尽 | 内存资源紧张 |
| 进程名匹配已知挖矿木马(kinsing、xmrig 等) | ✅ 确认挖矿病毒 |
保护现场
在清除之前,先保存证据:
# 进程与资源快照
ps aux > /tmp/ps_before.txt
top -bn1 > /tmp/top_before.txt
# 网络连接快照
netstat -antp > /tmp/netstat_before.txt
ss -antp > /tmp/ss_before.txt
# 系统日志
cp /var/log/messages /tmp/messages_backup
cp /var/log/secure /tmp/secure_backup
cp /var/log/cron /tmp/cron_backup
二、深入分析
进程分析
ps aux | grep kinsing
ls -la /tmp/kinsing # 启动路径
file /tmp/kinsing # ELF 可执行文件
md5sum /tmp/kinsing # 记录文件哈希
网络连接
查看进程建立的对外连接,确认连接矿池:
netstat -antp | grep kinsing
# 例:连接 DigitalOcean(45.33.32.156)、Cloudflare(104.238.153.171)
进程树与启动方式
pstree -p | grep kinsing
ps -ef | grep kinsing | head -1
# 父进程为 init(PID 1) → 通过系统服务或定时任务启动
检查持久化机制
挖矿病毒通常会在多处建立持久化:
# 定时任务
crontab -l
ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.weekly/
cat /etc/cron.d/kinsing
# 系统服务
ls -la /etc/systemd/system/ | grep kinsing
cat /etc/systemd/system/kinsing.service
systemctl list-unit-files | grep kinsing
# SSH 后门
cat /root/.ssh/authorized_keys
# 检查未知公钥
grep "Failed password" /var/log/secure | tail -20
grep "Accepted password" /var/log/secure | tail -5
入侵时间线推演
通过日志还原攻击过程:
grep -E "Mar 15 07:3[0-9]" /var/log/messages
典型攻击链:
- 07:30 — 攻击者暴力破解 SSH 密码
- 07:35 — 破解成功,获得 root 权限
- 07:36 — 创建定时任务和 systemd 服务
- 07:36 — 下载并执行挖矿程序
- 07:45 — 系统负载急剧上升
- 09:15 — 监控告警触发
三、清除步骤
1. 隔离网络
ifdown ens33 # 立即断网
iptables -A OUTPUT -j DROP # 或 iptables 阻断出站
2. 终止进程
killall -SIGTERM kinsing # 先尝试正常终止
killall -9 kinsing # 无效则强制终止
ps aux | grep kinsing || echo "进程已清除"
3. 删除恶意文件与持久化
# 删除程序本体
rm -f /tmp/kinsing
# 删除所有定时任务
rm -f /etc/cron.d/kinsing /etc/cron.daily/kinsing
rm -f /etc/cron.hourly/kinsing /etc/cron.weekly/kinsing
crontab -r # 删除用户定时任务
# 删除系统服务
rm -f /etc/systemd/system/kinsing.service
systemctl daemon-reload
# 清理 SSH 后门
cp /root/.ssh/authorized_keys /root/.ssh/authorized_keys.bak
# 只保留合法密钥
4. 修改密码与恢复网络
passwd root # 修改 root 密码(12位+强密码)
systemctl restart sshd
iptables -F OUTPUT # 恢复出站规则
ifup ens33 # 恢复网络
四、系统加固
SSH 安全
cat >> /etc/ssh/sshd_config << 'EOF'
PasswordAuthentication no # 禁止密码登录
PermitRootLogin no # 禁止 root 远程登录
AllowUsers ops admin # 限制登录用户
Port 2222 # 修改 SSH 端口
MaxAuthTries 3 # 限制认证次数
PubkeyAuthentication yes
EOF
systemctl restart sshd
防火墙
systemctl enable --now firewalld
firewall-cmd --add-service=ssh --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
安装 fail2ban
dnf install -y fail2ban
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
EOF
systemctl enable --now fail2ban
五、根因分析模板
| 原因 | 说明 |
|---|---|
| 弱密码 | root 密码为默认值,极易被暴力破解 |
| SSH 端口开放 | 22 端口对公网开放,无访问限制 |
| 未启用密钥认证 | 仅依赖密码认证 |
| 无入侵检测 | 未部署 fail2ban 等防护措施 |
六、命令速查
应急响应
| 命令 | 作用 |
|---|---|
top |
查看 CPU 和进程状态 |
ps aux |
查看所有进程 |
netstat -antp |
查看网络连接 |
ifdown eth0 |
断开网络 |
killall -9 <进程名> |
强制终止进程 |
取证分析
| 命令 | 作用 |
|---|---|
file <文件> |
查看文件类型 |
md5sum <文件> |
计算文件哈希 |
pstree -p |
查看进程树 |
crontab -l |
查看定时任务 |
grep "Accepted password" /var/log/secure |
查看成功登录记录 |
七、预防措施
- 密码管理 — 使用 12 位以上强密码,定期更换,禁止默认密码
- SSH 加固 — 禁用密码登录 + 密钥认证 + 禁止 root 远程登录 + 修改端口
- 防火墙 — 仅开放必要端口,配置出站规则,限制 SSH 来源 IP
- 监控告警 — CPU 使用率告警(阈值 >80%)、异常进程检测、网络流量异常告警
- 定期审计 — 检查定时任务、系统服务、SSH 密钥、系统补丁
关联页面
| 页面 | 关联点 |
|---|---|
| linux-intrusion-detection-guide | Linux 入侵检测与应急响应 |
| server-security-hardening-checklist | 服务器安全加固清单 |
| ssh-brute-force-protection-guide | SSH 暴力破解防御指南 |
| cpu-spike-troubleshooting-guide | CPU 飙高排查方法论 |
| linux-hacked-server-emergency-response | Linux 服务器入侵应急响应完整清单与实战指南。覆盖从发现被黑到恢复全流程:断网隔离、取证快照、后 |
| cpu-100-full-chain-diagnosis | CPU 100% 全链路故障排查 |