主题
🚨 应急响应
前面的内容都在讲"怎么防",但万一没防住呢?入侵应急响应就是在这个最坏的时刻,用最短的时间把损失降到最低。
应急响应六步法
发现 → 隔离 → 取证 → 清除 → 恢复 → 复盘
│ │ │ │ │ │
│ │ 断网 │ 保存 │ 删后门│ 重装 │ 写报告
│ │ 阻断 │ 现场 │ 修漏洞│ 还数据│ 改流程第一反应
确认被入侵后,不要关机!不要重启! 攻击者在内存中的进程、当前网络连接等易失性证据会在重启后消失。
Step 1:发现 — 怎么知道自己被入侵了
常见的发现渠道:
| 发现方式 | 典型信号 |
|---|---|
| 用户反馈 | 网站被篡改、跳转、无法访问 |
| 监控告警 | CPU 100%、异常外发流量、磁盘爆满 |
| IDS/IPS | rkhunter、AIDE 发现核心文件被修改 |
| 安全通告 | CVE 漏洞预警,你刚好中招 |
| 第三方通知 | 你的 IP 在发送垃圾邮件 / 参与 DDoS |
| 自己发现 | 看到陌生进程、异常登录记录 |
Step 2:隔离 — 控制损失范围
在不确定攻击范围时,先隔离再分析:
bash
# === 方案 A:保留网络用于远程取证 ===
# 只允许自己的 IP 访问
sudo iptables -I INPUT -s <你的办公IP> -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
# 保持 OUTPUT 畅通以便下载工具
# 封禁明显的恶意 IP
sudo iptables -A INPUT -s <攻击者IP> -j DROP
# === 方案 B:物理断网(最干净) ===
sudo ip link set eth0 down
# 然后通过带外管理(如云厂商的 VNC 控制台)操作
# === 方案 C:暂停受影响的服务 ===
sudo systemctl stop nginx
sudo systemctl stop apache2
sudo systemctl stop mysql提示
如果使用云服务器,在控制台启用"安全组"把入站规则收到最严,是一件比 iptables 更彻底的事——网络层直接被云平台拦截。
Step 3:取证 — 保留犯罪现场
证据按"易失性"排序,从高到低依次收集:
内存取证(最易失,最先做)
bash
# 内存 dump(需要安装 LiME 或 avml)
# 方法一:avml(轻量级)
wget https://github.com/microsoft/avml/releases/latest/download/avml
chmod +x avml
sudo ./avml /tmp/memory_$(date +%Y%m%d_%H%M%S).lime
# 方法二:LiME(内核模块方式)
sudo apt install linux-headers-$(uname -r) build-essential
git clone https://github.com/504ensicsLabs/LiME.git
cd LiME/src && make
sudo insmod lime-$(uname -r).ko "path=/tmp/memory.lime format=lime"
# 用 volatility 分析内存镜像
volatility -f memory.lime imageinfo # 识别系统信息
volatility -f memory.lime --profile=Linux pslist # 进程列表
volatility -f memory.lime --profile=Linux netscan # 网络连接
volatility -f memory.lime --profile=Linux bash_history # bash 历史磁盘证据
bash
# 创建磁盘镜像(如果可以挂载只读)
sudo dd if=/dev/sda of=/mnt/backup/disk_image_$(date +%Y%m%d).img bs=4M status=progress
# 记录关键文件的时间戳基线
stat /etc/passwd /etc/shadow /etc/sudoers /etc/ssh/sshd_config \
/etc/crontab /etc/rc.local > /tmp/file_stats_$(date +%Y%m%d_%H%M%S).txt
# 用 find 记录所有文件的时间戳(用于后续对比)
find / -printf '%TY-%Tm-%Td %TH:%TM %p\n' 2>/dev/null > /tmp/file_timeline.txt系统状态快照
bash
#!/bin/bash
# evidence-collect.sh — 一键取证脚本
OUTDIR="/root/evidence_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTDIR"
# 系统信息
uname -a > "$OUTDIR/sysinfo.txt"
uptime >> "$OUTDIR/sysinfo.txt"
date >> "$OUTDIR/sysinfo.txt"
# 进程
ps auxf > "$OUTDIR/processes.txt"
lsof > "$OUTDIR/lsof.txt"
# 网络
ss -tunap > "$OUTDIR/network_connections.txt"
iptables-save > "$OUTDIR/iptables.txt"
ip route show > "$OUTDIR/routes.txt"
# 用户
cat /etc/passwd > "$OUTDIR/passwd"
cat /etc/shadow > "$OUTDIR/shadow"
w > "$OUTDIR/who.txt"
last -n 200 > "$OUTDIR/last.txt"
# 登录
cp /var/log/auth.log "$OUTDIR/auth.log" 2>/dev/null
cp /var/log/secure "$OUTDIR/secure" 2>/dev/null
# 计划任务
for user in $(cut -d: -f1 /etc/passwd); do
crontab -u "$user" -l > "$OUTDIR/cron_$user.txt" 2>/dev/null
done
ls -laR /etc/cron* > "$OUTDIR/cron_files.txt"
# 文件哈希
sha256sum /etc/passwd /etc/shadow /etc/sudoers /etc/ssh/sshd_config > "$OUTDIR/hashes.txt"
echo "证据已收集到: $OUTDIR"Step 4:清除 — 根除后门
拿到证据后,开始清理:
后门排查清单
bash
# 1. 检查启动项
systemctl list-units --state=running | grep -vE '(ssh|nginx|cron|rsyslog|ufw|systemd)'
ls -la /etc/systemd/system/*.service /etc/systemd/system/*.timer 2>/dev/null
# 2. 检查所有 crontab
for f in /etc/crontab /etc/cron.*/* /var/spool/cron/*; do
echo "=== $f ==="
cat "$f" 2>/dev/null
done
# 3. 检查 rc.local 和其他启动脚本
cat /etc/rc.local 2>/dev/null
cat /etc/init.d/* 2>/dev/null | grep -E "wget|curl|nc |bash -i|/dev/tcp"
# 4. 查找可疑 SUID 文件(对比已知干净系统的基线)
find / -perm -4000 -type f 2>/dev/null > /tmp/suid_now.txt
# 与基线对比: diff /tmp/suid_baseline.txt /tmp/suid_now.txt
# 5. 查找隐藏进程(PID 在 /proc 中存在但 ps 看不到)
for pid in /proc/[0-9]*; do
p=$(basename $pid)
if ! ps -p $p > /dev/null 2>&1; then
echo "⚠ 隐藏进程: PID=$p"
fi
done
# 6. 检查 .ssh/authorized_keys
cat /root/.ssh/authorized_keys 2>/dev/null
find /home -name authorized_keys -exec cat {} \; 2>/dev/null
# 7. 检查 LD_PRELOAD / /etc/ld.so.preload
cat /etc/ld.so.preload 2>/dev/null
env | grep LD_PRELOAD
# 8. 查找最近新增的可执行文件
find / -type f -executable -newer /etc/passwd 2>/dev/null | grep -v '^/proc'清理步骤
bash
# 1. 删除恶意 crontab 条目
crontab -e -u <受感染用户> # 手动删除可疑条目
> /var/spool/cron/crontabs/<用户> # 或清空重建
# 2. 删除恶意用户
sudo userdel -r <恶意用户名>
# 3. 删除恶意 SSH 公钥
> /root/.ssh/authorized_keys
> /home/<用户>/.ssh/authorized_keys
# 4. 终止恶意进程(记录 PID 后再杀)
sudo kill -9 <恶意进程PID>
# 5. 删除恶意文件(注意不要删系统文件)
sudo rm -f /tmp/.malware /dev/shm/.hidden /var/tmp/.backdoor
# 6. 重置被替换的系统工具(如果 ps/netstat/ls 被替换)
apt-get install --reinstall procps net-tools coreutilsStep 5:恢复 — 系统重建
最佳实践
被入侵的服务器 不要只清后门就继续用。你不知道攻击者还留了什么没发现的。从头重装系统是最安全的做法。
bash
# 恢复流程(如果选择重建)
# 1. 备份业务数据(代码、数据库、配置文件)
mysqldump --all-databases > /backup/all_db_$(date +%Y%m%d).sql
tar czf /backup/web_data.tar.gz /var/www/
tar czf /backup/etc_config.tar.gz /etc/nginx/ /etc/mysql/
# ⚠ 不要备份二进制文件(可能是后门)
# 只备份明确需要的文本数据和配置
# 2. 重装系统(云厂商重装/重做系统镜像)
# 3. 从干净来源重新部署
# 安装系统 → 打补丁 → 配置安全加固 → 部署应用 → 恢复数据
# 4. 修改所有凭据
# root 密码、数据库密码、SSH 密钥、API Key
# 通知所有用户修改密码(如果用户数据也在此服务器)Step 6:复盘 — 别犯同样的错
复盘模板(写进文档):
markdown
## 应急响应报告
- **事件时间**:2026-07-26 03:15 ~ 2026-07-26 10:00
- **发现方式**:监控告警 CPU 100%
- **影响范围**:Web 服务器被植入挖矿程序,数据库未受影响
- **入侵途径**:Web 应用未修复的 CVE-2024-XXXX RCE 漏洞
- **攻击者行为**:上传 webshell → 提权 → 下载挖矿程序 → 添加 crontab 保活
- **处置措施**:
1. 03:20 隔离服务器(iptables 限流)
2. 03:30 收集内存/磁盘证据
3. 04:00 清除挖矿进程和后门
4. 05:00 修复 Web 应用漏洞
5. 06:00 重装系统、恢复业务
- **改进措施**:
1. 建立漏洞扫描 + 自动更新机制
2. 应用层加 WAF
3. 非 root 用户运行 Web 进程
4. 每季度进行一次安全演练实战:应急响应速查卡
打印出来贴墙上或存成 PDF:
╔═══════════════════════════════════════════════════════╗
║ 🚨 应急响应速查卡 🚨 ║
╠═══════════════════════════════════════════════════════╣
║ □ 不关机不重启 ║
║ □ 截图/复制终端输出做初步记录 ║
║ □ iptables 限制只允许自己 IP ║
║ □ dd 做磁盘镜像 / avml 做内存 dump ║
║ □ 记录: date / uptime / who / ps / ss / crontab ║
║ □ 检查: /etc/passwd / .ssh/ /tmp/ /etc/cron* ║
║ □ 检查: systemctl / rc.local / LD_PRELOAD ║
║ □ 下载证据到安全位置(scp/云盘) ║
║ □ 修改所有密码/密钥 ║
║ □ 重装系统(仅恢复数据和配置,不恢复二进制) ║
║ □ 写复盘报告 ║
╚═══════════════════════════════════════════════════════╝🧪 练习题
- 写一个取证脚本,自动收集进程、网络、用户、crontab 信息到一个目录
- 在本地虚拟机中模拟"入侵":添加恶意 crontab、创建 SUID 后门,然后做一次完整的应急排查
- 根据你的业务场景,写一份应急响应预案(谁通知谁、谁操作、回滚步骤)
恭喜!你已经完成了网络安全模块所有文章的学习。从防火墙到应急响应,这 11 篇文章构成了一个完整的防御体系。安全的本质不是一次性的配置,而是一种持续的习惯——定期审计、持续监控、及时更新。
🎯 本章要点
- 重启后内存中的进程、网络连接等易失证据会消失。
- 六步法:发现→隔离→取证→清除→恢复→复盘。
加载练习题中...