saadabbasi-playground/detectionvalidation
GitHub: saadabbasi-playground/detectionvalidation
一个多 SIEM 检测规则验证平台,通过模拟真实 CVE 攻击并捕获内核遥测数据,自动验证 Sigma/SPL/KQL 检测规则的有效性并映射 MITRE ATT&CK 覆盖情况。
Stars: 0 | Forks: 0
# detection-validator
在单台搭载 Apple Silicon 的 MacBook 上,针对 Linux 受害者模拟真实的基于 CVE 的攻击,捕获真正的内核级审计事件,并测试你的检测规则是否真正触发。
```
Vagrant VM (Ubuntu 22.04 ARM64) Mac host
┌─────────────────────────┐ ┌──────────────────────────────────────┐
│ auditd │ │ Docker │
│ victim-agent │──────▶ │ OpenSearch (localhost:9200) │
│ vector (shipper) │ HEC │ Splunk mock (localhost:8000/8088) │
└─────────────────────────┘ └──────────────────────────────────────┘
▲ │
│ dv attack │ dv validate
└─ simulate CVE exploit steps └─ query for rule hits
```
## 最快上手 —— 一条命令
### macOS(需要 Docker Desktop、Vagrant、vagrant-qemu、Python 3.12)
```
git clone https://github.com/saadabbasi-playground/detectionvalidation.git detection-validator
cd detection-validator
uv venv && uv pip install -e ".[dev]"
source .venv/bin/activate
export OPENSEARCH_INITIAL_ADMIN_PASSWORD="DetectVal123!"
dv demo
```
`dv demo` 会启动 Docker stack,引导 VM,运行金丝雀检查,触发 Log4Shell 漏洞利用,等待遥测数据,并验证 9 条 Sigma 规则 —— 一步到位。预期结果:**7 PASS / 2 FAIL**(此场景中故意排除了 LSASS 和 Nmap)。
### Windows(需要 Docker Desktop + WSL2、Git Bash、Python 3.12、uv)
```
# PowerShell
git clone https://github.com/saadabbasi-playground/detectionvalidation.git detection-validator
cd detection-validator
uv venv; uv pip install -e ".[dev]"
.\.venv\Scripts\Activate.ps1
$env:PYTHONUTF8 = "1"; $env:PYTHONIOENCODING = "utf-8"; chcp 65001 | Out-Null
$env:OPENSEARCH_INITIAL_ADMIN_PASSWORD = "DetectVal123!"
```
```
# Git Bash — 启动 Docker stack
docker network create detectval-lab 2>/dev/null || true
OPENSEARCH_INITIAL_ADMIN_PASSWORD="DetectVal123!" bash ./dv up lab --siem opensearch --profile standard
```
```
# PowerShell — 运行攻击 + 验证(在容器健康后)
dv attack --cve CVE-2021-44228 --target docker --mode simulate
dv validate examples/detections/sigma/ --since 1
```
预期结果:**5 PASS / 3 FAIL**(LSASS、MSHTA 和 Nmap 需要 Windows 目标或主动的 Nmap 扫描)。完整详情请参阅 [docs/windows-quickstart.md](docs/windows-quickstart.md)。
## 什么是 `dv`?
有两个独立的工具,都叫 `dv`:
| 工具 | 文件 | 功能 |
|---|---|---|
| `./dv` | 项目根目录下的 Shell 脚本 | 启动/停止 Docker 容器(`./dv up`、`./dv down`) |
| `dv` | 安装到 `.venv/` 的 Python CLI | 运行攻击,验证规则,生成报告 |
## 前置条件
在运行任何内容之前,你需要先安装这些。
### macOS
| 工具 | 要求版本 | 安装命令 |
|---|---|---|
| Docker Desktop | ≥ 24 | [docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop/) |
| Python | 3.12 | `brew install python@3.12` |
| uv(Python 包管理器) | 任意 | `brew install uv` |
| Vagrant | 任意 | `brew install vagrant` |
| vagrant-qemu 插件 | 任意 | `vagrant plugin install vagrant-qemu` |
### Windows
| 工具 | 要求版本 | 安装命令 |
|---|---|---|
| Docker Desktop | ≥ 24(WSL2 后端) | [docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop/) |
| Git + Git Bash | 任意 | [git-scm.com](https://git-scm.com/downloads) |
| Python | 3.12 | `winget install Python.Python.3.12` |
| uv(Python 包管理器) | 任意 | `winget install astral-sh.uv` |
| Vagrant | 可选 | `winget install HashiCorp.Vagrant`(需要 Hyper-V) |
完整的 Windows 设置演练请参阅 [docs/windows-quickstart.md](docs/windows-quickstart.md)。
## 安装说明
### macOS / Linux
按顺序运行以下命令一次:
```
# 1. 克隆仓库
git clone https://github.com/saadabbasi-playground/detectionvalidation.git detection-validator
cd detection-validator
# 2. 创建 Python 虚拟环境并安装该工具
uv venv
uv pip install -e ".[dev]"
# 3. 激活虚拟环境
source .venv/bin/activate
# 4. 确认 CLI 可用
dv --help
```
### Windows
```
# 1. 克隆仓库
git clone https://github.com/saadabbasi-playground/detectionvalidation.git detection-validator
cd detection-validator
# 2. 创建 Python 虚拟环境并安装该工具
uv venv
uv pip install -e ".[dev]"
# 3. 激活虚拟环境
.\.venv\Scripts\Activate.ps1
# 4. 启用 UTF-8(必需 — dv 在输出中使用 Unicode 符号)
$env:PYTHONUTF8 = "1"
$env:PYTHONIOENCODING = "utf-8"
chcp 65001 | Out-Null
# 5. 确认 CLI 可用
dv --help
```
完整的 Windows 演练(包括 Docker stack 设置和已知问题)请参阅 [docs/windows-quickstart.md](docs/windows-quickstart.md)。
## 第 1 步 —— 检查你的环境
在开始任何操作之前,运行预检查:
```
dv doctor
```
这将检查 Python、Docker、Vagrant、Docker 网络、正在运行的容器、受害者代理和本地情报缓存。在继续之前修复任何 ✗ 错误。⚠ 警告不会造成阻塞。
一切安装并运行后的预期输出:
```
dv doctor — environment pre-flight check
✓ Python 3.12.5
✓ uv 0.11.13
✓ Docker 28.3.2
✓ Docker daemon running
✓ Docker network detectval-lab
✓ Vagrant 2.4.9
✓ Vagrant plugin vagrant-qemu
✓ Vagrant VM running
✓ OPENSEARCH_INITIAL_ADMIN_PASSWORD set
✓ OpenSearch reachable (HTTP 200)
✓ Splunk mock reachable (HTTP 200)
✓ Victim agent reachable on port 9098 (Vagrant)
✓ ATT&CK KB: 858 techniques
✓ KEV cache: 1243 entries
All checks passed.
```
`dv doctor --fix` 会自动下载空的情报缓存(ATT&CK 知识库、CVE 数据)。
## 第 2 步 —— 启动 Docker stack
Docker stack 运行 OpenSearch(即 SIEM)、一个 Splunk mock 接收器、Vector(日志转发器)和一个 Linux 受害者容器。
### macOS
```
# 永久保存 OpenSearch 管理员密码(运行一次)
echo 'export OPENSEARCH_INITIAL_ADMIN_PASSWORD="DetectVal123!"' >> ~/.zshrc
source ~/.zshrc
# 启动实验环境 stack
./dv up lab --siem opensearch --profile standard
```
### Windows (Git Bash)
```
# 创建 Docker network(一次性设置)
docker network create detectval-lab
# 启动实验环境 stack
OPENSEARCH_INITIAL_ADMIN_PASSWORD="DetectVal123!" bash ./dv up lab --siem opensearch --profile standard
```
等待大约 60 秒让容器变得健康,然后检查:
```
docker ps --format "table {{.Names}}\t{{.Status}}"
```
预期输出(`standard` 配置,无 dashboards):
```
NAMES STATUS
dv-linux-victim Up 2 minutes (healthy)
dv-vector Up 2 minutes (healthy)
dv-opensearch Up 2 minutes (healthy)
dv-redis Up 2 minutes (healthy)
```
每个容器都应显示 `(healthy)`。如果显示 `(starting)`,请再等待 30 秒并重新检查。
验证 OpenSearch 正在接受连接:
```
dv siem status
```
预期:
```
✓ OpenSearch 2.14.0 at https://localhost:9200
dv-telemetry-*: 0 documents
```
## 第 3 步 —— 启动 Vagrant VM
Vagrant VM 运行带有 `auditd` 的真实 Ubuntu 22.04 内核。这为你提供了真正的 syscall 级别遥测 —— 检测规则真正需要针对其触发的那种遥测。Mac 上的 Docker 容器无法公开内核审计子系统,这就是需要 VM 的原因。
```
cd vagrant
vagrant up
```
首次运行大约需要 5 分钟来下载 box 文件并配置 VM。随后的运行大约需要 ~30 秒。你会看到大量输出 —— 这是正常的。
完成后,验证 VM 内的服务是否正在运行:
```
vagrant ssh -c "systemctl status victim-agent vector --no-pager"
```
两者都应显示 `active (running)`。
验证从你的 Mac 可以连接到该代理:
```
curl http://localhost:9098/health
```
预期:
```
{"status": "ok", "host": "dv-victim", "mode": "vm"}
```
现在返回项目根目录:
```
cd ..
```
## 第 4 步 —— 运行攻击
有两种模式可用。使用 `--mode exploit`(向易受攻击的服务发送真实的 HTTP payload)以获得最真实的遥测数据,或者省略它以进行轻量级模拟。
### 模式:exploit(推荐 —— 真实内核事件,仅限 macOS/Linux)
向 VM 上运行的故意保留漏洞的服务发送实际的 HTTP 漏洞利用 payload。该服务触发真实的 `curl`、`id` 和 `/etc/passwd` 读取 —— 被 auditd 捕获为真正的内核 syscall 事件。
```
dv attack --cve CVE-2021-44228 --target vagrant --mode exploit
dv attack --cve CVE-2021-26855 --target vagrant --mode exploit
```
Log4Shell 的预期输出:
```
⚔ Running attack scenario cve=CVE-2021-44228 target=vagrant
Mode: exploit — sending real HTTP payloads to http://localhost:9088
Log4Shell JNDI injection via X-Api-Version header
✓ T1190 + T1059.004 status=exploited
uid=33(www-data) gid=33(www-data) groups=33(www-data)
✓ 1 exploit(s) delivered.
```
在攻击之前验证易受攻击的服务是否可达:
```
curl http://localhost:9088/health
# 预期结果:{"status": "vulnerable"}
```
### 模式:simulate(轻量级 —— 合成事件)
将手工制作的审计记录直接发布给受害者代理。不执行真正的漏洞利用。当你只需要快速获取遥测数据而不关心真实性时非常有用。
macOS(Vagrant 目标):
```
dv attack --cve CVE-2021-44228 --target vagrant --agent-port 9098 --watch
dv attack --cve CVE-2021-34527 --target vagrant --agent-port 9098 --watch
dv attack --cve CVE-2021-26855 --target vagrant --agent-port 9098 --watch
```
Windows(Docker 目标):
```
dv attack --cve CVE-2021-44228 --target docker --mode simulate
dv attack --cve CVE-2021-34527 --target docker --mode simulate
dv attack --cve CVE-2021-26855 --target docker --mode simulate
```
### 可用的 CVE 场景
| CVE | 漏洞 | ATT&CK 技术 |
|---|---|---|
| `CVE-2021-44228` | Log4Shell RCE | T1190, T1059.004 |
| `CVE-2021-34527` | PrintNightmare | T1068, T1547.012, T1574.001 |
| `CVE-2021-26855` | ProxyLogon SSRF | T1190, T1505.003, T1078, T1552.001 |
## 第 5 步 —— 验证你的检测
```
dv validate examples/detections/sigma/ --since 1
```
这会加载该目录中的每个 Sigma 规则,为每个规则构建查询,在 OpenSearch 上运行它,并报告 PASS 或 FAIL:
```
Rule Techniques Hits SIEM Status
LSASS Memory Dump via TM T1003.001 0 opensearch ✗ FAIL
Log4Shell JNDI Injection T1190, T1059.004 156 opensearch ✓ PASS
Log4Shell RCE - Outbound Conn T1190, T1059.004 1 opensearch ✓ PASS
MSHTA Spawning Windows Shell T1218.005, T1059.001 94 opensearch ✓ PASS
Nmap Port Scan Detected T1046 0 opensearch ✗ FAIL
PrintNightmare Spooler Abuse T1068, T1547.012 14 opensearch ✓ PASS
ProxyLogon Exchange SSRF T1190, T1505.003 62 opensearch ✓ PASS
ProxyLogon - Sensitive File T1190, T1552.001 32 opensearch ✓ PASS
Results: 8 rule(s) 6 PASS 2 FAIL 0 ERROR 0 SKIP
```
### 规则如何通过
验证器使用三层策略:
1. **Sigma 字段级转换** —— 将 `detection:` 块转换为 OpenSearch 查询并运行它。最精确。
2. **技术 ID 匹配** —— 将 `technique` 字段与规则标签中的 ATT&CK ID 进行匹配。
3. **关键字匹配** —— 跨 `proctitle`、`cmd_output` 和 `message` 进行自由文本搜索。
### 时间窗口
`--since 1` 表示“查看过去 1 小时”。如果你运行攻击的时间超过了 1 小时,请增大时间窗口:
```
dv validate examples/detections/sigma/ --since 24 # last 24 hours
dv validate examples/detections/sigma/ --since 48 # last 48 hours
```
## 第 6 步 —— 生成报告
### CLI 摘要
```
dv validate examples/detections/sigma/ --since 24 --format json | dv report
```
输出:
```
╭─────── Validation Summary ────────╮
│ Rules: 7 │
│ Pass: 4 (57%) │
│ Fail: 3 │
│ Error: 0 │
│ Skip: 0 │
│ │
│ Techniques: 8 covered / 12 total │
│ Generated: 2026-05-26 04:26 UTC │
╰───────────────────────────────────╯
Failing rules
Rule Techniques SIEM Status
LSASS Memory Dump T1003.001 opensearch ✗ FAIL
MSHTA Spawning T1218.005,T1059 opensearch ✗ FAIL
Nmap Port Scan T1046 opensearch ✗ FAIL
ATT&CK Tactic Coverage
Tactic Coverage Techniques covered
Credential Access 0/1 (0%) —
Defense Evasion 1/2 (50%) T1078
Execution 1/2 (50%) T1059.004
Impact 1/1 (100%) T1499
Initial Access 1/1 (100%) T1190
Persistence 2/2 (100%) T1505.003, T1547.012
Privilege Escalation 2/2 (100%) T1068, T1574.001
Passing rules (4): Log4Shell JNDI Injection, PrintNightmare, ProxyLogon, Test
```
### HTML 报告
```
dv validate examples/detections/sigma/ --since 24 --format json | dv report --format html -o report.html
open report.html
```
### SARIF(用于 GitHub Code Scanning)
```
dv validate examples/detections/sigma/ --since 24 --format json | dv report --format sarif -o scan.sarif
```
将 `scan.sarif` 上传到 GitHub Code Scanning,未通过的规则将作为注解显示在 pull request 上。
### 先保存结果,稍后再生成报告
```
# 将结果保存到文件
dv validate examples/detections/sigma/ --since 24 --format json -o results.json
# 稍后渲染已保存的结果
dv report --results results.json
dv report --results results.json --format html -o report.html
```
## 第 7 步 —— 离线匹配(无需 SIEM)
`dv match` 针对本地 JSONL 文件评估规则,而不是查询实时 SIEM。在 CI 中或 Docker stack 未运行时使用此功能。
### 从 Vagrant VM 导出事件
```
vagrant ssh -c "sudo cat /var/log/audit/audit-events.jsonl" > events.jsonl
```
### 从 OpenSearch 导出事件
```
curl -sk -u "admin:${OPENSEARCH_INITIAL_ADMIN_PASSWORD}" \
"https://localhost:9200/dv-telemetry-*/_search?size=1000" \
-H 'Content-Type: application/json' \
-d '{"query":{"term":{"source.keyword":"auditd-agent"}}}' \
| python3 -c "
import json, sys
for h in json.load(sys.stdin)['hits']['hits']:
print(json.dumps(h['_source']))
" > events.jsonl
```
### 运行匹配
```
dv match --events events.jsonl examples/detections/sigma/ --since 0 --format json | dv report
```
`--since 0` 表示“使用文件中的所有事件,不考虑时间戳”。请注意评估时间 —— 通常在 0.05 秒以下,因为所有操作都在内存中运行,没有网络调用。
## 离线分析流水线
此序列完全在磁盘上解析、映射并丰富你的规则 —— 无需 SIEM 或网络。
```
# 1. 将所有规则文件解析为统一的 JSON 格式
dv ingest examples/detections/sigma/ -o canonical.jsonl
# 2. 验证规则并映射到 ATT&CK 技术
dv map -i canonical.jsonl -o mapped.jsonl
# 3. 填充技术名称、CVE 元数据和严重性评分
dv enrich -i mapped.jsonl -o enriched.jsonl
```
丰富后你可以:
```
# 生成 ATT&CK Navigator 层(显示你覆盖了哪些技术)
dv navigator -d enriched.jsonl -o layer.json
# 打开 https://mitre-attack.github.io/attack-navigator/
# 点击 "Open Existing Layer" → "Upload from local" → 选择 layer.json
# 生成覆盖率徽章
dv badge -d enriched.jsonl --format json # JSON metrics
dv badge -d enriched.jsonl -o coverage.svg # SVG badge
```
## CVE 覆盖率分析
此工作流回答:*“我是否有针对攻击者利用此 CVE 时所使用技术的检测?”*
```
# 1. 更新本地情报缓存(运行一次;每月重新运行)
dv intel update --source attack
dv intel update --source cve
# 2. 构建增强语料库(与上述 pipeline 相同)
dv ingest examples/detections/ -o canonical.jsonl
dv map -i canonical.jsonl -o mapped.jsonl
dv enrich -i mapped.jsonl -o enriched.jsonl
# 3. 分析一个或多个 CVE 的覆盖率
dv cve-coverage --cve CVE-2021-44228 -d enriched.jsonl
dv cve-coverage --cve CVE-2021-44228,CVE-2021-34527,CVE-2021-26855 -d enriched.jsonl
```
示例输出:
```
CVE-2021-44228 KEV CVSS=10.0 EPSS=0.945 coverage=100% residual_risk=0.000
✓ T1059 execution conf=0.85 ← Log4Shell JNDI Injection Attempt
✓ T1190 initial-access conf=0.80 ← Log4Shell JNDI Injection Attempt
✓ T1499 impact conf=0.60 ← Test
```
**阅读输出:**
| 字段 | 含义 |
|---|---|
| **KEV** | 此 CVE 在 CISA 的已知被利用漏洞目录中 —— 正在野外被积极利用 |
| **CVSS** | 来自 NVD 的严重性评分(0–10,分数越高越严重) |
| **EPSS** | 未来 30 天内的漏洞利用概率(来源:FIRST.org) |
| **coverage** | 至少被一个检测覆盖的已映射技术的百分比 |
| **residual_risk** | `CVSS × EPSS × (1 − coverage)` —— 剩余的未覆盖风险;越低越好 |
| **conf** | 映射置信度:1.0 = 显式规则标签;~0.85 = CTID 数据集;CWE 推断则不固定 |
### 弥补覆盖率差距
如果 `cve-coverage` 对某项技术显示 ✗,请将该技术添加到规则中:
```
# 在你的 Sigma 规则的 tags 部分中:
tags:
- attack.T1499 # the technique you want to cover
- cve.2021.44228 # links this rule to the CVE in coverage reports
```
然后重新运行 `ingest → map → enrich → cve-coverage` 以确认差距已弥补。
## 格式转换(migrate)
在无需触及 SIEM 的情况下转换检测规则的格式:
```
# Sigma → Splunk savedsearches.conf
dv migrate sigma splunk --rules examples/detections/sigma/ -o searches.conf
# Sigma → KQL (Azure Sentinel / Microsoft Defender)
dv migrate sigma kql --rules examples/detections/sigma/ -o queries.kql
# 规范化并重新导出为干净的 Sigma YAML
dv migrate sigma sigma --rules examples/detections/sigma/ -o normalised/
```
## 使用现有的 SIEM
你可以将 `dv` 指向一个你已经在运行的 SIEM —— 本地部署的 OpenSearch、Elastic Cloud、内部 Splunk 实例等 —— 以替代(或附加于)本地 Docker 实例。
凭据存储在 `~/.detectionvalidator/siems.yaml` 中,永远不会触及项目目录。
### 第 1 步 —— 注册 SIEM
```
# OpenSearch / AWS OpenSearch Service
dv siem add prod \
--type opensearch \
--url https://opensearch.example.com:9200 \
--username admin --password secret
# 自签名或内部证书?添加 --no-verify-tls
dv siem add internal \
--type opensearch \
--url https://192.168.1.50:9200 \
--username admin --password secret \
--no-verify-tls
# Elastic Cloud
dv siem add elastic-cloud \
--type elasticsearch \
--url https://my-deployment.es.us-east-1.aws.elastic.co:9243 \
--api-key YOUR_API_KEY_HERE
# Splunk (HTTP Event Collector)
dv siem add splunk-prod \
--type splunk \
--url https://splunk.example.com:8088 \
--token YOUR_HEC_TOKEN_HERE
```
使用相同名称第二次运行 `dv siem add` 将覆盖该条目。
### 第 2 步 —— 验证连通性
```
# 列出所有已注册的内容
dv siem list
# 测试命名连接 — 检查认证、统计文档数、显示 3 个示例事件
dv siem test prod
```
### 第 3 步 —— 针对它验证规则
将注册的名称传递给 `--siem`,而不是 `opensearch` 或 `splunk`:
```
dv validate examples/detections/sigma/ --siem prod --since 24
```
### 第 4 步 —— 将遥测数据发送给它(可选)
如果你希望 Vagrant VM 将其 auditd 事件发送到你的 SIEM 以及本地 Docker OpenSearch 中,请运行:
```
dv siem attach prod
```
这会通过 SSH 连接到 VM,将一个新的 sink 附加到 `/etc/vector/vector.toml`,验证配置,然后重启 Vector。本地流水线继续运行 —— `attach` 只是添加了第二个输出。新的 sink 使用 `when_full = "drop_newest"`,因此缓慢的外部 SIEM 永远不会阻塞本地流水线。
### Index pattern
默认情况下 `dv` 查询 `dv-telemetry-*`。如果你的 SIEM 使用不同的索引或数据流,请在注册时覆盖它:
```
dv siem add prod \
--type opensearch \
--url https://opensearch.example.com:9200 \
--username admin --password secret \
--index logs-endpoint-*
```
或针对每个命令进行覆盖:
```
dv validate examples/detections/sigma/ --siem prod --index logs-endpoint-* --since 24
```
## 部署规则到实时 SIEM
直接将规则推送到运行中的 SIEM,以便它们在新事件上自动触发。
```
# 始终先预览 — 这不会进行任何更改
dv deploy examples/detections/sigma/ --siem opensearch --dry-run
# 正式部署 — 为每条规则创建一个 OpenSearch Alerting monitor
dv deploy examples/detections/sigma/ --siem opensearch
# 部署到 Splunk — 创建带有每小时计划的 saved searches
dv deploy examples/detections/sigma/ --siem splunk
```
## 使用 watch 进行实时规则开发
`dv watch` 会轮询你的规则目录,并在你每次保存文件时重新运行验证:
```
# 快速离线反馈 — 每次保存时针对本地事件文件重新匹配
dv watch examples/detections/sigma/ --events events.jsonl
# 实时反馈 — 每次保存时重新查询 OpenSearch
dv watch examples/detections/sigma/ --siem opensearch --since 1
# 在活跃开发期间增加轮询频率
dv watch examples/detections/sigma/ --events events.jsonl --interval 2
```
按 `Ctrl+C` 停止。
## 检查运行中的 stack
```
# 检查 OpenSearch 版本、连接性和文档计数
dv siem status
# 运行测试查询并显示最新事件
dv siem test --size 5
# 检查受害端 agent 健康状况
dv agent status
# 一行命令检查 SIEM 和 agent
dv siem status && dv agent status
```
## 在 OpenSearch Dashboards 中查看遥测数据
在浏览器中打开 `https://localhost:5601`。使用用户名 `admin` 和你在 `OPENSEARCH_INITIAL_ADMIN_PASSWORD` 中设置的密码登录。
转到 **Discover** 并选择 `dv-telemetry-*` 索引模式。设置时间范围(右上角)以覆盖你最近的一次攻击运行。
实用的 KQL 查询:
| 查询 | 显示内容 |
|---|---|
| `host: dv-victim` | 来自 Vagrant VM 的所有事件 |
| `technique.keyword: T1190` | 漏洞利用事件 |
| `technique.keyword: T1059.004` | Shell 执行事件 |
| `technique.keyword: T1068` | 权限提升事件 |
| `proctitle: jnd` | 针对 Log4Shell payload 的自由文本搜索 |
### 直接 API 访问
```
# 列出最近的 5 个事件
curl -sk -u "admin:${OPENSEARCH_INITIAL_ADMIN_PASSWORD}" \
"https://localhost:9200/dv-telemetry-*/_search?size=5&sort=timestamp:desc&pretty"
# 搜索特定技术
curl -sk -u "admin:${OPENSEARCH_INITIAL_ADMIN_PASSWORD}" \
"https://localhost:9200/dv-telemetry-*/_search?pretty" \
-H 'Content-Type: application/json' \
-d '{"query": {"term": {"technique.keyword": "T1190"}}}'
```
## 遥测字段参考
受害者代理写入的事件包含以下字段:
| 字段 | 示例 | 含义 |
|---|---|---|
| `technique` | `T1190` | 模拟的 ATT&CK 技术 ID |
| `key` | `network_connect` | 触发的审计规则 |
| `exe` | `/usr/bin/curl` | 运行进程的完整路径 |
| `uid` | `33` | 进程的数字 UID(33 = www-data) |
| `cmd_output` | `uid=0(root)...` | 捕获的命令输出 |
| `host` | `dv-victim` | 源机器的主机名 |
| `cve` | `CVE-2021-44228` | 生成此事件的 CVE 场景 |
| `timestamp` | `2026-05-26T04:26:00Z` | ISO 8601 UTC |
## 编写检测规则
规则位于 `examples/detections/sigma/`。每个都是一个 YAML 文件。
最小化可用规则:
```
title: My Detection Rule
id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
status: experimental
description: Detects something suspicious
logsource:
category: process_creation
detection:
keywords:
- suspicious_process
condition: keywords
tags:
- attack.T1059.004
level: high
```
关键字段:
| 字段 | 功能 |
|---|---|
| `id` | 唯一的 UUID。生成一个:`python3 -c "import uuid; print(uuid.uuid4())"` |
| `tags` | 将规则链接到 ATT&CK 技术(`attack.T1234`)和 CVE(`cve.2021.44228`) |
| `detection.keywords` | 针对事件字段的简单字符串匹配 |
| `level` | 严重性:`informational` / `low` / `medium` / `high` / `critical` |
编写规则后,立即对其进行测试:
```
# 离线 — 即时,无需 SIEM
dv match --events events.jsonl examples/detections/sigma/ --since 0
# 或实时针对 OpenSearch
dv validate examples/detections/sigma/ --since 24
```
## Vagrant VM 参考
```
cd vagrant
vagrant up # create and provision VM (~5 min on first run)
vagrant ssh # open a shell inside the VM
vagrant halt # stop the VM (preserves disk)
vagrant destroy -f # delete the VM entirely
# 在编辑文件/或 provision.sh 后重新运行配置
vagrant provision
# 检查 VM 内的所有三个服务
vagrant ssh -c "systemctl status victim-agent vector auditd --no-pager"
# 实时查看到达的审计事件
vagrant ssh -c "tail -f /var/log/audit/audit-events.jsonl"
```
## Docker stack 参考
```
# 启动带 OpenSearch 的实验环境(推荐)
./dv up lab --siem opensearch --profile standard
# 启动 Splunk Enterprise(仅限 amd64 — 在 Apple Silicon 上不可用)
./dv up lab --siem splunk --profile standard
# 同时启动两个 SIEM
./dv up lab --siem opensearch,splunk
# 停止所有内容
./dv down lab --siem opensearch
# 检查状态
./dv status
# 追踪容器的日志
./dv logs dv-opensearch -f
./dv logs dv-vector -f
./dv logs dv-linux-victim -f
```
### 资源配置
| 配置 | 每个服务的内存 | 推荐用于 |
|---|---|---|
| `standard` | ~1 GB | 默认 —— 推荐用于大多数 Mac |
| `tiny` | ~600 MB | 仅在容器因内存不足不断重启时使用 |
| `full` | 2 GB+ | CI 服务器或专用机器 |
## GitHub Actions
将检测验证添加到你的 CI 流水线中:
```
name: Validate detections
on: [push, pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install detection-validator
run: pip install uv && uv pip install --system .
- name: Match offline
run: |
dv match --events tests/fixtures/events.jsonl \
detections/ --since 0 --format json | \
dv report --format sarif -o scan.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: scan.sarif
```
## 故障排除
### `dv: command not found`
虚拟环境未激活。运行:
```
source .venv/bin/activate
```
或者使用完整路径:`.venv/bin/dv`
### `dv doctor` 显示 "OpenSearch auth failed"
确保密码环境变量与启动 OpenSearch 时使用的相匹配:
```
export OPENSEARCH_INITIAL_ADMIN_PASSWORD="DetectVal123!"
dv siem status # confirms the password works
```
### OpenSearch 容器启动失败 —— `vm.max_map_count too low`
```
docker run --rm --privileged alpine sysctl -w vm.max_map_count=262144
./dv up lab --siem opensearch --profile standard
```
### 容器重启或内存不足
在 Docker Desktop → Settings → Resources → Memory 中:设置为至少 **8 GB**。
如果仍然不稳定,请使用 `tiny` 配置(跳过 OpenSearch Dashboards,使用更少的内存):
```
./dv down lab --siem opensearch
./dv up lab --siem opensearch --profile tiny
```
### Vagrant VM 启动失败 —— QEMU / HVF 错误
确保 Docker Desktop 和终端在系统设置 → 隐私与安全性中拥有完整的磁盘访问权限。
```
vagrant plugin update vagrant-qemu
cd vagrant && vagrant destroy -f && vagrant up
```
### `dv validate` 显示所有规则的匹配数为 0
默认的 `--since 1` 窗口只回顾过去 1 小时。如果你的攻击是在更早的时候运行的,请扩大窗口:
```
dv validate examples/detections/sigma/ --since 24
```
同时确认事件已进入 OpenSearch:
```
dv siem status # check document count
dv siem test --size 5 # show sample events
```
### `dv match` 返回 0 个匹配
检查你的事件文件不为空且是有效的 JSON:
```
wc -l events.jsonl # should be > 0
head -1 events.jsonl | python3 -m json.tool # should print valid JSON
```
## 检测示例
`examples/detections/` 中即用型规则:
| 格式 | 文件 | CVE | 技术 |
|---|---|---|---|
| Sigma | `sigma/log4shell_jndi_injection.yml` | CVE-2021-44228 | T1190, T1059.004 |
| Sigma | `sigma/log4shell_process_exec.yml` | CVE-2021-44228 | T1190, T1059.004 |
| Sigma | `sigma/printnightmare_spooler_abuse.yml` | CVE-2021-34527 | T1068, T1547.012, T1574.001 |
| Sigma | `sigma/proxylogon_exchange_ssrf.yml` | CVE-2021-26855 | T1190, T1505.003, T1078 |
| Sigma | `sigma/proxylogon_process_exec.yml` | CVE-2021-26855 | T1190, T1552.001, T1078 |
| Sigma | `sigma/credential_dump_lsass.yml` | — | T1003.001 |
| Sigma | `sigma/network_scan_nmap.yml` | — | T1046 |
| Splunk | `splunk/savedsearches.conf` | — | T1059.001, T1570 |
| KQL | `kql/sentinel_aad_password_spray.yml` | — | T1110.003 |
## 命令参考
| 命令 | 功能 |
|---|---|
| `dv demo` | 一条命令端到端演示:stack → VM → 金丝雀 → 漏洞利用 → 验证 |
| `dv doctor` | 预检查:Python、Docker、Vagrant、SIEM、代理、缓存 |
| `dv doctor --fix` | 同上,加上自动下载空的情报缓存 |
| `dv attack` | 针对受害者 VM 执行 CVE 漏洞利用步骤 |
| `dv validate` | 查询实时 SIEM 的规则命中情况,报告 PASS/FAIL |
| `dv match` | 针对本地 JSONL 事件文件执行相同的离线评估 |
| `dv report` | 将结果渲染为 CLI 摘要 / SARIF / HTML |
| `dv watch` | 每当规则文件改变时自动重新验证 |
| `dv ingest` | 将 Sigma/Splunk/KQL/YARA/EQL 规则解析为规范的 JSONL |
| `dv map` | 将解析后的规则映射到 ATT&CK 技术 |
| `dv enrich` | 填充技术名称、CVE 元数据和严重性 |
| `dv migrate` | 在不同格式之间转换规则(sigma → splunk / kql / sigma) |
| `dv deploy` | 将规则作为告警监视器或保存的搜索推送到实时 SIEM |
| `dv badge` | 生成 SVG 或 JSON 的 ATT&CK 覆盖率徽章 |
| `dv siem add` | 注册外部 SIEM(OpenSearch / Elasticsearch / Splunk) |
| `dv siem list` | 列出所有已注册的 SIEM 连接 |
| `dv siem attach` | 配置 VM 上的 Vector,使其同时将事件发送到已注册的 SIEM |
| `dv siem status` | 检查 SIEM 连接性和文档计数 |
| `dv siem test` | 运行测试查询并显示样本事件 |
| `dv agent status` | 检查受害者代理健康端点 |
| `dv agent logs` | 从受害者代理获取最近的事件 |
| `dv cve-coverage` | 分析每个 CVE 的检测覆盖率缺口 |
| `dv navigator` | 从检测语料库导出 ATT&CK Navigator 层 |
| `dv intel update` | 刷新本地 ATT&CK、CVE、EPSS、KEV 缓存 |
## 架构
```
┌─ Python CLI (dv) ──────────────────────────────────────────────┐
│ dv doctor — pre-flight check: tools, containers, caches │
│ dv attack — simulate CVE exploit steps on victim │
│ dv validate — query live SIEM, report PASS/FAIL per rule │
│ dv match — same evaluation offline against a JSONL file│
│ dv report — render results as CLI / SARIF / HTML │
│ dv watch — re-validate on rule file changes │
│ dv ingest — parse Sigma/Splunk/KQL/YARA/EQL to JSONL │
│ dv map — map rules to ATT&CK techniques │
│ dv enrich — fill technique names, CVE metadata, severity│
│ dv migrate — convert rules between formats │
│ dv deploy — push rules to OpenSearch / Splunk │
│ dv badge — generate SVG / JSON coverage badge │
│ dv siem — check connectivity, run test queries │
│ dv agent — check agent health, fetch recent events │
│ dv cve-coverage — analyze coverage gaps per CVE │
│ dv navigator — export ATT&CK Navigator layer │
└────────────────────────────────────────────────────────────────┘
┌─ Shell script (./dv) ──────────────────────────────────────────┐
│ ./dv up lab --siem opensearch — start Docker containers │
│ ./dv down lab — stop Docker containers │
│ ./dv status — show running services │
│ ./dv logs — tail container logs │
└────────────────────────────────────────────────────────────────┘
┌─ Telemetry pipeline ───────────────────────────────────────────┐
│ Vagrant VM (Ubuntu 22.04 ARM64) │
│ auditd → /var/log/audit/audit-events.jsonl │
│ victim-agent (port 9099) ← dv attack │
│ vector → OpenSearch (9200) + Splunk HEC (8088) │
│ │
│ Docker linux-victim container (synthetic events) │
│ stdout → vector → OpenSearch + Splunk HEC │
└────────────────────────────────────────────────────────────────┘
┌─ SIEMs ────────────────────────────────────────────────────────┐
│ OpenSearch localhost:9200 Dashboards: localhost:5601 │
│ Splunk mock localhost:8088 UI: localhost:8000 │
└────────────────────────────────────────────────────────────────┘
```
## Windows 注意事项
完整的 Windows 指南请参阅 [docs/windows-quickstart.md](docs/windows-quickstart.md)。主要区别:
- 在 **Git Bash** 中而不是 PowerShell 中运行 `./dv up` / `./dv down`。
- 在使用 `dv` 之前,在 PowerShell 中设置 `$env:PYTHONUTF8 = "1"` 和 `$env:PYTHONIOENCODING = "utf-8"`。
- 攻击时使用 `--target docker --mode simulate`(无需 Vagrant)。
- 预期结果:**5 PASS / 3 FAIL**(LSASS、MSHTA、Nmap 需要 Windows 受害者或 Nmap 扫描)。
## Apple Silicon 注意事项
所有核心服务都原生在 ARM64 上运行。没有模拟开销。
| 组件 | ARM64 状态 |
|---|---|
| OpenSearch + Dashboards | ✅ 原生 |
| Splunk mock (HEC) | ✅ 原生(基于 Python) |
| 通过 QEMU/HVF 的 Vagrant VM | ✅ 原生 ARM64 内核 |
| Docker Linux 受害者 | ✅ 原生 |
| Splunk Enterprise | ❌ 仅限 amd64 —— 请改用 `--siem opensearch` |
**端口布局**(Mac 宿主机 → VM/容器):
| 宿主机端口 | 目的地 | 说明 |
|---|---|---|
| `9200` | Docker | OpenSearch API |
| `5601` | Docker | OpenSearch Dashboards |
| `8000` | Docker | Splunk mock UI |
| `8088` | Docker | Splunk HEC(事件摄取) |
| `9098` | VM 端口 9099 | 受害者代理 HTTP API |
| `9088` | VM 端口 8888 | 故意保留漏洞的服务 |
## 许可证
Apache 2.0
标签:Docker, PB级数据处理, Vagrant, XXE攻击, 安全运维, 安全防御评估, 搜索引擎查询, 攻击模拟, 规则检测, 请求拦截, 逆向工具, 配置修复, 驱动签名利用