BenjaminWilhelm1/Threat-Hunting-Lab---Elastic-SIEM

GitHub: BenjaminWilhelm1/Threat-Hunting-Lab---Elastic-SIEM

基于 Elastic Stack 的自包含威胁狩猎实验室,用预生成的 ECS 标准日志数据集替代真实基础设施,让分析师在三个递增难度场景中练习 SIEM 威胁狩猎技能。

Stars: 0 | Forks: 0

# Elastic SIEM 威胁狩猎实验室 一个基于 Elastic Stack 构建、自包含且可重复的威胁狩猎实验室。它提供了 **预先生成的、符合 ECS 标准的日志数据集**,涵盖三个场景(Easy / Medium / Hard) 你可以将它们直接加载到 Elasticsearch 中,并在 Kibana 的 **Discover** 中进行狩猎 —— 无需 受害者 VM、无需 Sysmon agent、无需真实的恶意软件。 ## 这是什么(以及不是什么) 最初的项目计划要求运行一批 VM,并通过 Elastic Agent 发起真实的攻击。 此构建版本将这一切替换为**静态日志文件**,这些文件重现了分析师将会看到的相同遥测数据。你可以在无需基础设施的情况下获得狩猎体验: | 而不是… | 你得到的是… | | --- | --- | | Windows/Linux VM + Sysmon + Elastic Agent | 单个 Docker stack(Elasticsearch + Kibana) | | 运行 Atomic Red Team / 真实恶意软件 | 以 NDJSON 形式编写的攻击链事件 | | 等待遥测数据摄入 | 几秒钟内即可完成批量索引的加载器 | | 重建以重新运行 | `Reset-Scenario.ps1` + `Load-Scenario.ps1` | 这些都是真实的 ECS 文档 —— Sysmon(进程、网络、DNS、进程访问、注册表、文件)、 Windows 安全登录、**Active Directory DC** 日志(Kerberos 4768/4769 + NTLM 4776)、PowerShell scriptblock、Windows Defender 以及 **Zeek `conn` 网络流量**传感器 —— 因此你在这里练习的 KQL/ES|QL 与你在生产环境 `winlogbeat` / Elastic Defend / 网络监控数据中使用的 KQL/ES|QL 是相同的。 ## 快速开始 **前提条件:** Docker Desktop 正在运行,为 stack 预留约 4 GB 空闲 RAM,PowerShell。 ``` # 从项目根目录 .\scripts\Setup-Lab.ps1 ``` 该命令将: 1. 通过 Docker Compose 启动 Elasticsearch + Kibana, 2. 等待两者变得健康, 3. 批量加载所有三个场景数据集(将时间戳重置为“当前时间”), 4. 创建 `siemlab-*` Kibana data view。 然后打开 ****,选择 **`siemlab-*`** data view,将 时间选择器设置为 **Last 24 hours**,并开始狩猎。 ### 展示(RDP / 演示) 作为一个单独的演示者运行此项目 —— 例如,通过 RDP 连接到主机并为你的团队进行演示?请使用 这个单命令准备脚本: ``` .\scripts\Start-Showcase.ps1 ``` 它会在 Docker Desktop 关闭时启动它,启动 stack,**重新加载所有 12 个场景以使时间戳保持最新**, 并打开 Kibana。在每次会话之前运行它。这一点很重要,因为加载器会在*加载时*将每个事件的 时间戳重置为“当前时间”——因此,如果不重新加载,大约一天后数据就会掉出默认的 **Last 24 hours** 窗口。 Flags:`-NoBrowser`, `-Set1Only`。 ### 为团队提供托管(URL + 登录) 希望你的团队通过共享 URL 访问并登录?**不要暴露此 stack** —— 它在设计上没有身份验证。 请使用经过加固的、面向互联网的变体:一个位于支持自动 HTTPS 的反向代理之后、 启用了安全性的 stack,并带有只读分析师登录。完整的分步指南(包括一个完全免费的 托管选项)位于 **[docs/HOSTING.md](docs/HOSTING.md)** 中: ``` # 在 Linux VM 上,按照 docs/HOSTING.md 操作之后: docker compose -f docker/docker-compose.prod.yml --env-file docker/.env.prod up -d ELASTIC_PASSWORD=... python3 deploy/load_all.py # cross-platform loader, no PowerShell needed ``` 更倾向于**在你自己的机器上**运行它(无需 VM,无需开放端口)并通过 **Cloudflare Tunnel** 暴露它?请参阅 [docs/HOSTING-CLOUDFLARE.md](docs/HOSTING-CLOUDFLARE.md) —— 同样是启用了身份验证的 stack, 使用 `cloudflared` connector 代替反向代理,并由 Cloudflare Access 进行控制。最适合计划内的 培训课程(主机必须保持唤醒状态)。 ## 三个场景 | # | 难度 | 名称 | 主题 | MITRE 亮点 | | --- | --- | --- | --- | --- | | 1 | Easy | 可疑的 PowerShell 活动 | 从恶意 Office 文档进行的编码 PowerShell 下载 | T1059.001, T1027, T1105 | | 2 | Medium | 凭据获取与横向移动 | LSASS 转储 → 通过 SMB/RDP 绕道至文件服务器 | T1003.001, T1021.002, T1021.001, T1569.002 | | 3 | Hard | 多阶段入侵 | 初始访问 → 发现 → 持久化 → 横向移动 → 数据处理 → 数据外发 | T1059, T1087, T1003, T1053.005, T1547.001, T1560, T1041, T1071 | 每个场景都包含一份指南、狩猎问题、答案、示例查询、报告模板 以及一个 100 分的评分标准。请从 [docs/scenarios/scenario-1-easy.md](docs/scenarios/scenario-1-easy.md) 开始。 **将其作为练习运行(为你自己或他人)?** 下发 **[docs/scenario-briefings.md](docs/scenario-briefings.md)** 中的 叙事性 SOC 任务简报 —— 这些是难度不断升级的剧情驱动任务,并附带用于团队组织的引导员笔记。 ## 仓库布局 ``` SIEM Lab/ ├─ README.md ← you are here ├─ docker/ │ ├─ docker-compose.yml ← Elasticsearch + Kibana (security disabled, localhost only) │ └─ .env ← stack version + ports ├─ data/ ← the pre-generated datasets (ready to ingest) │ ├─ scenario1-powershell/scenario1.ndjson │ ├─ scenario2-lateral/scenario2.ndjson │ └─ scenario3-intrusion/scenario3.ndjson ├─ scripts/ │ ├─ Setup-Lab.ps1 ← one-command setup (compose + load + data views) │ ├─ Load-Scenario.ps1 ← bulk-load + timestamp re-stamping │ ├─ Reset-Scenario.ps1 ← delete indices to reset │ ├─ Setup-DataViews.ps1 ← create Kibana data views │ ├─ EcsEvents.psm1 ← shared ECS event builders │ └─ generators/ ← regenerate the datasets (Generate-Scenario1..3.ps1) └─ docs/ ├─ 00-environment.md ← the fictional org: hosts, identities, subnets, adversary infra ├─ 01-setup-guide.md ├─ 02-architecture.md ├─ 03-data-sources.md ├─ 04-threat-hunting-methodology.md ├─ scenario-briefings.md ← narrative SOC mission briefings (shareable handout) ├─ scenarios/ ← scenario-1-easy.md, -2-medium.md, -3-hard.md ├─ queries/ ← KQL + ES|QL per scenario ├─ detection-rules/ ← detection rule definitions ├─ report-templates/ ← analyst report templates ├─ hunt-worksheet.md ├─ answer-key.md ← ⚠ spoilers ├─ mitre-attack-mapping.md ├─ scoring-rubric.md └─ reset-instructions.md ``` ## 在不使用脚本的情况下摄入数据 如果你更愿意将 NDJSON 直接放入你自己的 Elasticsearch 中,每一行都是一个完整的 ECS 文档。将 `data//.ndjson` 批量加载到你选择的索引中。请注意, 编写的原始时间戳位于 **2025 年 5 月**,因此你要么扩大 Discover 的时间范围以包含它们, 要么使用 `Load-Scenario.ps1`,它会自动将它们移至当前时间。有关 手动 `_bulk` 方案,请参阅 [docs/01-setup-guide.md](docs/01-setup-guide.md)。 ## 安全性 “恶意”内容是无害的文本:base64 字符串、文档范围内的伪造 C2 IP 以及 命令行。此仓库中没有任何可执行的 payload。Docker stack 在 禁用安全性的情况下运行,并且仅绑定到 `127.0.0.1` —— **不要将其暴露在网络中**。
标签:AI合规, Docker, Elastic Stack, Libemu, 安全实验室, 安全防御评估, 流量重放, 版权保护, 请求拦截, 越狱测试, 逆向工具