onurtnc/iocforge
GitHub: onurtnc/iocforge
IOCForge 是一款从文本中自动提取 IOC 并结合六大威胁情报源进行并行查询与加权评分的命令行富化工具。
Stars: 0 | Forks: 0
# IOCForge
**从文本中提取 IOC,结合六大威胁情报源进行富化,并最终汇总为一个评分。**




只需提供事件报告、电子邮件或日志文件;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, 威胁情报, 开发者工具, 文本提取, 无后门, 聊天机器人, 自动化分析, 跨站脚本, 逆向工具