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)** [![Python](https://img.shields.io/badge/Python-3.11+-blue)](https://python.org) [![FastAPI](https://img.shields.io/badge/Backend-FastAPI-009688)](https://fastapi.tiangolo.com) [![React](https://img.shields.io/badge/Frontend-React-61DAFB)](https://react.dev) [![Claude](https://img.shields.io/badge/LLM-Anthropic%20Claude-orange)](https://anthropic.com) [![License](https://img.shields.io/badge/License-MIT-green)](LICENSE) ## 截图 ### 单个 IOC 分析 提交任意 IP、域名、文件哈希或 URL,即可获得一份包含风险评分、WHOIS 数据以及 GitHub 辅助情报的完整多源分诊报告。 ![单个 IOC 分析 — 185.220.101.45 被标记为 CRITICAL 95/100,附带 WHOIS 和 GitHub 情报](https://raw.githubusercontent.com/sethporter903/sentinel-osint/main/screenshots/single-ioc-analysis.png) ### AI 分诊报告 Claude 将所有源数据综合为一份结构化判定结论,包含三部分置信度细分、支持与冲突的证据,以及 MITRE ATT&CK 映射。 ![AI 分诊报告 — MALICIOUS 判定,96% 数据质量,87% 模型确定性,92% 整体置信度](https://raw.githubusercontent.com/sethporter903/sentinel-osint/main/screenshots/ai-triage-report.png) ### 营销活动分析 提交一组相关指标,即可获得统一的营销活动级判定、共享模式提取,以及按角色分组的指标基础设施映射图。 ![营销活动分析 — Cobalt Strike C2 集群,COORDINATED MALICIOUS 置信度 98%,显示 C2 IP 和 malleable C2 域名的基础设施映射图](https://raw.githubusercontent.com/sethporter903/sentinel-osint/main/screenshots/campaign-analysis.png) ## 概述 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, 大语言模型, 威胁情报, 实时处理, 开发者工具, 攻防演练, 无后门, 逆向工具