onurtnc/iocforge

GitHub: onurtnc/iocforge

IOCForge 是一款从文本中自动提取 IOC 并结合六大威胁情报源进行并行查询与加权评分的命令行富化工具。

Stars: 0 | Forks: 0

# IOCForge **从文本中提取 IOC,结合六大威胁情报源进行富化,并最终汇总为一个评分。** ![Python](https://img.shields.io/badge/python-3.8%2B-blue) ![License](https://img.shields.io/badge/license-MIT-green) ![Dependencies](https://img.shields.io/badge/dependencies-none-brightgreen) ![Tests](https://img.shields.io/badge/tests-31%20passing-success) 只需提供事件报告、电子邮件或日志文件;IOCForge 会自动提取其中的 IP、域名、 URL、哈希值、CVE 以及钱包地址,通过 VirusTotal / AbuseIPDB / OTX / URLhaus / ThreatFox / GreyNoise 进行查询,并附带理由给出 **恶意 / 可疑 / 干净** 的判定结论。 它甚至不需要 `requests` —— 仅使用原生的 `urllib` 和 `sqlite3` 编写。 ## 为什么需要它? 在一次安全事件中通常会提取出 30 个 IOC,如果要在三个不同的网站上逐一手动查询, 将耗费半个小时。IOCForge 将这一切简化为一条命令;此外,它会对结果进行**缓存**, 绝不会因为重复查询同一指标而消耗您的免费 API 配额。 ## 功能特性 - **智能提取** — 能够识别经防御性处理的输入(如 `hxxp://evil[.]com`、`user[at]evil[dot]com`) - **类型识别** — IPv4/IPv6、域名、URL、MD5/SHA1/SHA256、电子邮件、CVE、比特币地址 - **噪声过滤** — 不会将 `rapor.docm`、`script.php` 等文件名误识别为域名;也不会对外网查询私有 IP - **六大情报源** — 其中三个无需 API 密钥即可工作,且所有源均为可选 - **加权评分** — 结合情报源可信度与多重验证加分机制,得出 0-100 的评分 - **SQLite 缓存** — 默认缓存 24 小时,可通过 `--cache-ttl` 自定义 - **并行查询** — 采用线程池,并为每个情报源设置独立的速率限制 - **高可用性** — 即使某个情报源崩溃,其余源仍能继续正常工作 - **五种输出格式** — 控制台、JSON、CSV、Markdown(便于直接粘贴至工单)、HTML ## 情报源 | 情报源 | API 密钥 | 支持的类型 | 免费额度 | |---|---|---|---| | **URLhaus** (abuse.ch) | 不需要 | url, domain, ip, md5, sha256 | 无限制 | | **ThreatFox** (abuse.ch) | 不需要 | url, domain, ip, md5, sha256 | 无限制 | | **GreyNoise** Community | 不需要 | ipv4 | 每日有限 | | **VirusTotal** v3 | `VT_API_KEY` | hash, ip, domain, url | 4 次请求/分钟 | | **AbuseIPDB** | `ABUSEIPDB_API_KEY` | ipv4, ipv6 | 1000 次查询/天 | | **AlienVault OTX** | `OTX_API_KEY` | hash, ip, domain, url | 额度宽裕 | 即使不配置任何 API 密钥也能运行 —— 在此情况下,将仅查询那三个无需密钥的情报源。 ## 安装说明 ``` git clone https://github.com//iocforge.git cd iocforge python -m iocforge --list-providers ``` 若要将其安装为系统命令,请执行:`pip install -e .` ### API 密钥 您可以通过以下三种方式之一提供(按优先级排序): ``` # 1) 环境变量 export VT_API_KEY="..." export ABUSEIPDB_API_KEY="..." # 2) 项目根目录下的 .env 文件 echo 'VT_API_KEY=...' >> .env # 3) iocforge.json(示例:iocforge.example.json) cp iocforge.example.json iocforge.json ``` ## 使用说明 ``` # 单一指标 python -m iocforge 45.155.205.233 # 从报告中提取 + 丰富 python -m iocforge -f samples/olay_raporu.txt --html rapor.html # 仅 IOC 列表(无查询) - 用于输入到 SIEM python -m iocforge -f log.txt --extract-only # 来自 stdin cat supheli.eml | python -m iocforge - # 对无 API key 的数据源进行快速扫描 python -m iocforge -f iocs.txt --free-only # 特定数据源 / 类型 python -m iocforge -f rapor.txt --providers VirusTotal,AbuseIPDB --types ipv4,domain # 可直接粘贴到 Ticket 的 Markdown 表格 python -m iocforge -f rapor.txt --markdown bulgular.md # CI:如果存在得分 75+ 的 IOC,则 exit 1 python -m iocforge -f iocs.txt --fail-on 75 --quiet ``` ### 输出示例 ``` ============================================================================== IOCForge - Tehdit Istihbarati Raporu ============================================================================== Toplam 18 gosterge | ZARARLI: 5 SUPHELI: 2 TEMIZ: 8 BILGI YOK: 3 ------------------------------------------------------------------------------ [ZARARLI] 45[.]155[.]205[.]233 tur: ipv4 skor: [#########.] 94/100 etiket: SSH, Brute-Force, Port Scan eslesen kaynaklar: AbuseIPDB, VirusTotal, GreyNoise ! AbuseIPDB: guven skoru %100, 4821 rapor, ulke: NL, ISP: Alsycon B.V. ! VirusTotal: 12/94 motor kotucul, 1 supheli ! GreyNoise: siniflandirma: malicious, son goruldu: 2026-07-29 [TEMIZ] 8[.]8[.]8[.]8 tur: ipv4 skor: [..........] 5/100 + GreyNoise: siniflandirma: benign (onbellek) ``` ### 结合 PhishTriage / NetSentry 使用 ``` # 直接对从钓鱼邮件中提取的 IOC 进行丰富 python -m phishtriage supheli.eml --iocs | cut -f2 | python -m iocforge - # 查询从 PCAP 中提取的域名 python -m netsentry capture.pcap --dns | awk '{print $4}' | python -m iocforge - ``` ## 评分机制是如何工作的? ``` skor = en_yuksek_kaynak_skoru * 0.6 + agirlikli_ortalama * 0.4 + coklu_dogrulama_bonusu (kaynak basina +8, en fazla +15) ``` 情报源权重(定义于 `enrich.py` 中,支持自定义): VirusTotal 1.0 · URLhaus 1.0 · ThreatFox 1.0 · AbuseIPDB 0.9 · OTX 0.8 · GreyNoise 0.7 | 评分 | 判定 | |---|---| | 75-100 | **恶意** — 建议封禁 | | 45-74 | **可疑** — 需分析师介入审查 | | 15-44 | **低风险** — 予以监控 | | 1-14 | **干净** | | 无记录 | **无信息** | ## 架构设计 ``` iocforge/ ├── extract.py Regex tabanli IOC cikarma, refang/defang, gurultu filtresi ├── http.py urllib sarmalayici: hiz siniri, yeniden deneme, hata yonetimi ├── cache.py SQLite onbellek (TTL'li) ├── config.py Anahtar yukleme: env > .env > config.json ├── enrich.py Paralel sorgu, agirlikli skorlama, karar uretimi ├── report.py Konsol / JSON / CSV / Markdown / HTML ├── cli.py argparse arayuzu └── providers/ ├── base.py Ortak arayuz (Provider, ProviderResult) ├── virustotal.py abuseipdb.py otx.py └── urlhaus.py threatfox.py greynoise.py ``` ### 添加新情报源 只需继承 `Provider` 类并实现 `_query` 方法即可: ``` from .base import Provider, ProviderResult from ..http import get_json class MyFeed(Provider): name = "MyFeed" requires_key = True key_env = "MYFEED_API_KEY" supports = ("ipv4", "domain") min_interval = 1.0 def _query(self, indicator, ioc_type): data = get_json(f"https://api.myfeed.io/v1/{indicator}", headers={"Authorization": self.api_key}, rate_key="myfeed", min_interval=self.min_interval) return ProviderResult( provider=self.name, indicator=indicator, found=bool(data.get("hits")), malicious=data.get("bad", False), score=int(data.get("score", 0)), labels=data.get("tags", []), detail=f"{data.get('hits', 0)} kayit", ) ``` 然后将其添加到 `providers/__init__.py` 中的 `ALL_PROVIDERS` 列表内。 ## 测试 ``` python -m unittest discover -s tests -v ``` 这 31 个测试**完全不需要网络访问** —— 所有提供程序均已被模拟(fake)类替换。 因此,即使在没有 API 密钥的 CI 环境中也能顺利运行。 ## 路线图 - [ ] 集成 MISP 与 OpenCTI - [ ] 支持 STIX 2.1 导出 - [ ] 接入被动 DNS(`passivetotal`、`securitytrails`)源 - [ ] 通过批量文件上传进行 VirusTotal 扫描 - [ ] `--watch` 模式:监控指定目录并自动查询新的 IOC ## 免责声明 本项目仅供防御安全使用。请遵守第三方 API 的使用条款;请注意,您查询的指标数据将会被发送至这些外部服务 —— 对于机密/高度敏感的 IOC,请务必遵循您所在机构的安全策略。 ## 许可证 MIT — 详情请参阅 [LICENSE](LICENSE)。
标签:Python, 威胁情报, 开发者工具, 文本提取, 无后门, 聊天机器人, 自动化分析, 跨站脚本, 逆向工具