Skip to content

🚨 应急响应 ​

前面的内容都在讲"怎么防",但万一没防住呢?入侵应急响应就是在这个最坏的时刻,用最短的时间把损失降到最低。

应急响应六步法 ​

发现 → 隔离 → 取证 → 清除 → 恢复 → 复盘
  │      │      │      │      │      │
  │      │ 断网  │  保存  │ 删后门│ 重装  │ 写报告
  │      │ 阻断  │  现场  │ 修漏洞│ 还数据│ 改流程

第一反应

确认被入侵后,不要关机!不要重启! 攻击者在内存中的进程、当前网络连接等易失性证据会在重启后消失。

Step 1:发现 — 怎么知道自己被入侵了 ​

常见的发现渠道:

发现方式典型信号
用户反馈网站被篡改、跳转、无法访问
监控告警CPU 100%、异常外发流量、磁盘爆满
IDS/IPSrkhunter、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 coreutils

Step 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/云盘)                     ║
║ □ 修改所有密码/密钥                                  ║
║ □ 重装系统(仅恢复数据和配置,不恢复二进制)         ║
║ □ 写复盘报告                                         ║
╚═══════════════════════════════════════════════════════╝

🧪 练习题 ​

  1. 写一个取证脚本,自动收集进程、网络、用户、crontab 信息到一个目录
  2. 在本地虚拟机中模拟"入侵":添加恶意 crontab、创建 SUID 后门,然后做一次完整的应急排查
  3. 根据你的业务场景,写一份应急响应预案(谁通知谁、谁操作、回滚步骤)

恭喜!你已经完成了网络安全模块所有文章的学习。从防火墙到应急响应,这 11 篇文章构成了一个完整的防御体系。安全的本质不是一次性的配置,而是一种持续的习惯——定期审计、持续监控、及时更新。


🎯 本章要点 ​

  • 重启后内存中的进程、网络连接等易失证据会消失。
  • 六步法:发现→隔离→取证→清除→恢复→复盘。
加载练习题中...