harryc295/threat-intel-aggregator

GitHub: harryc295/threat-intel-aggregator

基于多个免费威胁情报 API 的 Python CLI 工具,实现 IP、域名和文件哈希的批量富化、风险评分及可视化报告生成。

Stars: 0 | Forks: 0

# 威胁情报聚合器 一个使用**仅免费 API 层级**来丰富 IP、域名和文件哈希的 Python CLI。 结果将缓存 24 小时以保护速率限制,并写入结构化的 JSON 报告,以及一个独立的 HTML 仪表板。 ## 使用的免费服务 | 服务 | 免费额度 | 需要 Key | |---|---|---| | VirusTotal | 500 次请求/天 · 4 次请求/分钟 | 是 | | Shodan | 100 查询额度/月 | 是 | | AbuseIPDB | 1,000 次请求/天 | 是 | | ip-api.com | 45 次请求/分钟(仅限非商业用途) | **否** | | python-whois | 无限(公共 WHOIS 服务器) | **否** | ## 获取免费 API Key 的分步指南 ### 1. VirusTotal(500 次请求/天,4 次请求/分钟) 1. 前往 并点击 **Join us**。 2. 填写您的电子邮件和密码,并验证您的电子邮件地址。 3. 登录后,点击您的头像 → **API key**(或前往您的个人资料页面)。 4. 复制 *Personal API key* 下方显示的 **API key**。 5. 将其粘贴到您的 `.env` 文件中,格式为 `VIRUSTOTAL_API_KEY=`。 ### 2. Shodan(100 查询额度/月) 1. 前往 并创建一个账户。 2. 注册后,访问 并滚动到 **API Key**。 3. 复制该 key。 4. 将其粘贴到您的 `.env` 文件中,格式为 `SHODAN_API_KEY=`。 ### 3. AbuseIPDB(1,000 次请求/天) 1. 前往 并创建一个免费账户。 2. 验证您的电子邮件后,登录并访问 **Account → API**。 3. 点击 **Create Key**,为其命名(例如 "threat-intel"),然后复制该 key。 4. 将其粘贴到您的 `.env` 文件中,格式为 `ABUSEIPDB_API_KEY=`。 ### 4. ip-api.com — 无需 key ip-api.com 对于非商业用途是免费的,每分钟最多 45 次请求,且无需注册。 只需使用该工具;速率限制会自动处理。 ### 5. WHOIS — 无需 key 域名的 WHOIS 数据是通过 `python-whois` 库获取的,该库直接查询公共 WHOIS 服务器。不需要账户或 key。 ## 安装说明 ``` # 克隆 / 下载项目 cd threat-intel-aggregator # 创建并激活虚拟环境(推荐) python -m venv .venv # Windows PowerShell: .venv\Scripts\Activate.ps1 # macOS / Linux: source .venv/bin/activate # 安装依赖 pip install -r requirements.txt # 复制示例 env 文件并填入你的密钥 copy .env.example .env # Windows # cp .env.example .env # macOS / Linux # 然后打开 .env 并将占位符值替换为你的真实 API 密钥 ``` ## 使用说明 ### 丰富单个 IOC ``` # IPv4 地址 python cli.py --ioc 185.220.101.34 # 域名 python cli.py --ioc malware-c2.example.com # 文件哈希 (MD5、SHA-1 或 SHA-256) python cli.py --ioc 44d88612fea8a8f36de82e1278abb02f ``` ### 从 JSON 文件丰富 IOC 列表 创建一个文件 `iocs.json`: ``` ["185.220.101.34", "malware-c2.example.com", "44d88612fea8a8f36de82e1278abb02f"] ``` 然后运行: ``` python cli.py --input-file iocs.json ``` ### 自定义输出路径 ``` python cli.py --ioc 8.8.8.8 --output-json results.json --output-html results.html ``` ### 从现有报告生成仪表板 ``` python dashboard.py report_20240611_120000.json dashboard.html ``` ## 输出 ### JSON 报告 (`report_.json`) 每个条目包含: - `ioc` – 原始指标 - `ioc_type` – `ip`、`domain` 或 `hash` - `risk_score` – 计算得出的 0-100 综合评分 - `enrichments` – 来自每个服务(virustotal、shodan、abuseipdb、geolocation、whois)的嵌套结果 - `resolved_ip` –(仅限域名)域名在查询时解析到的 IP ### HTML 仪表板 (`dashboard_.html`) 一个独立的单文件,包含: - 摘要卡片:总 IOC 数、高 / 中 / 低风险计数、平均分 - 所有丰富 IOC 的可搜索、可排序表格 - 颜色编码行:红色 = 高风险 (≥70),黄色 = 中等风险 (30-69),绿色 = 低风险/干净 - 按 IOC 类型和风险级别过滤 - 查看时无需互联网连接(没有外部 CDN) ## 缓存 所有 API 响应都会作为 JSON 文件缓存在 `.cache/` 目录中,TTL 为 24 小时。 相同的 IOC 在 24 小时内不会被再次查询,从而保护您的每日和每月免费额度。要强制进行全新查找,请从 `.cache/` 中删除相关文件或清空整个目录。 ## 速率限制行为 | 服务 | 强制限制 | 策略 | |---|---|---| | VirusTotal | 4 次请求/分钟 | 令牌桶;休眠直到有可用令牌 | | Shodan | 1 次请求/2 秒(保守) | 令牌桶 | | AbuseIPDB | 30 次请求/分钟(保守) | 令牌桶 | | ip-api.com | 45 次请求/分钟 | 令牌桶 | 在收到 **429 Too Many Requests** 响应时,工具会等待 60 秒并在放弃前重试一次。所有错误都会在丰富结果中作为 `{"error": "..."}` 返回,以便继续处理剩余的 IOC。 ## 环境变量 | 变量 | 服务 | 必需 | |---|---|---| | `VIRUSTOTAL_API_KEY` | VirusTotal | 是 | | `SHODAN_API_KEY` | Shodan | 是 | | `ABUSEIPDB_API_KEY` | AbuseIPDB | 是 | 如果缺少 key,会导致相应的丰富函数返回 `{"error": "... not set"}`,处理将继续进行 —— 您仍会获得来自其他服务的结果。 ## 项目结构 ``` . ├── cli.py # CLI entry point (argparse) ├── enricher.py # All API query functions + unified enrich() ├── dashboard.py # HTML dashboard generator ├── cache.py # File-based TTL cache ├── ratelimiter.py # Token-bucket rate limiters ├── requirements.txt ├── .env.example ├── README.md └── .cache/ # Auto-created; stores cached API responses (git-ignored) ``` ## 免责声明 本工具旨在用于您有权调查的基础设施的**防御性安全研究和威胁分析**。请尊重每个服务的服务条款。免费层级适用于个人、非商业和研究用途 —— 请勿将此工具用于批量商业情报收集。
标签:API集成, GitHub, Python, 代码示例, 可观测性, 威胁情报, 实时处理, 开发者工具, 数据分析, 无后门, 逆向工具