D
开发工具箱

服务器被黑了怎么办:网络安全应急响应实战 checklist

安全工具 2026年9月21日 约 5 分钟阅读

凌晨两点,服务器 CPU 跑满了

前阵子有台公网服务器,监控在凌晨两点把人叫醒:CPU 直接打满,SSH 登录还偶尔卡顿。我 SSH 上去先敲了一行:

top -b -n1 | head -15

排在最上面的不是业务进程,而是一个叫 kworkerds 的东西,CPU 占用 390%。再顺手看一眼它连哪:

ss -antup | grep ESTABLISHED

一条连到境外 185.x.x.x:3333 的连接赫然在列——3333 是矿池经典端口。到这基本能拍板了:这是一台被植入挖矿木马的机器。

但你真要在这种慌乱的时刻,凭记忆把「账号、进程、网络、启动项、计划任务」一条条查全吗?大多数人的答案是否定的。我后来把这类处置整理成了 应急响应工具箱,选好系统和场景,五阶段的命令直接列在你面前,复制就能用。这篇就把背后的思路讲清楚。

应急响应不是「凭记忆敲命令」

应急最忌讳两件事:一是乱敲命令把证据破坏了,二是只杀进程不清理持久化,过十分钟又活了。

所以别把它当成「我会几个命令就行」。真正有用的,是一套按阶段走、不漏项的清单。工具箱里每个场景都按这五个阶段组织,你照着点就能保证不遗漏:

  1. 识别与确认——到底发生了什么,影响范围多大;
  2. 遏制隔离——先把火关掉,别让它继续扩散;
  3. 根除清理——把后门、自启、计划任务全拔掉;
  4. 恢复加固——补漏洞、改口令、收权限;
  5. 溯源取证——保留证据,搞清楚入口在哪。

先记住一条铁律:先取证,后清理

我见过太多人一上来就 rm -f 删文件、kill -9 杀进程,结果事后想查「它从哪进来的、偷了什么」时,现场早没了。

正确顺序是:遏制阶段之前,优先把能留的证据留下来。比如断网前先抓个包:

tcpdump -i any -w /evidence/cap.pcap

怀疑某个文件是样本,先拷出来再删,而不是原地删除:

cp -a /tmp/suspect /evidence/ && rm -f /tmp/suspect

后面「溯源取证」阶段给的命令,本质上都是为了让你事后能复盘——很多单位出了事要写报告,没证据连报告都编不出来。

把处置拆成五个阶段

识别与确认

这一步的目标是「看清敌人」。Linux 上我习惯先看权限、登录、进程、网络四件事:

whoami; id                                   # 当前权限
w; last -a                                   # 谁登录过、从哪来
ps auxf --sort=-%cpu | head -20              # 按 CPU 排序看进程树
ss -antup                                    # 监听端口与外连
awk -F: '$3==0 {print $1}' /etc/passwd       # 揪出所有 UID=0 的账号

Windows 对应的是 whoami /all、tasklist /svc、netstat -ano | findstr ESTABLISHED、query user。关键不是命令本身,而是这些维度一个都不能少——只查进程漏了后门账号,或者只查账号漏了外连,都会让你误判。

遏制隔离

确认有问题后,第一优先级是「止血」。最干净的做法是断网或封 IP:

iptables -A INPUT -s 185.x.x.x -j DROP       # 封来源
ifdown eth0                                  # 直接断网卡(会断 SSH,慎用)

Windows 上用防火墙规则拦出站、或 Disable-NetAdapter 断网卡。封 IP 比杀进程稳,因为进程杀了,它若还在自启,马上又回连。

根除清理

这一步专门对付「杀不死」——后门往往藏在三处:自启服务、计划任务、开机脚本。

systemctl list-unit-files --type=service --state=enabled   # 伪装的系统服务
crontab -l; ls -la /etc/cron.* /var/spool/cron             # 计划任务
cat /etc/rc.local; ls -la /etc/init.d                      # 开机脚本

