neetas21/IOC-Extractor-Threat-Intelligence-Enrichment-Tool
GitHub: neetas21/IOC-Extractor-Threat-Intelligence-Enrichment-Tool
从非结构化文本中自动提取 IP、域名、URL、哈希等 IOC 指标并与威胁情报源交叉比对以输出风险评分的工具。
Stars: 0 | Forks: 0
# 🔍 IOC 提取器与威胁情报富化工具
从任何非结构化文本( Incident 报告、钓鱼邮件、恶意软件沙箱输出)中提取 compromise 指标 (IOC) —— IP、域名、URL、文件哈希和电子邮件地址,然后将每项与威胁情报源进行交叉比对,以标记已知的高风险恶意指标并给出风险评分。
## 为什么开发这个项目
阅读威胁报告并手动挑出每一个 IP、域名和哈希来与威胁情报进行核对,不仅速度慢而且容易出错——这正是 SOC 分析师每天要重复几十次的提取工作。该工具自动化了提取步骤和富化查询,输出的不再是满屏的非结构化文本,而是一张带有风险评分的表格。
## 提取内容
| IOC 类型 | 方法 |
|---|---|
| IPv4 地址 | 正则表达式,验证字节范围 |
| 域名 | 正则表达式,包括电子邮件地址中的域名(见下文注释) |
| URL | 正则表达式,`http(s)://` 模式 |
| 文件哈希 | 正则表达式,通过确切长度区分(MD5=32,SHA1=40,SHA256=64 位十六进制字符) |
| 电子邮件地址 | 正则表达式 |
## 开发过程中发现并修复的一个真实 Bug
第一个版本排除了出现在电子邮件地址中的任何域名,以避免重复计算。针对真实的钓鱼报告进行测试时发现了这个问题:在域名提取中排除 `support@paypa1-secure.com` 意味着**发件人的域名——钓鱼案例中最重要的指标——从未被纳入威胁情报进行比对**。
修复方法是提取文本中出现的所有域名,包括电子邮件地址内的域名。记录下此事是为了提醒大家:“避免重复”和“不要漏掉最重要的指标”可能会发生冲突,而在安全工具中,后者优先。
## 项目结构
```
ioc-threat-intel/
├── data/
│ ├── generate_threat_feed.py # builds the synthetic threat intel watchlist
│ ├── threat_feed.csv # 21 known-malicious IPs/domains/hashes
│ └── sample_reports/
│ ├── incident_report_1.txt # phishing incident with embedded IOCs
│ └── routine_report_2.txt # benign report, used to check for false positives
├── src/
│ ├── ioc_extractor.py # regex-based IOC extraction
│ └── enrichment.py # cross-reference against threat feed + risk scoring
├── app.py # Streamlit dashboard
└── requirements.txt
```
## 运行方式
```
pip install -r requirements.txt
python data/generate_threat_feed.py
streamlit run app.py
```
然后从下拉菜单中选择两个示例报告之一,或者粘贴你自己的文本(一封真实的钓鱼邮件、一篇 CVE 分析文章,或任何包含 IP/域名/哈希的内容)。
## 结果
针对两个示例报告进行了测试:
- **钓鱼事件报告**:正确地将提取出的 7 个 IOC 中的 5 个标记为恶意(2 个 IP,2 个域名,1 个哈希),总体风险 = 高
- **常规/良性报告**:正确地将 0 个 IOC 标记为恶意,总体风险 = 无 —— 证实该工具不会对正常活动产生过度标记
## 诚实的局限性
威胁情报源是合成的(21 个手动挑选的条目),因此它只能“检测”出我植入的精确指标——这并不能反映真实的检测覆盖率。在实际部署中需要接入真实的情报源。
基于正则表达式的提取也并不完美:除非进行明确处理,否则它无法捕获混淆或“去武器化 (defanged)”的 IOC,例如 `185[.]220[.]101[.]7` 或 `hxxps://` 链接(这是分析人员在分享报告时为防止 IOC 被意外点击而采用的一种常见惯例——值得将其作为预处理步骤添加进来)。
## 如何接入真实的威胁情报源
`enrichment.py` 需要一个包含 `indicator, type, threat_type, confidence` 列的 CSV 文件 —— 任何真实的情报源都可以映射为此格式:
- **AbuseIPDB**(免费层,需要 API 密钥):通过其 REST API 查询 IP,将 `abuseConfidenceScore` 映射到 `confidence` 列
- **VirusTotal**(免费层,需要 API 密钥):通过其 REST API 查询哈希/域名,将检测率映射到 `confidence`
- **AlienVault OTX**(免费,需要 API 密钥):从公开的“pulses”中提取 IOC,并按此 schema 导出
为了保持本项目在无需任何外部账号即可独立运行,这里没有添加上述任何服务,但它们是很自然的下一步计划。
## 未来改进
- 添加“去武器化/重新武器化 (defang/refang)”预处理步骤以捕获混淆的 IOC
- 在配置项的控制下,接入真实的威胁情报 API(见上文)
- 添加 PDF/电子邮件 (.eml) 文件上传功能,取代仅支持粘贴文本的输入方式
- 将富化结果导出为 CSV/JSON 报告,以便接入工单系统
标签:IOC提取, Kubernetes, 威胁情报, 安全运营, 开发者工具, 扫描框架, 自动化分析, 跨站脚本, 逆向工具