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检测, 域名信誉, 威胁情报, 子域名暴力破解, 字符串匹配, 密码管理, 库, 应急响应, 开发者工具, 恶意软件分析, 无后门, 第三方风险管理, 网络信息收集, 网络安全, 聚合器, 自动化检测, 逆向工具, 隐私保护