Windows 则看 Get-CimInstance Win32_StartupCommand、schtasks /query、HKLM:\...\Run 注册表项。只杀进程不查这三处,等于没干。**

恢复加固

清理完别急着复产,先把入口堵上:改掉所有相关口令、打系统补丁、收紧 SSH(PermitRootLogin no)、启用防火墙。Linux 上一句就能关掉 root 直登:

sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config

溯源取证

最后留底。文件系统快照、关键二进制哈希、近期改动文件时间线,都是写报告的依据:

find / -newermt '2026-09-01' -ls 2>/dev/null | head -50   # 时间线
md5sum /bin/* > /evidence/bin-hashes.txt                  # 二进制哈希

六个最常见的「翻车现场」怎么处置

下面每个场景我只列最关键的两三条命令,完整清单(含 Windows 版)都在 应急响应工具箱 里按阶段展开。

1. 主机被入侵 / 系统沦陷

除了上面「识别」那几条,记得查临时目录和 rootkit:

ls -lat /tmp /var/tmp /dev/shm
chkrootkit; rkhunter --check

2. 挖矿木马(CPU 异常)

直接搜矿池特征,比肉眼看进程快:

ps aux | grep -iE 'miner|xmrig|stratum|pool' | grep -v grep
ss -antup | grep -E ':(3333|8080)'

3. 勒索病毒

第一反应是别重装、别付款、先断网:

ifconfig eth0 down          # 立刻断网隔离
cp -a /evidence/ransom-note.txt /evidence/   # 备份勒索信(含钱包地址,用于家族识别)

然后去 nomoreransom.org 拿对应家族的解密器,别自己瞎试把数据覆盖坏。

4. WebShell / 网页后门

网站目录下找近期改动、扫危险函数:

find /var/www -type f -name '*.php' -newermt '-7 days'
grep -rniE "eval\(|base64_decode|assert\(" /var/www --include="*.php"

找到后先移出 web 目录隔离,别直接删:

mv /var/www/html/shell.php /quarantine/ && chmod 000 /quarantine/shell.php

5. 异常外连 / 数据泄露

从连接反查进程,再按 PID 定目标:

ss -antup | grep ESTABLISHED
lsof -i -P -n | grep -i estab
ps -p <PID> -o pid,cmd

6. 容器内入侵(Docker / K8s)

从宿主机视角看,别一头扎进容器:

docker stats --no-stream        # 谁在吃资源
docker exec <容器> ps aux        # 容器里跑了啥
kubectl get pods -A; kubectl top pods -A

几个新手最容易踩的坑(FAQ)

Q:我直接 rm 删了后门文件,为什么第二天又出现了? 因为持久化没清——它写在 crontab、systemd 服务或 rc.local 里,每隔几分钟重新拉起。删文件前先查这三处,否则永远杀不死。

Q:能不能先 kill -9 再说? 能,但不该是第一步。先留证据(抓包、拷样本),再杀。而且单独 kill 挡不住自启,必须配合封 IP / 断网。

Q:Windows 服务器没有 top、ss 怎么办? 对应物是 PowerShell:Get-Process | Sort CPU -Descending、Get-NetTCPConnection -State Established、Get-CimInstance Win32_StartupCommand。工具箱里每个场景都给了 Windows 版命令。

Q:断网卡 ifdown eth0 后我 SSH 也断了,怎么办? 所以这是最后一招。优先用 iptables 只封恶意 IP 或只拦出站,保留你的运维通道。云服务器断网了还能用带外/VNC 救。

Q:勒索病毒付比特币能拿回文件吗? 绝大多数情况拿不回,还助长犯罪。正确做法是断网保全、找解密器、从干净备份恢复。

相关工具

应急处置永远在「授权范围内」进行——这篇文章和工具箱都只是参考清单,真实现场请结合你系统的实际情况。