服务器疑似被入侵时,正确的第一动作不是关机重装,而是「先隔离、保现场,再按进程 → 网络 → 持久化 → 账号四步定位」。 关机或直接重装会抹掉内存里的连接信息、进程树和临时落脚点,等于把取证线索烧了;而只删掉那个显眼的挖矿进程、不清持久化,攻击者下次重启就复活。四步走下来,你能定位到「怎么进来的、装了什么后门、从哪几个点再次启动」,再统一清理与轮换密钥。下面这套流程是我处理过几台被 SSH 爆破后植入矿机的机器时总结的,命令都可直接复制执行。
上面这段就是全文的结论块,可以直接拿走。下面是四步排查、清理轮换和预防。

先保现场还是先断网?
结论:先隔离网络(保留现场),再取证排查——不要关机,也不要直接重装。
| 动作 | 该不该做 | 原因 |
|---|---|---|
立即 shutdown / 重装 |
不要 | 内存中的连接、进程、临时文件全丢 |
| 拔网线 / 云控制台断网 | 可以 | 切断 C2 通信,保留磁盘与内存现场 |
只 kill 掉挖矿进程 |
不完整 | 持久化没清,重启复活 |
| 改密码、清后门、轮换密钥 | 必做 | 被入侵后要假设所有凭据已泄露 |
如果机器还在运行,可以只封出站、留入站给你自己连(iptables/安全组只放行你的 IP 的 22 端口),这样既切断了它和 C2 的联系,你又能登录排查。
四步定位速览

第一步:看进程,找异常负载

# 按 CPU 排序,看谁在吃资源
$ ps aux --sort=-%cpu | head -15
# 看进程树,找被顶替的父进程
$ ps -ef --forest | head -40
# 直接翻 /proc 里那些「看不到路径」的进程
$ for p in /proc/[0-9]*; do
exe=$(readlink "$p/exe" 2>/dev/null)
[ -z "$exe" ] && echo "$p -> (exe 已删除或不可读) $(cat $p/comm 2>/dev/null)"
done
挖矿木马的特征很鲜明:进程名模仿系统进程(kworker、[kthreadd],但混着小写或奇怪后缀)、CPU 长时间 100%、可执行文件路径显示 (deleted)(跑起来后把本体删掉躲检测)。/proc 那一圈是重点——readlink exe 返回空或 deleted,基本可以定性。
第二步:看网络,找外连矿池或 C2

$ ss -tunp # TCP+UDP,带进程
$ lsof -i -P -n | grep ESTABLISHED
$ curl -s https://ipinfo.io/1.2.3.4 # 把可疑外连 IP 查一下归属
重点看「ESTABLISHED 的外连,连向陌生公网 IP 的常见矿池端口(3333/4444/5555/7777/14444 等)」。正常的 VPS 不会主动长时间外连陌生地址。把可疑 IP 记下来,去威胁情报平台查一下是否为已知矿池——这是最直接的定性证据。
第三步:查持久化,找「重启后复活」的点

这一步最容易被漏,也最关键。 逐处检查:
# 1) 定时任务(攻击者最爱的落脚点)
$ crontab -l; sudo crontab -l
$ ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ 2>/dev/null
$ cat /etc/crontab
$ grep -r "curl\|wget\|base64" /etc/cron* 2>/dev/null # 拉取式后门
# 2) systemd 服务(比 cron 隐蔽)
$ systemctl list-units --type=service --state=running
$ ls -la /etc/systemd/system/ /lib/systemd/system/ | grep -v '^total'
# 3) SSH 后门:塞进 authorized_keys
$ cat ~/.ssh/authorized_keys; sudo cat /root/.ssh/authorized_keys
$ ls -la /root/.ssh/
# 4) 预加载劫持(rootkit 常用,能隐藏进程和文件)
$ cat /etc/ld.so.preload
# 5) 启动项与 rc.local
$ cat /etc/rc.local 2>/dev/null
$ ls -la /etc/profile.d/
/etc/ld.so.preload 是最阴的一条:里面挂一个恶意 .so,就能把 ps、ls 看到的进程和文件藏起来——你 ps 看不到的东西,它未必不存在。看到这个文件非空,就要高度警觉。
第四步:查账号与登录痕迹

