服务器被黑了怎么办:网络安全应急响应实战 checklist
凌晨两点,服务器 CPU 跑满了
前阵子有台公网服务器,监控在凌晨两点把人叫醒:CPU 直接打满,SSH 登录还偶尔卡顿。我 SSH 上去先敲了一行:
top -b -n1 | head -15
排在最上面的不是业务进程,而是一个叫 kworkerds 的东西,CPU 占用 390%。再顺手看一眼它连哪:
ss -antup | grep ESTABLISHED
一条连到境外 185.x.x.x:3333 的连接赫然在列——3333 是矿池经典端口。到这基本能拍板了:这是一台被植入挖矿木马的机器。
但你真要在这种慌乱的时刻,凭记忆把「账号、进程、网络、启动项、计划任务」一条条查全吗?大多数人的答案是否定的。我后来把这类处置整理成了 应急响应工具箱,选好系统和场景,五阶段的命令直接列在你面前,复制就能用。这篇就把背后的思路讲清楚。
应急响应不是「凭记忆敲命令」
应急最忌讳两件事:一是乱敲命令把证据破坏了,二是只杀进程不清理持久化,过十分钟又活了。
所以别把它当成「我会几个命令就行」。真正有用的,是一套按阶段走、不漏项的清单。工具箱里每个场景都按这五个阶段组织,你照着点就能保证不遗漏:
- 识别与确认——到底发生了什么,影响范围多大;
- 遏制隔离——先把火关掉,别让它继续扩散;
- 根除清理——把后门、自启、计划任务全拔掉;
- 恢复加固——补漏洞、改口令、收权限;
- 溯源取证——保留证据,搞清楚入口在哪。
先记住一条铁律:先取证,后清理
我见过太多人一上来就 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:勒索病毒付比特币能拿回文件吗? 绝大多数情况拿不回,还助长犯罪。正确做法是断网保全、找解密器、从干净备份恢复。
相关工具
- 应急响应工具箱:按系统 + 场景 + 阶段生成处置命令清单,支持一键复制与报告导出
- Linux 常用命令:应急时查命令语法的速查字典
- Windows 常用命令:Windows 侧命令速查
- 安全常见端口:识别可疑监听端口对应的服务与风险
- Iptables 命令生成器:生成封 IP / 阻断端口的防火墙规则
- Tcpdump 命令生成器:断网前抓包取证的命令拼装
应急处置永远在「授权范围内」进行——这篇文章和工具箱都只是参考清单,真实现场请结合你系统的实际情况。