Yazedd/Huntforge
GitHub: Yazedd/Huntforge
HuntForge 将威胁情报 IOC 自动映射到 MITRE ATT&CK 技术并生成多 SIEM 狩猎查询,解决了从情报到查询手动转换耗时的问题。
Stars: 0 | Forks: 0
# HuntForge
**AI 增强的威胁情报 → MITRE ATT&CK → 即用型搜寻查询。**
HuntForge 接收最新的 IOC 订阅源,使用透明且可扩展的置信度加权映射表将其映射到 ATT&CK 技术,在 Splunk SPL / Microsoft Sentinel KQL / Elasticsearch ES|QL 中自动生成搜寻查询,并在其上层叠加了一个检索增强的“搜寻 Copilot”,它*仅*根据本次运行实际摄取的内容来回答问题——而不是模型的一般知识。
它的构建基于一个理念:威胁搜寻的缓慢部分通常不在于发现 IOC,而在于从*“这个 IP 是 Cobalt Strike C2”*到*“这是一个我现在就可以粘贴到 Splunk 中的 SPL 查询”*的手动转换。
HuntForge 自动化了该转换,并展示了其在每一步的工作过程。
```
Feed (ThreatFox/URLhaus)
│
▼
Normalize IOC ──▶ Map to ATT&CK ──▶ Generate hunt queries ──▶ Push to Elastic/Kibana
(schema.py) (attack_mapper) (Splunk/KQL/ES|QL) │
│ │ │ ▼
└─────────────────┴────────────────────┴──────────▶ HuntCopilot (RAG)
"How do I hunt for X?"
```
## 为什么选择它,而不是另一个“开箱即用”的 SOC 代码库
大多数公开的“威胁情报实验室”代码库要么是 带有仪表板的订阅源查看器,要么是 包含 Wazuh/ELK 但中间没有任何实际逻辑的 Docker Compose 文件。HuntForge 真正的工程面在于管道的中间部分:一个您可以审计和扩展的**置信度加权 ATT&CK 映射引擎**、**模板驱动的多 SIEM 查询生成**,以及一个**范围限定于其自身输出的 RAG 层**,因此它无法凭空捏造(幻觉)从未摄取过的情报。
## 功能
- **与订阅源无关的摄取** — ThreatFox 和 URLhaus 摄取器将其标准化为严格的 `NormalizedIOC` schema。添加 MISP 或 OTX 摄取器意味着只需编写一个新模块,而无需触及下游的任何内容。
- **透明的 ATT&CK 映射** — `data/attack_mapping.json` 是一个普通、可编辑的表格(恶意软件家族 / 威胁类型 / 标签 → 技术,每项均带有置信度权重)。没有黑盒;可以从您自己的 CTI 阅读中扩充它。
- **多 SIEM 查询生成** — Jinja2 模板将相同的技术匹配渲染为 Splunk SPL、Sentinel/Defender KQL 和 Elasticsearch ES|QL,并根据 IOC 类型(IP / domain / URL / hash)正确分支。
- **HuntCopilot (RAG)** — 对本次运行的 IOC 和生成的查询进行 TF-IDF 检索,可选择通过 Anthropic API 合成为搜寻假设。在没有 API 密钥的情况下可完全离线工作(返回原始检索到的上下文,而非叙述性文本)。
- **Kibana 可视化** — 内置的 `docker-compose.yml` 会启动一个本地单节点 Elasticsearch + Kibana,因此丰富的 IOC 是实际可见的,而不仅仅是磁盘上的 JSON。
- **缺口跟踪** — 每次运行都会报告哪些 IOC 无法被确信地映射,因此扩展映射表是一项待办事项列表,而不是凭空猜测。
## Web UI
HuntForge 还配备了一个本地 Web 仪表板 — 位于相同管道之上的 FastAPI 后端,带有静态前端(无需构建步骤,无需 Node)。
```
huntforge-web
# 打开 http://localhost:8000
```
/huntforge.git
cd huntforge
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev,copilot]"
# 1. Ingest(如果无法访问 feed,则回退到内置的 sample data)
huntforge ingest --source all -o data/run_iocs.json
# 2. 映射到 MITRE ATT&CK
huntforge map -i data/run_iocs.json -o data/run_enriched.json
# 3. 生成 hunt queries
huntforge generate-queries -i data/run_enriched.json --platform splunk -o data/run_queries.txt
huntforge generate-queries -i data/run_enriched.json --platform kql
huntforge generate-queries -i data/run_enriched.json --platform esql
# 4. 基于本次运行的 intel 向 copilot 提问
export ANTHROPIC_API_KEY=sk-... # optional - omit for retrieved-context-only mode
huntforge ask "How would I hunt for Cobalt Strike C2 in this dataset?" -i data/run_enriched.json
# 5.(可选)在 Kibana 中进行 Visualize
docker compose up -d
huntforge push-elastic -i data/run_enriched.json
# 打开 http://localhost:5601
```
请参阅 [`examples/demo_walkthrough.md`](examples/demo_walkthrough.md) 获取完整的注释运行说明,包括实际生成的查询输出。
## 项目结构
```
huntforge/
├── src/huntforge/
│ ├── ingest/ # feed-specific ingesters + common NormalizedIOC schema
│ ├── mitre/ # AttackMapper - confidence-weighted technique matching
│ ├── hunt/ # Jinja2 templates + query_generator (SPL/KQL/ES|QL)
│ ├── copilot/ # RAG hunt copilot (TF-IDF retrieval + optional Claude synthesis)
│ ├── elk/ # bulk push to Elasticsearch for Kibana viz
│ ├── web/ # FastAPI backend + static frontend (`huntforge-web`)
│ └── cli.py # `huntforge` CLI: ingest -> map -> generate-queries -> ask
├── data/
│ ├── attack_mapping.json # editable IOC-context -> ATT&CK technique table
│ ├── sample_threatfox.json # offline fallback data
│ └── sample_urlhaus.json # offline fallback data
├── tests/ # pytest, all deterministic / no network required
├── docker-compose.yml # local single-node Elasticsearch + Kibana
├── docs/screenshot-ui.svg
└── examples/demo_walkthrough.md
```
## 在扩展之前值得阅读的设计说明
- **ATT&CK 映射是一个起点,而不是绝对真理。** 仅凭上下文(恶意软件家族、威胁类型、标签)将 IOC 归因于某项技术本质上是一个微弱的信号 — 一个 C2 IP 本身几乎无法告诉你任何关于攻击手法的细节。这就是为什么每个匹配项都带有 `matched_via` 和 `weight`,以及为什么存在 `AttackMapper.unmapped()`:为了揭示 HuntForge *不知道*的内容,而不是默默地猜测。
- **HuntCopilot 只知道本次运行摄取的内容。** 它无法很好地回答诸如“Cobalt Strike 是如何工作的”这类通用问题 — 这是刻意为之的。它旨在回答“*我当前的数据集*对此有何说法”,这对于 LLM 来说是一个更狭义且更可信的问题。
- **离线优先。** 每个网络调用(订阅源 API、Anthropic API、Elasticsearch)都会优雅降级。完整的管道 — 从摄取到查询生成 — 可在零网络访问和零 API 密钥的情况下运行,这也是测试套件 100% 确定性的原因。
## 路线图构想
- MISP / OTX 摄取器
- STIX 2.1 导出,用于与其他 CTI 工具互操作
- 将 TF-IDF 检索替换为位于相同 `Document` 接口之后的 sentence-transformer embeddings(`copilot/rag_engine.py` 的编写使其成为一个即插即用的更改)
- PCAP 派生的 IOC 提取(与 XOR 编码的 C2 流量分析挂钩)作为额外的摄取器
## 许可证
MIT — 查看 [LICENSE](LICENSE)。
Illustrative mockup — run huntforge-web to see the real thing.
标签:ATT&CK框架, DLL 劫持, SIEM查询生成, 大语言模型, 威胁情报, 安全运营, 开发者工具, 扫描框架, 请求拦截, 越狱测试, 逆向工具