# 有没有被偷偷加的 UID 0 账号
$ awk -F: '$3==0 {print $1}' /etc/passwd # 期望只有 root
$ awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd # 陌生普通账号
# 登录历史:谁从哪登过
$ last -n 30
$ sudo lastb -n 30 # 失败登录(爆破痕迹)
# 最近被改动的文件(缩小时间窗口)
$ sudo find / -mtime -2 -type f -not -path '/proc/*' -not -path '/sys/*' 2>/dev/null | head -40
# 攻击者留下的命令历史
$ cat ~/.bash_history; sudo cat /root/.bash_history
awk -F: '$3==0 {print $1}' /etc/passwd 只应该输出 root——多出任何账号,就是被加了后门账号。
清理与轮换(排查完才做)
# 1) 删除恶意进程、文件、cron、systemd 单元、authorized_keys 多余条目
# 2) 清空 /etc/ld.so.preload(若非空)
$ sudo sh -c '> /etc/ld.so.preload'
# 3) 用扫描工具复核一遍
$ sudo apt install -y rkhunter
$ sudo rkhunter --update && sudo rkhunter --check --sk
# 4) 假设全部凭据已泄露:轮换 SSH 密钥、API token、数据库密码
四个真会踩的坑
- 一发现就关机重装。 这是最贵的错误——现场没了,你永远不知道它是从哪个口子进来的,重装后同样的问题会再犯一次。正确做法是隔离网络、保留现场。
- 只删恶意文件,不查持久化。 挖矿木马通常有
cron+systemd+authorized_keys三重保险,删一处,另外两处把进程拉起来。必须把第三步列的点全查干净。 - 忽略
ld.so.preload与进程隐藏。 有些 rootkit 会让ps/ls撒谎。除了看/proc,可以用静态编译的排查工具,或把可疑磁盘挂到另一台干净机器上离线分析——这比在被污染的机器上较劲靠谱。 - 入侵处理后不轮换密钥。 只要攻击者拿到过一次 root,就要默认所有密钥、token、数据库密码都泄露了:SSH 私钥重生成、云 API key 重置、
.env里的密码全换。只清文件不换凭据,等于留了一把复制出去的钥匙。
服务器入侵排查常见问题(2026)
Q:怎么判断是不是真的被入侵,而不是误报?
A:看三条硬信号——异常进程(路径含 (deleted)、伪装的系统进程名)、陌生公网外连(矿池端口 / 已知 C2 IP)、被新增的 UID 0 账号或 authorized_keys 条目。三条命中任意一条基本可定性;只凭「CPU 高」不够,也可能是你自己的服务在跑批。
Q:被入侵后最省事的做法是重装系统吗?
A:重装是结论,不是第一动作。 如果无法彻底确认清了所有后门,重装+从干净备份恢复确实是终局方案;但在重装前,先尽量定位入口(多半是弱密码 SSH 或未打补丁的服务),否则新系统同样会被打进来。
Q:怎么防止再次被入侵?
A:把入口堵死。绝大多数 VPS 入侵都是「22 端口弱密码被爆破」——按 SSH 加固五步关掉密码登录、上 fail2ban、限制来源 IP;再给机器配 探针监控,把 CPU 突增和异常流量设成告警,从「出事几周后才发现」变成「几分钟内就知道」。
Q:有没有一键排查工具?
A:rkhunter、chkrootkit、lynis 都能做自动化初筛,但它们基于已知特征、会漏新型后门,只能当辅助。真正的定位还是要靠上面四步人工核对——工具给的是线索,不是判决。
Q:排查时要不要保留日志?
A:要。/var/log/auth.log、~/.bash_history、进程列表、网络连接快照(ss -tunp > /tmp/net.txt)都先留存,再动手清理。清理是不可逆的,证据留存是可逆的——先存后删。
一句总结
入侵应急的核心顺序是「隔离 → 定位 → 清理 → 轮换 → 加固」,顺序错了就会毁掉现场或留下后门。四步定位(进程/网络/持久化/账号)覆盖了绝大多数挖矿与后门场景,而真正的教训往往只有一句:绝大多数 VPS 被入侵,都始于一个开着密码登录的 22 端口——事前加固十分钟,胜过事后排查一整天。