aarondutton-grc/ioc-threat-feed-aggregator
GitHub: aarondutton-grc/ioc-threat-feed-aggregator
一款聚合多个公开威胁情报源的Python命令行工具,用于对IP、域名和URL进行批量安全检查与严重性判定。
Stars: 0 | Forks: 0
# IOC 威胁情报源聚合器
一款 Python 命令行工具,用于针对多个公共威胁情报源检查域名、IP 和 URL,并将结果聚合为统一的严重性判定结论。专为 SOC 分诊、事件响应支持以及第三方供应商风险评估工作流而设计。
## 威胁情报来源
| 情报源 | 提供商 | 检测内容 | IOC 类型 |
|---|---|---|---|
| **URLhaus** | Abuse.ch | 恶意软件分发主机和 URL(活跃的 Payload、释放器、加载器) | 域名、IP、URL |
| **Feodo Tracker** | Abuse.ch | 活跃的 C2 僵尸网络服务器(Emotet、QakBot、Dridex、TrickBot、BazarLoader) | 仅限 IP |
| **AlienVault OTX** | AT&T Cybersecurity | 社区威胁情报 Pulse —— 攻击活动归因、攻击者追踪 | 域名、IP |
URLhaus 和 Feodo Tracker 均由 [Abuse.ch](https://abuse.ch/) 运营,这是一个瑞士的非营利威胁情报平台。
## 功能特性
- **多情报源聚合** — 单条命令即可查询两个提供商和三个情报源
- **IOC 规范化** — 在查询情报源之前,自动解析 `IP:port`、完整 URL、纯 IP 和域名
- **严重性分级** — 针对每个情报源及总体结果给出 CRITICAL / HIGH / MEDIUM / LOW / CLEAN 判定
- **批量模式** — 接受包含多个 IOC 的文本文件并生成汇总表
- **适配 SIEM 的 JSON 输出** — `--json` 将纯 JSON 写入 stdout;所有诊断信息均输出到 stderr
- **报告生成** — `--report html` 生成独立的浏览器报告;`--report csv` 生成适用于 Excel 或日志接入的扁平文件
- **优雅降级** — 在没有提供 API 密钥时,会干净地跳过相关情报源而不会导致程序崩溃
- **情报源完整性警告** — 如果 Feodo 情报源加载的条目少于 50 个,则会发出警告(表明响应可能不完整或已过期)
## 支持的 IOC 格式
该工具在查询情报源之前会对以下所有内容进行规范化处理:
```
84.247.138.41 # plain IP
31.57.184.154:443 # IP:port → strips port, checks IP
evil.com # domain
https://evil.com/payload # full URL → extracts host for OTX/Feodo, sends full URL to URLhaus
```
## 安装与设置
### 1. 克隆并安装依赖
```
git clone https://github.com/aarondutton-grc/ioc-threat-feed-aggregator.git
cd ioc-threat-feed-aggregator
pip install requests python-dotenv tabulate colorama
```
### 2. 获取 API 密钥(均为免费)
| 密钥 | 获取途径 |
|---|---|
| `OTX_API_KEY` | [otx.alienvault.com](https://otx.alienvault.com) → Settings → API |
| `URLHAUS_API_KEY` | [auth.abuse.ch](https://auth.abuse.ch) → API Access |
### 3. 创建 `.env` 文件
在脚本所在的目录中创建一个 `.env` 文件:
```
OTX_API_KEY=your_otx_key_here
URLHAUS_API_KEY=your_urlhaus_key_here
```
密钥会在运行时通过 `python-dotenv` 自动加载。它们绝不会通过命令行传递。
## 使用方法
```
# 单个 IOC
python3 IOCThreatFeedAggregator.py -i 185.220.101.34
# 单个 IOC — JSON 输出(仅 stdout,stderr 保留在终端中)
python3 IOCThreatFeedAggregator.py -i evil.com --json
# 通过管道将 JSON 输出到文件
python3 IOCThreatFeedAggregator.py -i evil.com --json > result.json
# Bulk IOC 文件
python3 IOCThreatFeedAggregator.py -f indicators.txt
# Bulk 模式并生成 HTML 报告
python3 IOCThreatFeedAggregator.py -f indicators.txt --report html
# Bulk 模式并生成 CSV 报告
python3 IOCThreatFeedAggregator.py -f indicators.txt --report csv
# 调整 Bulk 模式下请求之间的延迟(默认:1.0s)
python3 IOCThreatFeedAggregator.py -f indicators.txt --delay 2.0
```
### 批量 IOC 文件格式
每行一个指标。以 `#` 开头的行将被视为注释。
```
# 已知恶意 IP
185.220.101.34
91.92.254.13
# Domains
evil.com
# IP:port(port 会被自动去除)
31.57.184.154:443
# 完整 URLs
https://malicious-site.ru/payload.exe
```
## 输出结果
### 终端(非 JSON 模式)
```
============================================================
Checking IOC: 89.185.81.112
============================================================
▶ OVERALL VERDICT: CRITICAL
IOC : 89.185.81.112
Checked : 2026-05-11T14:05:47.652137+00:00
╭──────────────────────────┬──────────┬───────┬──────────────────────────────────────────────────╮
│ Feed │ Severity │ Hit │ Key Details │
├──────────────────────────┼──────────┼───────┼──────────────────────────────────────────────────┤
│ URLhaus (Abuse.ch) │ CLEAN │ — miss│ note: Not found in URLhaus database │
│ Feodo Tracker (Abuse.ch) │ CLEAN │ — miss│ note: Not found in Feodo C2 blocklist │
│ AlienVault OTX │ CRITICAL │ ✓ HIT │ pulse_count: 50 | malware_families: SSH Brute... │
╰──────────────────────────┴──────────┴───────┴──────────────────────────────────────────────────╯
```
### JSON 输出
```
[
{
"ioc": "89.185.81.112",
"ioc_type": "ip",
"ioc_value": "89.185.81.112",
"timestamp": "2026-05-11T14:05:47.652137+00:00",
"overall": "CRITICAL",
"feed_results": [
{
"feed": "URLhaus (Abuse.ch)",
"hit": false,
"severity": "CLEAN",
"details": { "note": "Not found in URLhaus database" }
},
{
"feed": "Feodo Tracker (Abuse.ch)",
"hit": false,
"severity": "CLEAN",
"details": { "note": "Not found in Feodo C2 blocklist" }
},
{
"feed": "AlienVault OTX",
"hit": true,
"severity": "CRITICAL",
"details": {
"pulse_count": 50,
"malware_families": ["SSH Brute-Force"],
"country": "RU",
"asn": "AS207967 anton mamaev"
}
}
]
}
]
```
### 报告文件
| 格式 | 参数 | 内容 |
|---|---|---|
| HTML | `--report html` | 包含严重性徽章、各情报源详细信息行和汇总统计的独立浏览器报告 |
| CSV | `--report csv` | 扁平文件 —— 每个 IOC 对应每个情报源占据一行,适用于 Excel 或 SIEM 接入 |
报告将保存在工作目录中,文件名为 `ioc_report_YYYYMMDD_HHMMSS.html` / `.csv`。
## 严重性分级
### OTX(Pulse 数量)
| Pulse 数量 | 严重性 |
|---|---|
| 0 | CLEAN |
| 1 | LOW |
| 2–4 | MEDIUM |
| 5–9 | HIGH |
| 10+ | CRITICAL |
### URLhaus(活跃 URL 数量)
| 条件 | 严重性 |
|---|---|
| 无结果 | CLEAN |
| 仅包含已下线的 URL | HIGH |
| 包含任何活跃(在线)的 URL | CRITICAL |
### Feodo Tracker
任何匹配项均等于 **CRITICAL**(所有 Feodo 条目均为已确认活跃或近期活跃的 C2 服务器)。
### 总体判定
取所有返回了真实判定结果的情报源中的最高严重性级别。出错、被跳过或返回 N/A 的情报源不会影响总体得分。
## 关于 OTX Pulse 数量上下文的说明
高 OTX Pulse 数量表明该 IP 或域名已在许多社区威胁情报活动中被报告,但并不区分以下情况:
- **活跃的 C2 基础设施**(高置信度,需立即采取行动)
- **Tor 出口节点 / VPN 基础设施**(频繁被标记,视上下文而定)
- **蜜罐触发记录**(观察到该 IP 正在执行扫描 —— 属于威胁行为者的行为,而非托管恶意软件)
在升级处理之前,请务必查看详细输出中的 `pulse_names_sample` 和 `malware_families`。一个仅出现在 SSH 暴力破解蜜罐情报源中的 IP,其处置方式应不同于出现在知名恶意软件活动中的 IP。
## GRC / SOC 相关性
| 功能特性 | 对应场景 |
|---|---|
| 多情报源 IOC 分诊 | SOC 一级警报富化工作流 |
| 严重性分级 | 事件响应升级阈值和 Runbook 决策门控 |
| JSON stdout / stderr 分离 | SIEM 管道接入 (Splunk, Elastic, Chronicle) |
| CSV/HTML 报告输出 | 审计证据、桌面演练工件 |
| 供应商 IP 筛查 | 第三方风险评估 —— TPRM 尽职调查 |
| 批量文件模式 | 针对监控列表或 IP 黑名单的威胁狩猎 |
## 涉及的技能展示
- Python API 集成(REST、POST、认证头、错误处理)
- 威胁情报源消费(Abuse.ch、AlienVault OTX)
- 跨多种指标格式的 IOC 规范化
- 具有独立评分的多源数据聚合
- 通过 `python-dotenv` 进行安全凭证管理(CLI 或源代码中不暴露密钥)
- stdout/stderr 分离以实现适配流水线的输出
- 报告生成(独立的 HTML、扁平的 CSV)
- 契合 GRC 标准的输出设计(带时间戳、可审计、严重性分级)
## 依赖项
```
requests
python-dotenv
tabulate
colorama
```
安装:`pip install requests python-dotenv tabulate colorama`
## 作者
Aaron Dutton
许可证:MIT
标签:Abuse.ch, API安全, Botnet检测, C2服务器, DAST, Feodo Tracker, HTML报告, IOC检测, IP信誉, IP 地址批量处理, JSON输出, Python, SIEM集成, Triage, URLhaus, URL检测, 域名信誉, 威胁情报, 子域名暴力破解, 字符串匹配, 密码管理, 库, 应急响应, 开发者工具, 恶意软件分析, 无后门, 第三方风险管理, 网络信息收集, 网络安全, 聚合器, 自动化检测, 逆向工具, 隐私保护