sethporter903/sentinel-osint
GitHub: sethporter903/sentinel-osint
一个基于 LLM 的全栈 OSINT 平台,通过并发查询 11 个威胁情报源并借助 Claude 生成结构化的 IOC 分诊报告和营销活动级威胁分析。
Stars: 1 | Forks: 0
# SentinelOSINT — IOC 富化与分诊
**借助 LLM 辅助,跨 11 个并发情报源进行入侵指标 (IOC) 富化,支持多 IOC 营销活动分析及独立的准确度基准测试**
## 在线演示
**[sentinel-osint-r7fv.onrender.com](https://sentinel-osint-r7fv.onrender.com)**
[](https://python.org)
[](https://fastapi.tiangolo.com)
[](https://react.dev)
[](https://anthropic.com)
[](LICENSE)
## 截图
### 单个 IOC 分析
提交任意 IP、域名、文件哈希或 URL,即可获得一份包含风险评分、WHOIS 数据以及 GitHub 辅助情报的完整多源分诊报告。

### AI 分诊报告
Claude 将所有源数据综合为一份结构化判定结论,包含三部分置信度细分、支持与冲突的证据,以及 MITRE ATT&CK 映射。

### 营销活动分析
提交一组相关指标,即可获得统一的营销活动级判定、共享模式提取,以及按角色分组的指标基础设施映射图。

## 概述
SentinelOSINT 是一个全栈的 IOC 富化与分诊平台。只需提交一个 IP 地址、域名、文件哈希或 URL,它就会并发地向十一个威胁情报源发起查询,随后将汇总的结果传递给 Claude,以生成结构化的分诊评估报告 —— 包括判定结论、置信度细分、MITRE ATT&CK 映射、建议措施以及 TLP 分类。
**营销活动分析模式**允许您一起提交一组相关指标(来自同一安全事件的 IP、域名和哈希),并获得统一的营销活动级评估:这些指标是否表现出协同性、是什么共同模式将它们联系在一起、基础设施角色分类(C2、投递、数据外发),以及威胁行为者假设。
`benchmark/` 目录下的独立**基准测试套件**基于包含 40 个 IP 地址(20 个良性、20 个恶意,来源于公开威胁情报订阅)的精选真值数据集,对该工具的分类准确性进行了评估。
本项目包含两个版本:
| 版本 | 描述 | 入口点 |
|---|---|---|
| **v1 — Notebook** | 基于 Jupyter 的原型。包含实时 prompt injection 演示与缓解分析。 | `notebook/osint_report.ipynb` |
| **v2 — 全栈** | 生产级 FastAPI 后端 + React 前端,支持单个 IOC 和营销活动分析模式。 | `backend/` + `frontend/` |
## 架构
```
flowchart TD
User([Analyst\nBrowser]) -->|IP · Domain · Hash · URL| FE
subgraph Frontend [React Frontend — Vite · TypeScript · Tailwind]
FE[App.jsx\nSingle-IOC · Campaign · Review tabs]
end
FE <-->|REST /api/analyze\n/api/analyze/batch\n/api/analyze/campaign| BE
subgraph Backend [FastAPI Backend — Python · Uvicorn]
BE[main.py\nRoutes & request handling]
BE --> FH[fetchers.py\nasyncio.gather — 11 concurrent sources]
BE -.->|DEMO_MODE=true| DM[(demo_data/\nPre-cached JSON)]
DM -.-> BE
end
FH --> S1[WHOIS / RDAP]
FH --> S2[AlienVault OTX]
FH --> S3[GreyNoise]
FH --> S4[AbuseIPDB]
FH --> S5[Shodan]
FH --> S6[MalwareBazaar]
FH --> S7[URLhaus]
FH --> S8[CIRCL Passive DNS]
FH --> S9[VirusTotal Passive DNS]
FH --> S10[GitHub Search]
FH --> S11[ThreatFox]
S1 & S2 & S3 & S4 & S5 & S6 & S7 & S8 & S9 & S10 & S11 -->|aggregated source data| LLM
LLM[Claude — Anthropic API\nStructured triage synthesis]
LLM -->|verdict · confidence · MITRE ATT&CK · TLP\nkey findings · recommended actions| FH
FH --> BE
BE --> FE
FE -->|Rendered report\nSummary · Indicators · Sources · AI Report| User
subgraph Benchmark [Benchmark — benchmark/]
GT[ground_truth.json\n20 benign + 20 malicious IPs]
BM[run_benchmark.py\nprecision · recall · FPR · FNR · F1]
GT --> BM
end
BM -->|GET /api/analyze per target| BE
```
## 功能
### 单个 IOC 分析
- 通过 `asyncio.gather` 分发至 11 个并发情报源
- LLM 分诊报告包含判定结论、三部分置信度评分、MITRE ATT&CK 映射、建议操作和 TLP
- 输入类型自动检测(IP、域名、URL、MD5、SHA1、SHA256、电子邮件)
- 选项卡:摘要、指标、来源(附带外部链接)、AI 报告
- 支持 JSON 和 PDF 导出
- 友好名称别名解析(例如 "Google DNS" → 8.8.8.8)
### 营销活动分析
- 将多个相关指标(每行一个)粘贴到文本框中
- 所有指标同时通过完整的 11 源 pipeline 运行
- LLM 综合生成营销活动级别的报告:共享模式、按角色分组的基础设施映射图(C2 / 投递 / 数据外发)、威胁行为者假设、营销活动判定结论及置信度
- 基础设施映射图在 UI 中呈现为分组卡片视图
### 基准测试
- 真值数据集:20 个已知良性 IP(DNS 解析器、CDN)+ 20 个已知恶意 IP(Feodo Tracker、AbuseIPDB、Spamhaus)
- `benchmark/run_benchmark.py` 将所有 40 个目标通过实时 API 进行循环测试,计算宽松和严格阈值下的 Precision、Recall、FPR、FNR、F1 和 Accuracy,并保存完整的逐目标结果报告
- 有关方法论和数据集来源,请参阅 [`benchmark/README.md`](benchmark/README.md)
### 演示模式
- 预加载的单个目标示例:Tor exit node(恶意 IP)、C2 域名、Google DNS(良性 IP)、EICAR 测试哈希
- 预加载的营销活动示例:Banking Phishing Kit(4 个指标)、Cobalt Strike C2 集群(4 个指标)
- 在环境中设置 `DEMO_MODE=true`,即可在没有 API 密钥的情况下提供缓存结果
## 数据源
不适用于输入类型的源将返回 `status: "not_applicable"`,并会自动从 LLM 上下文中排除。
| 数据源 | 覆盖范围 | 关键信号 |
|---|---|---|
| **WHOIS / RDAP** | 域名、IP | 注册商、创建日期、域名服务器、ASN、国家(IP 通过 RDAP 获取) |
| **AlienVault OTX** | IP、域名、URL、哈希 | Pulse 数量、恶意软件家族、威胁行为者、信誉评分 |
| **GreyNoise** | 仅 IP | 大规模扫描器分类、RIOT 良性服务列表 |
| **AbuseIPDB** | 仅 IP | 滥用置信度评分(0–100)、365 天报告计数、类别 |
| **Shodan** | 仅 IP | 开放端口、服务 banner、CVE(CVSS ≥ 9.0 会被标记) |
| **MalwareBazaar** | MD5、SHA1、SHA256 | 恶意软件签名、文件类型、社区标签 |
| **URLhaus** | URL、域名 | 活跃/离线恶意 URL 数量、标签 |
| **CIRCL Passive DNS** | IP、域名 | 历史 DNS 解析记录 |
| **VirusTotal Passive DNS** | IP、域名 | DNS 解析记录;在无法获取时回退到 communicating/referrer 文件 |
| **GitHub** | 全部 | 仓库搜索,带有 proxy-list 相关性过滤 |
| **ThreatFox** | IP、域名 | IOC 条目、置信度级别、威胁类型、恶意软件家族 |
## LLM 报告
### 单个 IOC 报告
在所有源解析完毕后,Claude 会综合生成一份结构化的 JSON 评估:
```
{
"verdict": "malicious | suspicious | benign | unknown",
"source_confidence": 92,
"llm_confidence": 87,
"overall_confidence": 90,
"summary": "2–3 sentence plain English summary for non-technical stakeholders",
"key_findings": ["finding 1", "finding 2", "finding 3"],
"mitre_techniques": [
{ "technique_id": "T1583.001", "technique_name": "Acquire Infrastructure: Domains", "justification": "..." }
],
"recommended_actions": ["Block at perimeter firewall", "Search SIEM for last 90 days"],
"iocs_extracted": ["associated IOCs found in source data"],
"tlp": "WHITE | GREEN | AMBER",
"top_supporting_evidence": ["strongest signal 1 with source and value"],
"top_conflicting_evidence": ["signal that introduces uncertainty or false-positive risk"]
}
```
**置信度字段说明:**
- `source_confidence` — 原始源数据的质量、数量和一致性(独立于模型的解释)
- `llm_confidence` — 模型对自身推理和解释的确定性
- `overall_confidence` — 加权组合:`round((source_confidence × 0.6) + (llm_confidence × 0.4))`
### 营销活动报告
营销活动分析会生成一份独立的结构化评估:
```
{
"campaign_verdict": "coordinated_malicious | likely_related | unrelated | unknown",
"confidence": 94,
"summary": "3–4 sentence plain English assessment for a CISO or incident commander",
"shared_patterns": ["All three domains registered via Namecheap within 48 hours", "..."],
"infrastructure_map": {
"c2": ["45.153.160.140", "194.165.16.158"],
"delivery": ["malicious-domain.xyz"],
"exfiltration": ["185.234.219.70"],
"unknown": []
},
"threat_actor_hypothesis": "Named group or behavioral profile; null if unknown",
"mitre_techniques": [
{ "technique_id": "T1583.001", "technique_name": "Acquire Infrastructure: Domains", "justification": "..." }
],
"recommended_actions": ["Campaign-level action 1", "Campaign-level action 2"]
}
```
## API
### 单个目标
```
GET /api/analyze?target={ip|domain|hash|url}
```
### 批量(最多 10 个并发)
```
POST /api/analyze/batch
Content-Type: application/json
{ "targets": ["1.1.1.1", "evil.com", "abc123..."] }
```
### 营销活动分析
```
POST /api/analyze/campaign
Content-Type: application/json
{ "targets": ["185.220.101.47", "malicious-domain.xyz", "45.153.160.140"] }
```
响应:
```
{
"targets": ["185.220.101.47", "malicious-domain.xyz", "45.153.160.140"],
"individual_results": [ { "target": "...", "report": { ... }, ... } ],
"campaign_report": { "campaign_verdict": "...", "shared_patterns": [...], ... }
}
```
### 单个目标响应结构
```
{
"target": "185.220.101.47",
"input_type": "ip",
"whois": { "asn": "AS209100", "org": "...", "country": "DE", ... },
"otx": { "source": "otx", "status": "success", "verdict": "malicious", "confidence": "high", "summary": "...", "raw": { ... } },
"greynoise": { "source": "greynoise", "status": "success", "verdict": "malicious", "confidence": "high", "summary": "...", "raw": { ... } },
"abuseipdb": { "source": "abuseipdb", "status": "success", "verdict": "malicious", "confidence": "high", "summary": "...", "raw": { ... } },
"shodan": { "source": "shodan", "status": "success", "verdict": "suspicious","confidence": "medium","summary": "...", "raw": { ... } },
"malwarebazaar": { "source": "malwarebazaar", "status": "not_applicable", ... },
"urlhaus": { "source": "urlhaus", "status": "not_applicable", ... },
"circl_pdns": { "source": "circl_pdns", "status": "success", ... },
"vt_passive_dns": { "source": "vt_passive_dns", "status": "success", ... },
"github": { "source": "github", "status": "success", ... },
"threatfox": { "source": "threatfox", "status": "success", "verdict": "malicious", ... },
"report": {
"verdict": "malicious",
"source_confidence": 96,
"llm_confidence": 87,
"overall_confidence": 92,
"summary": "...",
...
}
}
```
每个源遵循 `{source, status, verdict, confidence, summary, raw}` 结构。返回 `status: "not_applicable"` 的源将被自动排除在 LLM prompt 之外。
## 本地运行
**后端**
```
cd backend
pip install -r requirements.txt
cp ../.env.example .env # fill in your API keys
python -m uvicorn main:app --reload
# API 可在 http://localhost:8000 获取
```
**前端**
```
cd frontend
npm install
npm run dev
# UI 位于 http://localhost:5173 — Vite 将 /api/* 代理到 backend
```
**演示模式(无需 API 密钥)**
```
DEMO_MODE=true python -m uvicorn main:app --reload
```
**运行基准测试**
```
pip install httpx
# backend 必须在 localhost:8000 上运行
python benchmark/run_benchmark.py
# 结果保存至 benchmark/results.json
```
## 项目结构
```
sentinel-osint/
├── backend/
│ ├── main.py # FastAPI routes — single, batch, and campaign /analyze endpoints
│ ├── fetchers.py # 11 async source integrations, single-IOC and campaign LLM reports
│ ├── fetch_threatfox.py # ThreatFox module (standalone)
│ ├── demo_data/ # Pre-cached results served in DEMO_MODE
│ │ ├── manifest.json # Ordered demo target list (single + campaign entries)
│ │ ├── 185.220.101.45.json
│ │ ├── malware-c2.example.json
│ │ ├── 8.8.8.8.json
│ │ ├── 44d88612fea8a8f36de82e1278abb02f.json
│ │ ├── campaign_phishing_kit.json # Multi-bank phishing campaign demo
│ │ └── campaign_cobalt_strike.json # Cobalt Strike C2 cluster demo
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── App.jsx # Full UI — single-IOC and campaign modes, all tabs
│ │ └── main.jsx
│ ├── index.html
│ ├── vite.config.js # Dev proxy: /api/* → localhost:8000
│ └── package.json
├── benchmark/
│ ├── ground_truth.json # 20 benign + 20 malicious IPs with source attribution
│ ├── run_benchmark.py # Accuracy evaluation script (precision, recall, FPR, FNR)
│ └── README.md # Methodology, dataset sources, metric definitions
├── notebook/
│ └── osint_report.ipynb # v1 prototype with prompt injection demo
├── modules/ # v1 notebook helper modules
├── .env.example
├── .gitignore
└── README.md
```
## API 密钥
将 `.env.example` 复制到 `backend/.env`。切勿提交 `.env` 文件。
| 变量 | 来源 | 是否必需 | 备注 |
|---|---|---|---|
| `ANTHROPIC_API_KEY` | [console.anthropic.com](https://console.anthropic.com) | **是** | 用于单个 IOC 和营销活动报告生成 |
| `VT_API_KEY` | [virustotal.com](https://www.virustotal.com/gui/join-us) | **是** | Passive DNS;免费层每天 500 次请求 |
| `OTX_API_KEY` | [otx.alienvault.com](https://otx.alienvault.com) | **是** | 需要免费账户 |
| `ABUSEIPDB_API_KEY` | [abuseipdb.com](https://www.abuseipdb.com) | **是** | 免费层每天 1,000 次检查 |
| `SHODAN_API_KEY` | [account.shodan.io](https://account.shodan.io) | **是** | 主机查询需付费会员 |
| `GREYNOISE_API_KEY` | [greynoise.io](https://www.greynoise.io) | 推荐 | 提供免费的社区层 |
| `THREATFOX_API_KEY` | [threatfox.abuse.ch](https://threatfox.abuse.ch/api/) | 可选 | 允许未经身份验证的访问,但速率限制较低 |
| `GITHUB_TOKEN` | GitHub → Settings → Developer Settings | 可选 | 将速率限制从 10 提升至 30 次/分钟 |
| `FRONTEND_URL` | — | 可选 | 生产环境的 CORS 来源;默认为 `http://localhost:5173` |
| `DEMO_MODE` | — | 可选 | 设置为 `true` 以提供预缓存的演示结果 |
MalwareBazaar、URLhaus 和 CIRCL pDNS 不需要 API 密钥。
## 基准测试
`benchmark/` 目录包含基于精选真值数据集进行的独立准确度评估。
**数据集:** 40 个 IP 地址 — 20 个已知良性(公共 DNS 解析器、主要 CDN/云基础设施)和 20 个已知恶意(来源于 Feodo Tracker、AbuseIPDB 和 Spamhaus),每个都附带文档化的来源归属。
**计算的指标:** Precision、Recall (TPR)、False Positive Rate、False Negative Rate、F1 Score、Accuracy — 在两种阈值下进行评估:
- **宽松:** `malicious` 或 `suspicious` 的判定结论计为正向预测
- **严格:** 仅 `malicious` 的判定结论计为正向预测
有关完整的方法论、数据集来源和已知注意事项(IP 重新分配、Tor exit node 的模糊性、LLM 非确定性),请参阅 [`benchmark/README.md`](benchmark/README.md)。
```
python benchmark/run_benchmark.py --help
# --api-url, --delay, --strict, --output, --targets
```
### 测试结果
使用本地后端和实时威胁情报源对 40 个 IP 地址(20 个良性,20 个恶意)进行了评估。本次运行未配置 OTX 和 GreyNoise 密钥 — 结果反映了部分数据源覆盖的情况(注意事项详见 [`benchmark/README.md`](benchmark/README.md))。
| 指标 | 宽松阈值¹ | 严格阈值² |
|---|---|---|
| **Accuracy** | 82.5% | 67.5% |
| **Precision** | 84.2% | 88.9% |
| **Recall (TPR)** | 80.0% | 40.0% |
| **F1 Score** | 0.821 | 0.552 |
| **False Positive Rate** | 15.0% | 5.0% |
| **False Negative Rate** | 20.0% | 60.0% |
| TP / TN / FP / FN | 16 / 17 / 3 / 4 | 8 / 19 / 1 / 12 |
¹ 宽松:`malicious` 或 `suspicious` 的判定结论计为正向预测。
² 严格:仅 `malicious` 的判定结论计为正向预测。在严格模式下召回率较低是预期之中的结果 — 因为 Tor exit node 和低置信度的 IP 会被正确标记为 `suspicious` 而非 `malicious`,这种情况仅在该阈值下才会被计为漏报。
## v1 — Notebook
最初的原型会查询 WHOIS、GitHub、HaveIBeenPwned、Shodan 和 VirusTotal,并生成结构化的 Markdown 威胁报告。
**Cell 6 演示了实时间接 prompt injection 攻击**,使用了本地构建的中毒 WHOIS 记录。该单元格中不查询任何外部系统。
```
cd notebook
pip install -r ../requirements.txt
jupyter notebook osint_report.ipynb
```
在 Cell 2 中设置您的目标,然后运行单元格。
### Prompt Injection 风险 — 设计使然
所有数据源返回的都是未经证实的公开内容,这些内容会流入 LLM prompt 中。如果攻击者预料到会被带有 LLM 辅助的工具查询,他们就可以在 WHOIS 注册人字段、GitHub 简介、Shodan banner 数据或 DNS 记录中嵌入指令 payload。
| 缓解措施 | 实现方式 | 局限性 |
|---|---|---|
| 分隔符标签 | 外部数据被包裹在 `` 标签中 | 复杂的 payload 可能会逃逸出分隔符上下文 |
| System/User 分离 | 信任 system prompt 中的指令,信任 user message 中的数据 | 无法阻止所有的上下文混合 |
| 模型自我报告 | 指示 LLM 标记检测到的注入尝试 | 软控制 — 模型可能会被欺骗 |
| 分析师警告横幅 | 在 notebook 输出中直观地显示注入标志 | 取决于分析师是否阅读了警告 |
**任何缓解措施都无法替代人类分析师在根据输出采取行动前的审查。**
此工具随附于以下研究论文:
## 提交前
每次提交前必须清除单元格输出:
```
jupyter nbconvert --clear-output --inplace notebook/osint_report.ipynb
```
## 授权声明
仅查询您被授权研究的目标。数据的公开可用性并不意味着您被授权收集或分析它。本工具仅供授权的威胁情报研究、安全评估和教育演示使用。
## 路线图
- [x] WHOIS 查询(域名 WHOIS + 通过 ipwhois 进行 IP RDAP)
- [x] 具有 async 并发分发至 11 个源的 FastAPI 后端
- [x] 带有实时扫描 pipeline UI 的 React 前端
- [x] 通过 Claude API 生成 AI 分诊报告(结构化 JSON — 判定结论、置信度、MITRE、TLP)
- [x] 三部分置信度评分(源数据质量、模型确定性、加权整体)
- [x] AlienVault OTX 集成
- [x] GreyNoise 集成
- [x] AbuseIPDB 集成(365 天时间窗口)
- [x] Shodan 集成(端口、CVE)
- [x] MalwareBazaar 集成
- [x] URLhaus 集成
- [x] CIRCL Passive DNS 集成
- [x] VirusTotal Passive DNS 与 communicating-file 回退机制
- [x] ThreatFox 集成
- [x] GitHub 搜索与 proxy-list 相关性过滤
- [x] 输入类型自动检测(IP / 域名 / 哈希 / URL / 电子邮件)
- [x] 批量分析端点(`POST /api/analyze/batch`,通过信号量限制为 10 个并发)
- [x] **营销活动分析** — 具有基础设施角色分类的多 IOC 相关性评估
- [x] 营销活动模式 UI — textarea 输入、模式切换、分组基础设施卡片视图
- [x] 演示营销活动 — 预加载了 Banking Phishing Kit 和 Cobalt Strike C2 Cluster 示例
- [x] 准确度基准测试 — 40 目标真值数据集,precision/recall/FPR/FNR 评估
- [x] Sources 选项卡中可点击的源链接
- [x] JSON 和 PDF 报告导出
- [x] Prompt injection 演示与缓解
- [x] 部署在线演示 ([sentinel-osint-r7fv.onrender.com](https://sentinel-osint-r7fv.onrender.com))
- [ ] STIX 2.1 结构化报告输出
- [ ] v2 中集成 HaveIBeenPwned
- [ ] 营销活动历史 / 会话持久化
## 相关工作
- [OWASP Top 10 for LLM Applications 2025](https://owasp.org/www-project-top-10-for-large-language-model-applications/)
- [MITRE ATLAS — Adversarial Threat Landscape for AI Systems](https://atlas.mitre.org)
- Greshake et al. (2023) — *Not What You've Signed Up For: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection*
- Anthropic Prompt Engineering Guide — Input Validation and Injection Defense
## License
MIT — 详情请参阅 LICENSE 文件。
标签:AV绕过, DLL 劫持, FastAPI, GitHub, NoSQL, Python, TGT, 大语言模型, 威胁情报, 实时处理, 开发者工具, 攻防演练, 无后门, 逆向工具