DFIR 调查 + 7 条针对模拟 NexaCorp 入侵的 Suricata 规则(vsftpd 2.3.4 CVE-2011-2523 + MITRE Caldera C2)。为期 4 天的单人任务(BeCode Brussels Mission 01)。54 页报告、10 项发现、7/7 条规则均通过 PCAP 重放验证。
针对 NexaCorp 基础设施模拟入侵的 DFIR 调查与检测工程。作为为期 4 天的单人项目(BeCode Brussels 蓝队与红队训练营,任务 01)开展。交付物为一份 54 页的调查结果报告(PDF)以及 7 条经过验证的 Suricata 规则,可在 PCAP 重放中捕获该入侵事件。
本仓库记录了作为 BeCode 网络安全训练营(2025-2026 届)一部分执行的 SOC 分析师项目。它从网络和日志证据重建了一次完整的入侵,并交付一组经过验证的 Suricata 检测规则。这是 NexaCorp DFIR 系列中的第一起事件。
这是针对虚构基础设施的实验室项目。 NexaCorp 是一个虚构客户,用作 BeCode Brussels 任务 01 的场景。被入侵主机是一台 Metasploitable 2 虚拟机,专为安全培训而故意存在漏洞;Caldera Sandcat 植入体是实验室的一部分,用于让分析师了解真实入侵者的信标流量是什么样。未攻击任何真实组织、网络或人员。
本报告中发布的所有 IP 地址、主机名和入侵指标(172.16.50.10、192.168.10.10、10.40.0.200、blue11、mesdec 等)均为仅限实验室的工件,而非真实世界威胁情报。请勿将其作为 IOC 输入 SIEM。
发布已获授权:BeCode 实验室教练(Thomas B.)于 2026-05-17 批准。完整的保密声明见调查结果报告("分发与分类"部分)。
| 项目元数据 | 值 |
|---|---|
| 参考编号 | BCC-2026 / INC-2026-001 |
| 时长 | 4 天(单人) |
| 阶段 | DFIR(取证)+ 检测工程 |
场景(虚构)。 NexaCorp 是一家中型企业客户,在其内部监控标记到一台内部 Linux 服务器出现异常出站流量后,联系了 BeCode Corp 的蓝队。他们的防火墙记录了该流量,但未触发任何可操作的告警。董事会在决定披露和监管通报之前,需要先做出判断。
任务。 调查可疑的事件窗口,刻画攻击者的入侵路径和利用后活动,评估现有检测栈捕获到了什么(以及遗漏了什么),并交付一份按优先级排序的修复计划。第二阶段增加了检测工程:交付可直接部署的网络 IDS 规则,以便在再次发生时实时捕获。
从客户处接收的证据包。
教学背景。 本次项目在 BeCode Brussels 蓝队与红队训练营(2025 年 11 月至 2026 年 9 月) 期间作为任务 01 交付:一项单人、限时的调查,模拟真实的 DFIR 咨询项目。实验室基础设施、NexaCorp 身份和 IOC 值均为刻意虚构。方法论、工具和报告格式遵循真实世界标准(NIST SP 800-61r2、SANS PICERL、MITRE ATT&CK)。
📄 完整的 54 页调查结果报告是规范交付物。 下载 PDF(215 KB)或浏览 Markdown 源文件以进行 grep/引用。
2026-05-09 22:53 UTC 当晚,一名外部攻击者(172.16.50.10)通过利用 CVE-2011-2523(vsftpd 2.3.4 中存在的后门,该版本自 2011 年 7 月起就已被公开记录为受损)入侵了 NexaCorp 的一台内部服务器(192.168.10.10)。一个以 :) 结尾的 FTP USER 请求触发了 TCP/6200 上的未认证 root 绑定 shell。攻击者在 20 秒的会话中运行了 8 条侦察命令(无持久化、无数据外泄、未通过此访问向量进行横向移动),然后断开连接。
与此同时,发现同一主机上运行着一个预先存在的 MITRE Caldera "Sandcat" 代理,位于 /opt/caldera/sandcat(root,守护进程化),在整个捕获窗口内每 40-50 秒以明文 HTTP 向 10.40.0.200:8888 发送信标。这正是客户最初标记的"异常出站连接",表明存在证据包中未体现的先前入侵(植入体在第一个 PCAP 帧中就已活跃)。
现有的 Wazuh SIEM 从目标主机收集了 397 条事件,但仅产生了 4 条高危告警(占总数的 1.0%),全部归类为通用暴力破解(MITRE T1110)。没有任何一条识别出 CVE-2011-2523 漏洞利用载荷、TCP/6200 上的绑定 shell 或 Caldera C2 信道:漏洞利用字节(USER baduser:))本身不会被 vsftpd 记录,而 SIEM 没有网络遥测来看不到其余部分。第二阶段交付的 7 条 Suricata 规则填补了全部三个缺口。
重点 IOC(仅限实验室,请勿输入真实 SIEM):
所捕获的事件包含两条不同的线索,由 PCAP 重建:
vsftpd 2.3.4,一个带有公开记录后门(CVE-2011-2523)的版本,可在内部网络上访问(调查结果 I1)。:) 结尾的 FTP USER 请求触发了后门(调查结果 I3)。10.40.0.200:8888 发送信标,表明存在证据包中未体现的先前入侵(调查结果 I5)。本仓库的组织方式让您可以根据自身角色选择合适深度来阅读:
规范交付物: reports/ 中的 PDF。Markdown 源文件内容相同,保留在仓库中以供搜索和版本控制。
调查轨迹: notes/journal.md 是分析师的日常工作笔记本(已测试和推翻的假设、证据清单、计划状态)。它补充了正式报告,展示结论是如何得出的,而不仅仅是结论本身。
检测规则集: detection/lab.rules 包含 7 条 Suricata 规则,并在内联注释中提供了每个关键字的完整论证。detection/README.md 记录了用于确认每条规则在捕获事件上触发的部署与重放验证工作流。
本项工作遵循三个行业标准框架,分层叠加。
NIST 的 4 阶段模型(准备、检测与分析、遏制/根除/恢复、事件后活动)提供了高层结构。在本项目中,交付物的阶段 1 对应 NIST 的"检测与分析"(PCAP 取证、SIEM 关联、攻击者时间线重建)。阶段 2 对应 NIST 的"经验教训",转化为预防性控制措施(7 条 Suricata 规则和报告第 7 节中的按优先级排序的建议清单)。
PICERL(准备、识别、遏制、根除、恢复、经验教训)是 SANS 事件响应流程。在本项目中的应用:
| PICERL 阶段 | 本项目 |
|---|---|
| 准备 | 经教练验证的实验室环境、签字确认的证据包、明确的范围(取证 + 检测工程)、4 天时限 |
| 识别 |
每项调查结果都映射到一个或多个 MITRE ATT&CK 技术,以便客户将该事件与现有威胁模型关联。10 项调查结果中引用了 14 种不同的技术:
每项调查结果的完整技术表见报告第 4 节(IOC),每项调查结果的深入分析见第 3 节和第 5 节。
报告中的每项声明都可追溯到证据包中的工件,并附有重现所需的精确 tshark 过滤器、Wazuh 查询或 Suricata 重放命令。参见报告中的附录 A(可复现命令)以及下方的可复现性 部分以快速上手。
网络取证
tshark:用于 PCAP 分类、TCP 流重建(-z follow,tcp,ascii)、协议过滤和字段提取的 CLI Wiresharktcpreplay 和 tcprewrite:将 PCAP 重放到实时监控接口上以进行 Suricata 规则验证,并调整 MTU 以适应实验室 ens19(1450 字节)网络 IDS / 检测工程
afpacket 模式,单线程,实验室中禁用 Hyperscan):编写、验证并调优了本交付物中的 7 条规则suricata -T:部署和调优期间的配置与规则验证kill -USR2 $(pgrep suricata):迭代调优期间的热加载规则SIEM 和主机遥测
rule.id 11452、5551 等)、导出 397 条事件的 CSVgrep、awk、jq):日志挖掘和 JSON 解析对抗模拟上下文(引用,未实际操作)
参考框架
10 项调查结果(I1 至 I10)在调查结果报告中有详细记录。每项条目都包含证据、可复现命令、MITRE ATT&CK 映射和修复建议。
严重性分布: 3 严重 / 3 高危 / 2 中危 / 2 低危
建议阅读顺序: 从 I1(存在漏洞的服务)开始,然后是 I3、I4(实际利用链),再是 I5(并行且无关的 C2 植入体)。I2 和 I6 提供侦察上下文。I7 至 I10 是防御态势调查结果(监控看到了什么 vs. 遗漏了什么)。
项目阶段 2 产出了 7 条 Suricata 规则(SID 9000001 至 9000007),从三个角度覆盖所捕获的事件:漏洞利用特征、利用后 shell 以及并行的 C2 信道。每条规则都通过在 SOC 工作站上的 Suricata 6.0.4 实例上离线 PCAP 重放进行验证。
40 对 314 的差异反映了对规则 9000003、9000004、9000005、9000006 的刻意限速,以便为 SOC 分析师提供干净的可操作视图,同时将原始告警流保留在 eve.json 中供取证深挖。
部署过程中的四次迭代修复记录在 detection/README.md 中。关键经验:1. 与端口无关的 HTTP 检测。 规则 9000004 和 9000005(Caldera)最初以 alert http 和 http.uri 关键字编写,这些关键字只在 80 端口上启用 Suricata 的 HTTP 解析器。Caldera C2 运行在 8888 端口,因此解析器被绕过,规则从未触发。修复:改写为 TCP+content 模式(alert tcp ... content:"POST /beacon"; content:"Go-http-client/1.1";),该模式匹配原始 HTTP 字节,不受端口影响。
2. flow:established 在 PCAP 重放期间不可靠。 重放窗口之外捕获的 TCP 握手会使流状态机处于不确定状态。从 Caldera 规则中移除 flow:established 后,这些规则在实时模式和重放模式下都能匹配。
3. 为 SYN-only 规则显式指定流向。 规则 9000003(端口 6200)触发了 SC_WARN_POOR_RULE: SYN-only ... w/o direction specified。已通过添加 flow:to_server,not_established 修复。
4. HOME_NET 与 EXTERNAL_NET 在纯 RFC1918 实验室中的问题。 当攻击者、目标和 C2 都位于私有地址空间时,EXTERNAL_NET = !$HOME_NET 将变为空,形式为 的规则永远不会匹配。实验室修复:两者都使用 。生产环境修复:将 收窄为仅受保护网段。
每条规则的误报分析记录在报告第 8.5 节中。在边界清晰的环境中,大多数规则的风险可忽略不计;如果存在良性的内部 Python 服务或管理脚本,规则 9000005(aiohttp 服务器标头)和 9000006(管理路径上的 curl/Wget)则需要调优。
NexaCorp-DFIR-INC-2026-001/ ├── README.md (this file) ├── LICENSE (MIT) ├── .gitignore ├── .github/ │ └── workflows/ │ └── ci.yml markdownlint + typography + Suricata rule check ├── reports/ │ ├── INC-2026-001_Findings_Report.pdf canonical 54-page deliverable │ └── INC-2026-001_Findings_Report.md same content, Markdown source ├── detection/ │ ├── lab.rules 7 Suricata rules (SID 9000001-9000007) │ └── README.md deploy + replay validation workflow ├── evidence-summary/ │ └── ioc-summary.md indicators of compromise (SIEM-ingestible) ├── methodology/ │ ├── attack-timeline.md incident timeline (UTC) │ └── attck-mapping.md MITRE ATT&CK mapping table └── notes/ └── journal.md analyst investigation journal (hypotheses, plan, IOCs, timeline)
**文件分类:**
| 路径 | 作用 | 受众 |
|---|---|---|
| `reports/*.pdf` | 权威交付物、正式报告 | 客户、招聘方、审计人员 |
| `reports/*.md` | 相同内容,便于 grep 的源文件 | 任何需要引用或比对的人 |
| `detection/lab.rules` | 可直接用于生产的 Suricata 规则集 | SOC / 检测工程师 |
| `detection/README.md` | 部署 + 重放验证指南 | 新入职的检测工程师 |
| `evidence-summary/ioc-summary.md` | 失陷指标(IOC),按类别整理 | SOC / 威胁狩猎 |
| `methodology/attack-timeline.md` | 事件时间线(UTC) | DFIR 从业人员 |
| `methodology/attck-mapping.md` | MITRE ATT&CK 映射表 | DFIR / 检测工程师 |
| `notes/journal.md` | 调查工作笔记本 | 研究该方法论的 DFIR 从业人员 |
| `.github/workflows/ci.yml` | push 时自动执行 markdownlint、排版检查及 Suricata 规则验证(`suricata -T`,当存在 `detection/*.rules` 时运行) | CI |
## 可重现性
调查结果报告中的每项结论都可追溯到证据包中的某个工件。PCAP 本身不会被重新分发(属于 BeCode 实验室财产),但所用命令和查询均已记录在案,任何拥有自己副本的人都能复现该分析。
### 复现关键发现(PCAP 分析)
需要 `tshark`(Wireshark 命令行工具)和原始 `attack.pcap`:```bash
# 1. PCAP overview
tshark -r attack.pcap -q -z io,stat,0
# 2. TCP conversations (reveals attacker, target, C2)
tshark -r attack.pcap -q -z conv,tcp | head -30
# 3. Confirm vsftpd 2.3.4 banner exposure (Finding I1)
tshark -r attack.pcap -Y "ftp && ip.src == 192.168.10.10" \
-T fields -e frame.time -e ftp.response.code -e ftp.response.arg | head -5
# 4. Find the CVE-2011-2523 exploit payload (Finding I3)
tshark -r attack.pcap -Y 'ftp.request.command == "USER"' \
-T fields -e frame.time -e ftp.request.arg
# 5. Reconstruct the root shell session on TCP/6200 (Finding I4)
tshark -r attack.pcap -q -z follow,tcp,ascii,70
# 6. Reconstruct the Caldera C2 beacon (Finding I5)
tshark -r attack.pcap -q -z follow,tcp,ascii,6 | head -50
需要 Suricata 6.0.x、tcpreplay 以及一个受监控的接口(实验室中为 ens19;请替换为您自己的):```bash
sudo cp detection/lab.rules /etc/suricata/rules/learner/lab.rules
sudo kill -USR2 $(pgrep -f suricata) sleep 5
sudo truncate -s 0 /var/log/suricata/fast.log
sudo tcpreplay --intf1=ens19 --topspeed attack_mtu.pcap
sudo grep -oE '[1:[0-9]+:' /var/log/suricata/fast.log | sort | uniq -c | sort -rn
I'm unable to produce a translation because the input chunk content is empty — no text was provided after "INPUT:". Please provide the actual chunk 8 content you'd like translated.```text
30 [1:9000002: (vsftpd banner repeated per session)
3 [1:9000007: (FTP USER enumeration threshold)
3 [1:9000006: (HTTP admin path enumeration)
1 [1:9000005: (Caldera C2 response)
1 [1:9000004: (Caldera Sandcat beacon, throttled)
1 [1:9000003: (Backdoor port 6200 SYN)
1 [1:9000001: (vsftpd USER smiley exploit)
7/7 规则均正确触发。 完整证据包(fast.log、eve.json、限流配置、Suricata 版本快照)已列于**调查结果报告 的附件 E**。
full_log 字段推断得出的,并非直接观测到的。auth.log 和 syslog 从 PCAP 结束后约 5 小时才开始,第一条记录为 syslogd restart(很可能是虚拟机重启)。未提供轮转日志文件。这一点已记录为调查结果 I10。USER 参数上的替代空字节终止符)、使用不同的 User-Agent 重新编译 Caldera,或将 C2 迁移到加密 HTTPS 来规避这些规则(JA3/JA4 等 TLS 元数据分析将是后备方案)。这些规则适用于所捕获的威胁场景;长期检测策略应增加基于行为和元数据的检测。HOME_NET 设置为 any。 在真实的 NexaCorp 部署中,HOME_NET 必须缩小到仅受保护的网段(例如 192.168.10.0/24),以便 EXTERNAL_NET = !$HOME_NET 正确覆盖攻击者空间。所交付的规则是针对实验室调优的,在生产使用前需要这唯一一项配置更改。于 2026-05-15 在 BeCode Brussels 蓝队与红队训练营(2025 年 11 月至 2026 年 9 月)任务 01 期间完成的单人 DFIR 任务。
作者:Johan-Emmanuel Hatchi(LinkedIn)。
开放接受自 2026 年 9 月起在比利时的网络安全实习机会。寻找 SOC / DFIR / 检测工程岗位,岗位职责涵盖此类端到端调查工作(PCAP 取证、SIEM 关联、IDS 规则编写、正式客户报告)。
MIT,2026 Johan-Emmanuel Hatchi。
detection/lab.rules 中的 Suricata 规则和报告文本均在相同的 MIT 许可证下发布:可自由复制、修改和重新部署,需注明出处。PCAP、实验室基础设施和任务简报仍归 BeCode Brussels 所有,不会重新分发。
| 交付日期 | 2026-05-15 |
| 状态 | 已完成(阶段 1 + 阶段 2) |
| 调查产出 | 值 |
|---|
| 调查结果 | 10 项(3 严重、3 高危、2 中危、2 低危) |
| 映射的 MITRE ATT&CK 技术 | 14 |
| 分析的网络捕获 | 5,194 个数据包,时长 5h31m(943 KB PCAP) |
| 关联的 Wazuh 事件 | 来自代理 020 的 397 条 |
| 编写的 Suricata 规则 | 7 条(SID 9000001-9000007) |
| 通过 PCAP 重放验证的规则 | 7/7(40 条 fast.log 告警,314 条 eve.json 记录) |
| 工件 | 覆盖范围 | 备注 |
|---|
| 网络捕获(PCAP) | 2026-05-09 20:08 至 2026-05-10 01:39 UTC(5h31m,5,194 个数据包) | 自事件中段开始:植入体在帧 1 中已在进行信标通信 |
| 主机认证日志 | 2026-05-10 06:47 UTC 起 | 仅事件后(PCAP 结束后约 5 小时空白) |
| 主机 syslog | 2026-05-10 06:37 UTC 起 | 首条记录为 syslogd restart,提示 VM 已重启 |
| SIEM 告警导出(Wazuh) | 不适用 | 文件实际是 HTTP 404 响应,并非数据。后来通过直接仪表盘查询恢复了 397 条事件 |
| 类型 | 值 | 上下文 |
|---|
| 源 IP(攻击者) | 172.16.50.10 | vsftpd 漏洞利用、多协议侦察、SSH 暴力破解 |
| 目标 IP | 192.168.10.10 | 被入侵的内部服务器(Metasploitable 2) |
| C2 IP | 10.40.0.200:8888 | Caldera Sandcat 命令与控制 |
| 后门端口 | 6200/tcp | CVE-2011-2523 root 绑定 shell |
| 漏洞利用载荷 | 以 :) 结尾的 FTP USER | 后门触发模式 |
| 如果您是... | 从这里开始 | 时间 |
|---|
| 招聘人员或招聘经理 | 本 README + 快速浏览 PDF 执行摘要 | 5 分钟 |
| 评估契合度的 SOC 分析师 | PDF 第 5 节(检测缺口)和第 8 节(检测工程) + detection/lab.rules | 20 分钟 |
| DFIR 从业人员 | 完整 PDF + notes/journal.md 以查看调查轨迹 | 60 分钟 |
| 检测工程师 | detection/lab.rules + detection/README.md 以了解部署和重放验证 | 30 分钟 |
| 任何希望 grep、引用或 diff 的人 | 报告 Markdown 源文件 | 按需 |
| PCAP 分类 + Wazuh 事件关联 + 假设驱动分析(7 条假设,1 条被推翻,5 条确认,1 条不确定) |
| 遏制 / 根除 / 恢复 | 记录为 P0 建议(主机隔离、移除 vsftpd、清理 Caldera 植入体),但未执行(超出范围:仅取证分析,非主动响应) |
| 经验教训 | 阶段 2 检测工程:7 条 Suricata 规则 + 调优说明 + 误报分析(报告第 8 节) |
| ID | 严重性 | 标题 | 主要 MITRE 技术 |
|---|
| I1 | 🔴 严重 | 内部网络上暴露了存在漏洞的 vsftpd 2.3.4 服务 | T1190 |
| I2 | 🟡 中危 | 漏洞利用前存在长时间低慢侦察阶段 | T1595.002、T1589 |
| I3 | 🟠 高危 | 通过 USER 笑脸后门触发模式利用 CVE-2011-2523 | T1190 |
| I4 | 🔴 严重 | TCP/6200 上未认证的 root 绑定 shell,执行了 8 条枚举命令 | T1059.004、T1082 |
| I5 | 🔴 严重 | 预先存在的 MITRE Caldera Sandcat C2 植入体(与 FTP 攻击无关) | T1071.001、T1102 |
| I6 | 🟢 低危 | 多协议服务枚举(HTTP、SSH、SMTP、Telnet、MySQL) | T1046 |
| I7 | 🟡 中危 | Wazuh 中可见的 SSH 暴力破解尝试,位于 PCAP 捕获窗口之外 | T1110 |
| I8 | 🟠 高危 | 异常 sudo 活动,包括 2 次首次 sudo 事件 | T1548.003 |
| I9 | 🟠 高危 | Wazuh SIEM 对此类攻击的检测覆盖率不足 | (防御缺口) |
| I10 | 🟢 低危 | 主机审计日志未覆盖事件窗口 | (证据缺口) |
| SID | 检测目标 | 层 | MITRE 技术 | 重放中触发 |
|---|
| 9000001 | vsftpd 2.3.4 后门触发:以 :) 结尾的 USER 参数 | TCP/21 载荷 | T1190 | ✅ 1/1 |
| 9000002 | 宣告 vsftpd 2.3.4 漏洞版横幅(220 (vsFTPd 2.3.4)) | TCP/21 载荷 | T1190 | ✅ 30(横幅在每个 FTP 会话中重复出现) |
| 9000003 | 到后门端口 6200 的入站 TCP 连接(仅 SYN) | TCP/6200 | T1059.004 | ✅ 1/1(绑定 shell 连接) |
| 9000004 | MITRE Caldera Sandcat 代理信标(POST /beacon + UA Go-http-client/1.1) | TCP+内容(端口无关) | T1071.001、T1102 | ✅ 1(限速为每源每 60 秒 1 条) |
| 9000005 | Caldera C2 服务器响应(HTTP Server: Python/3.10 aiohttp/3.13.4) | TCP+内容(端口无关) | T1071.001 | ✅ 1(限速为每源每 300 秒 1 条) |
| 9000006 | 来自 curl/Wget 的 HTTP 管理路径枚举(/admin、/login、/phpmyadmin) | TCP/80 载荷 | T1595.002、T1592.002 | ✅ 3 |
| 9000007 | 慢速 FTP USER 枚举(30 分钟内来自同一源 5 次以上尝试) | TCP/21 + 阈值 | T1589、T1078.003 | ✅ 3 |
| 指标 | 值 |
|---|
| 编写的规则 | 7 |
| 在 PCAP 重放中正确触发的规则 | 7/7 ✅ |
fast.log 中告警数(去重后,SOC 视图) | 40 |
eve.json 中记录数(原始,限速前) | 314 |
| Suricata 版本 | 6.0.4(afpacket,单线程) |
| 重放命令 | tcpreplay --intf1=ens19 --topspeed attack_mtu.pcap |
| CI 验证 | 每次推送时执行 markdownlint、排版检查和 suricata -T 规则检查 |
$EXTERNAL_NET any -> $HOME_NET 21anyHOME_NETfull_log,以确定哪些用户帐户触发了这些事件(以及相对于 FTP 漏洞利用的时间戳);并审查 12 次 SSH 认证成功记录,以区分合法管理员会话与攻击者控制的会话。两者均已记录在报告的"未决问题"附件中。