jirosgyros/soc-ctf-scanned-document-468

GitHub: jirosgyros/soc-ctf-scanned-document-468

一个基于合成入侵遥测数据的 SOC 分析师实操训练挑战,支持将数据导入 Splunk 或 Elasticsearch 后回答 26 道递进式事件调查问题。

Stars: 0 | Forks: 0

# SOC Analyst CTF — "扫描文档 468" 一款专为初级和在职 SOC 分析师设计的、在您的 SIEM 中进行调查的实操挑战。您将获得一家虚构公司 **Meridian Group** 遭受的真实场景入侵原始遥测数据,并需要回答一系列问题。将数据加载到您自己的 **Splunk** 或 **Elasticsearch/Kibana** 中,深入挖掘证据,并按顺序解答问题——每个阶段都建立在上一个阶段的发现之上。 ## 场景背景 中型企业 Meridian Group 遭到了入侵。一封邮件被打开后,情况便急转直下——从端点立足点、攻击者的 hands-on-keyboard 操作、渗透到服务器,最终导致了严重的破坏事件。您的任务是根据日志还原事件全貌。 该环境非常贴近现实:除了真实的入侵活动外,还混杂着**看起来类似的合法、良性活动**——如 IT 支持工具、常规漏洞扫描、授权的备份作业以及普通的商务出差。每个问题问的都是**攻击者**的活动,因此请仔细阅读并排除干扰项。 ## 本资源包内容 ``` scanned-document-468/ ├── README.md ← you are here ├── questions.md ← the 26 questions (work them in order) ├── data-dictionary.md ← the 7 sourcetypes and what each carries — read this first ├── data/ │ ├── events.ndjson ← telemetry (one JSON event per line) — for the HEC loader │ ├── events-single-upload.json ← ALL events in one file → routes to 7 sourcetypes on upload (no HEC) │ └── by-sourcetype/ ← the same events split per sourcetype (alternate no-HEC upload) │ ├── erebus_sysmon.json │ ├── erebus_windows_security.json │ └── … (one file per sourcetype) ├── splunk/ │ ├── indexes.conf ← the target index definition │ ├── props.conf ← field-extraction + line-break/timestamp config (required) │ ├── transforms.conf ← sourcetype router (only for the single-file upload) │ └── load_splunk.py ← loads the data into Splunk via HEC └── elastic/ └── load_elastic.py ← loads the data into Elasticsearch via _bulk ``` ## 导入 Splunk **无论您选择以下哪种方法,数据最终都会被存入单一的 `iceid` 索引中,并分布在 7 个 sourcetype 里**——不管选哪种,最终状态完全一致。首先需要进行一次性设置: 1. **创建索引。** 将 `splunk/indexes.conf` 复制到 `$SPLUNK_HOME/etc/system/local/` (或运行 `splunk add index iceid`)。 2. **添加解析配置。** 将 `splunk/props.conf` 中的配置段复制到您的 `$SPLUNK_HOME/etc/system/local/props.conf` 中。如果选择单文件上传(方案 B),还需要将 `splunk/transforms.conf` 复制到 `$SPLUNK_HOME/etc/system/local/transforms.conf`。**然后重启 Splunk。** *(此步骤为必选项——如果没有这些配置,字段将无法正确提取;对于文件上传,事件也无法正确换行、获取正确的时间戳,或被路由到正确的 sourcetype。)* 3. 在搜索时,请将时间选择器设为 **All time**(基础日期为 2025-07-01)。`index=iceid` 应该会显示 **分布在 7 个 sourcetype 中的约 73 个事件**;您可以通过 `index=iceid | stats count by sourcetype` 来确认分布情况。 ### 方案 A — HTTP Event Collector (HEC) 如果您能开放 HEC 端口(8088),这是最快的方法。 1. 启用 HEC token(Settings → Data inputs → HTTP Event Collector);确保 `iceid` 包含在该 token 的允许索引列表中。 2. 导入:`python splunk/load_splunk.py --url http://localhost:8088 --token <您的_HEC_TOKEN>` ### 方案 B — 无需 HEC,单文件导入(最接近 HEC 推送的效果) 无需开放端口——您只需交给 Splunk **一个文件**,它就会自动将其分发到 `iceid` 内的全部 7 个 sourcetype 中, 这与 HEC 推送的效果完全相同。`data/events-single-upload.json` 中的每个事件都包含一个 `st` 字段来指明其 sourcetype;`transforms.conf` 路由器会在索引时重写 Splunk 的 sourcetype。 **GUI 操作:** Settings → *Add Data* → **Upload** → 选择 `data/events-single-upload.json` → 在 *Set Source Type* 中选择/输入 **`erebus:upload`** → *Next* → 设置 **Index = `iceid`** → *Review* → *Submit*。 **CLI 操作:** ``` splunk add oneshot data/events-single-upload.json -index iceid -sourcetype erebus:upload ``` 大功告成——一次拖拽,一个索引,7 个 sourcetype。 ### 方案 C — 无需 HEC,按 sourcetype 分割文件(无需路由器) 不想安装 `transforms.conf`?直接上传预切分好的文件即可——Splunk 会为每个文件分配一个 sourcetype,因此数据包也贴心地在 `data/by-sourcetype/` 目录下提供了切分好的版本(每个 sourcetype 对应一个文件)。同样导入单一的 `iceid` 索引,只是每个 sourcetype 需要上传一次。 ``` # sourcetype = "erebus:" + 文件的 base name splunk add oneshot data/by-sourcetype/erebus_sysmon.json -index iceid -sourcetype erebus:sysmon splunk add oneshot data/by-sourcetype/erebus_windows_security.json -index iceid -sourcetype erebus:windows_security splunk add oneshot data/by-sourcetype/erebus_proxy_access.json -index iceid -sourcetype erebus:proxy_access splunk add oneshot data/by-sourcetype/erebus_zeek_dns.json -index iceid -sourcetype erebus:zeek_dns splunk add oneshot data/by-sourcetype/erebus_zeek_conn.json -index iceid -sourcetype erebus:zeek_conn splunk add oneshot data/by-sourcetype/erebus_panos.json -index iceid -sourcetype erebus:panos splunk add oneshot data/by-sourcetype/erebus_proofpoint_tap.json -index iceid -sourcetype erebus:proofpoint_tap ``` (等效 GUI 操作:使用 Add Data → Upload 向导,针对每个文件操作一次,并设置相匹配的 source type。) ## 导入 Elasticsearch / Kibana ``` python elastic/load_elastic.py --url http://localhost:9200 --index iceid # (如果启用了 security,则添加 --user / --password) ``` 然后在 `iceid` 索引上创建一个 Kibana Data View,并选择一个宽泛的时间范围进行搜索。每个文档都包含一个 `sourcetype` 字段(例如 `erebus:sysmon`),您可以根据问题的描述精确过滤;此外还包含 `@timestamp` 字段。 ## 开始挑战 1. 阅读 `data-dictionary.md`,了解哪种类型的证据存储在哪个 sourcetype 中。 2. 按顺序解答 `questions.md`(Stage 0 → Stage 4)。大多数问题只有一个正确答案; 少数“列举一个”的问题可以接受小范围集合中的任意有效成员。 3. **在社区 Discord 中作答。** 运行 **`/play`** 开始挑战:它会每次展示一个问题,并记住您的进度。使用 `/answer <您的答案>` 作答,`/skip` 跳过当前题目,如果遇到困难可以使用 `/hint <问题编号>` 获取提示(提示会从轻微点拨逐渐加强,直至接近最终答案,但这会扣除少量积分)。喜欢跳跃式答题?`/submit <问题编号> <答案>` 可以直接回答任意问题。 您可以随时输入 `/score` 和 `/leaderboard` 查看积分。最终的压轴题(Q26)将由导师人工评判。 除了 `/leaderboard` 外,每个命令都只对您进行私密回复,因此您可以在公共频道中尽情游玩,而不会对其他人造成任何剧透。 祝您狩猎愉快。 🔎 *合成训练数据。如与任何真实的公司、用户或基础设施存在相似之处,纯属巧合。专为防御性安全教育而开发。*
标签:Elasticsearch, 代码示例, 安全运营, 扫描框架, 数据分析, 网络安全靶场, 越狱测试, 逆向工具