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, 安全实验室, 安全防御评估, 流量重放, 版权保护, 请求拦截, 越狱测试, 逆向工具