hsa555/IOC-Hunting
GitHub: hsa555/IOC-Hunting
一款命令行威胁狩猎工具,自动关联多个免费 OSINT 威胁情报来源,对 IP、URL、域名和文件哈希进行多源综合分析与风险评分。
Stars: 6 | Forks: 0
```
.·¨'`; ,.·´¨;\ ,. -, ,., ' .----------.
'; ;'\ '; ;::\ ,.·'´, ,'\ ;´ '· ., / /
; ;::'\ ,' ;::'; ,·'´ .·´'´-·'´::::\' .´ .-, ';\ / ______.'
; ;::_';,. ,.' ;:::';° ; ';:::\::\::;:' / /:\:'; ;:'\' / /_
.' ,. -·~-·, ;:::'; ' \·. `·;:'-·'´ ,' ,'::::'\'; ;::'; / '''--.
'; ;'\::::::::; '/::::; \:`·. '`·, ' ,.-·' '·~^*'´¨, ';::; '___ `.
; ';:;\;::-··; ;::::; `·:'`·, \' ':, ,·:²*´¨¯'`; ;::'; `'. |
':,.·´\;' ;' ,' :::/ ' ,.'-:;' ,·\ ,' / \::::::::'; ;::'; ) |
\:::::\ \·.'::::; ,·'´ ,.·´:::'\ ,' ,'::::\·²*'´¨¯':,'\:; ......-' /
\;:·´ \:\::'; \`*'´\::::::::;·'' \`¨\:::/ \::\' \ _..'`
`·\;' \::::\:;:·´ '\::\;' '\;' ' '------'''
' '`*'´' `¨'
```
# IOC Hunting
**作者:hsa5**
这是一款命令行威胁狩猎工具,可自动关联多种 OSINT 来源,以分析恶意的 **IP、URL 和哈希**。所使用的所有来源均为免费。
## 功能特点
- **两种分析模式**:
- **IP / URL / 域名模式**:多源关联(AbuseIPDB · VirusTotal · Shodan · Censys · URLhaus · GreyNoise)
- **哈希模式**:通过 VirusTotal + URLhaus + MalwareBazaar 分析文件(MD5, SHA1, SHA256)
- **自动检测**作为参数传入的目标类型(IPv4、IPv6、URL、域名或哈希)
- **综合威胁评分**(0–100),分为低 / 中 / 高 / 严重等级
- **深入的 VirusTotal 分析**:
- AV 引擎检测
- 众包 YARA Rules
- 众包 Sigma Rules
- 众包 IDS Rules
- 动态分析 - Sandbox 判定
- 众包上下文
- 通信文件与引用文件(IP 模式)
- 通过 Shodan(在无 API 密钥时回退至 InternetDB)和 Censys 查询 **开放端口和服务**
- **GreyNoise**:检测某 IP 是否正在主动扫描互联网 - 无需密钥(社区计划)
- **MalwareBazaar**:查询哈希的恶意软件家族、行为标签(`stealer`, `loader`, `ransomware`...)、传播方式及供应商情报 - 与 URLhaus 使用相同的密钥
- 在分析目标列表时,终端底部会显示**进度条**
- **本地文件哈希**:计算本地文件/目录的 SHA256,然后进行查询
- **目录扫描**:如果提供的是目录而非文件,则会处理其中的所有文件
- **结果缓存**:避免重复消耗 API 配额 - 可通过 `setup.py` 配置持续时间(默认 24 小时),启动时自动清理。提供 `--nocache` 选项以强制发起新请求
- **Google Dorks**(`--dorks` / 交互式提示):通过 SerpAPI 使用 Google 搜索开放网络上关于某 IP 的提及(论坛、GitHub 列表、CTI 报告)- 结果按 CTI 相关性排序(botnet, malware, phishing, APT…),自动排除已知的扫描器/黑名单
- **本地 Web 界面**(`--web`):浏览器中的暗色主题 UI,仅绑定至 127.0.0.1,具有 CSRF 保护,每个目标生成一个结果卡片,支持多目标点击导航及 JSON 下载
- **API 密钥加密**:Fernet/AES-128-CBC + PBKDF2-HMAC-SHA256(480,000 次迭代)
- **导出 JSON 和 CSV**:`--export rapport.json` 或 `--export rapport.csv`(根据扩展名自动识别)
- **静默模式**:`--quiet` 抑制所有输出,如果分数 ≥ 阈值(`--threshold N`,默认为 40)则返回退出码 `1` - 非常适合脚本和 pipeline
- **读取 stdin**:`--file -` 从 stdin 读取目标(`cat targets.txt | python3 main.py --file -`)
- 自动对目标进行**去重** - 文件中的重复项只会被处理一次
- **自动更新**:`update.py` 检查并应用来自 GitHub 的更新,并支持回滚
- **优雅的 Ctrl+C**:显示退出消息而不是 traceback
- 提供按来源划分的独立脚本,可单独使用
## 安装说明
```
cd IOCHunting
pip install -r requirements.txt
python3 setup.py
```
`setup.py` 用于配置 API 密钥和缓存持续时间(默认 24 小时)。首次启动时,它会提示是否**加密**密钥(Fernet/AES - 可选)。加密功能可随时在菜单中开启或关闭。重新运行该脚本即可修改配置。
## 来源与 API 密钥(均为免费)
| 来源 | 用途 | 是否需要密钥 | 链接 |
|--------|---------|-------------|------|
| AbuseIPDB | 滥用评分,社区报告 | 是 | https://www.abuseipdb.com/account/api |
| VirusTotal | 多 AV 扫描,YARA, Sigma, IDS, Sandbox | 是 | https://www.virustotal.com/gui/my-apikey |
| Shodan | 开放端口,CVEs,服务 | 可选* | https://account.shodan.io/ |
| Censys | 开放端口,详细服务 | 是 | https://app.censys.io/user/tokens |
| URLhaus | 恶意 URL,恶意软件哈希 | 是 | https://auth.abuse.ch/ |
| SerpAPI | Google Dorks - 网络提及(论坛,GitHub,CTI 报告) | 可选 | https://serpapi.com/ |
| GreyNoise | 互联网扫描 - 识别为合法、恶意或定向流量 | 无需* | https://www.greynoise.io/ |
| MalwareBazaar | 哈希的家族、标签、供应商情报 | 与 URLhaus 相同 | https://auth.abuse.ch/ |
*在没有 Shodan 密钥的情况下,该工具会自动使用 **Shodan InternetDB**(免费,无需密钥,可查端口/漏洞/主机名)。
*GreyNoise 可通过公共社区 endpoint 在无密钥状态下运行。
## 用法
### 主要分析(多源关联)
```
# 分析 IP - 自动检测
python3 main.py 1.2.3.4
# 分析 URL - 自动检测
python3 main.py https://malicious.example.com/payload
# 分析 hash - 自动检测 (MD5 / SHA1 / SHA256)
python3 main.py d41d8cd98f00b204e9800998ecf8427e
# 分析多个目标(接受 IP/URL 混合)
python3 main.py 1.2.3.4 5.6.7.8 https://example.com
# 分析域名 - 自动检测
python3 main.py evil.com
# 从文本文件(每行一个目标,# = 注释)
python3 main.py --file targets.txt
# 从 stdin
cat targets.txt | python3 main.py --file -
# 强制 hash 模式
python3 main.py --type hash abc123...
# 强制 IP/URL 模式
python3 main.py --type ip 1.2.3.4
# 按年份过滤 VirusTotal 文件
python3 main.py 1.2.3.4 --year 2025
python3 main.py 1.2.3.4 --year 2024,2025
# 将报告导出为 JSON 或 CSV
python3 main.py 1.2.3.4 --export rapport.json
python3 main.py 1.2.3.4 --export rapport.csv
# 静默模式(若分数 ≥ 40 则返回码为 1)
python3 main.py --quiet 1.2.3.4
python3 main.py --quiet --threshold 70 1.2.3.4
# 原始 JSON 输出(machine-readable)
python3 main.py 1.2.3.4 --json
# 强制 API 请求(忽略缓存)
python3 main.py 1.2.3.4 --nocache
# 同时显示 offline URLhaus payloads(默认为 online-only)
python3 main.py 1.2.3.4 --offline
# 启动本地 web 界面
python3 main.py --web
# Google Dorks(standalone)
python3 modules/googledorks_lookup.py 1.2.3.4
```
### 本地 Web 界面 (`--web`)
启动一个**只能从本地机器**(127.0.0.1)访问的 Flask 服务器。随后会在浏览器中打开 `http://127.0.0.1:`。
```
python3 main.py --web
# → 提供端口(默认为 5000,可通过 setup.py 配置)
# → 启动服务器并显示 URL
```
- 仅绑定至 127.0.0.1 - 绝不会暴露在网络中
- 每次提交均受 CSRF 保护(启动时生成 token)
- 彩色结果(ANSI → HTML),与终端显示一致
- **多目标**:支持多行文本区域(每行一个目标)或加载 `.txt` 文件
- 每个目标生成一个结果卡片,支持点击导航直接滚动至某张卡片
- `↓ JSON` 按钮可下载所有 JSON 格式的结果
- 左下角有固定的“滚动至顶部”按钮(滚动超过 300px 后出现)
- `localStorage` 中保留最近 10 次分析的历史记录
- 提供“忽略缓存”选项和年份过滤器
- 验证机制:如果同一行上有多个目标(以空格分隔)则会报错
### Google Dorks(网络提及)
通过 **SerpAPI** 发起 Google 搜索,以查找开放网络中关于该 IP 的提及:论坛、GitHub 列表、CTI 报告、分析文章等。
- **交互模式**:在多目标会话开始时,脚本会询问一次 `Lancer Google Dorks ?`(是否启动 Google Dorks?)。如果输入 `o`(是),Dorks 将在每次分析后自动运行,不再重复询问。
- **独立运行**:
```
python3 modules/googledorks_lookup.py 1.2.3.4
python3 modules/googledorks_lookup.py 1.2.3.4 --num 20
```
- **SerpAPI 密钥**:免费计划 = **每月 100 次请求**(每次分析消耗 5 次请求,并行启动:精确 IP 第 1-2 页 + 无排除项的 IP + filetype:txt 第 1-2 页)。通过 `python setup.py` 进行配置。
- **结果过滤**:IP 扫描器(ipinfo, AbuseIPDB, Shodan…)和黑名单会被自动排除。包含 CTI 关键词(botnet, malware, phishing, APT…)的结果会优先显示。
### 本地文件哈希(哈希模式)
哈希模式可以直接分析**本地文件** - 它会计算文件的 SHA256,然后通过 VirusTotal 和 URLhaus 进行查询。
```
# 通过交互式菜单 → 选择 "2 - Analyser un hash" → 选项 "2 - Hasher un fichier/répertoire"
python3 main.py --type hash
```
如果提供的是一个**目录**,其中的所有文件都将被计算哈希并进行分析。
### 交互式菜单(无参数)
```
python3 main.py
```
显示包含三种模式的主菜单:
- **1 - IP / URL**:直接输入、文件或目录
- **2 - Hash**:输入哈希或对文件进行哈希处理
- **w - Web 界面**:在浏览器中启动本地服务器
- **r - 返回**:在每个子菜单中均可使用,用于返回主菜单
### API 密钥配置
```
# 初始配置(仅需执行一次)
python3 setup.py
```
密钥以加密形式存储在 `~/.config/ioc_hunting/keys.json` 中。
解密 passphrase 可以通过以下三种方式提供:
#### 选项 1 - 交互式提示(推荐)
```
python3 main.py 1.2.3.4
```
每次启动时询问,从不存储。
✔ 不会暴露任何 passphrase。
✘ 每次新启动都需要输入。
#### 选项 2 - 内联变量(便捷,风险有限)
```
THREAT_HUNTING_PASSPHRASE='passphrase' python3 main.py 1.2.3.4
```
✔ 在同一会话中无需重复输入。
✘ 在 `/proc//environ` 中可见 - 在本地使用风险可忽略。
#### 选项 3 - 导出变量(最便捷)
```
export THREAT_HUNTING_PASSPHRASE='passphrase'
python3 main.py 1.2.3.4
python3 main.py 5.6.7.8 # pas besoin de la remettre
```
✔ 无需重复输入。
✘ 会被终端的所有 process 继承 - 应避免在共享服务器上使用。
## 自动检测模式(CLI)
当作为参数传入目标时,`main.py` 会自动识别它们:
| 格式 | 检测方式 |
|--------|-----------|
| `1.2.3.4` | IPv4 → AbuseIPDB · VT · Shodan · Censys · URLhaus · GreyNoise |
| `2001:db8::1` | IPv6 → 同上 |
| `evil.com` | 域名 → VT + URLhaus |
| `https://...` | URL → VT + URLhaus + AbuseIPDB(如适用,作用于主机 IP) |
| 32 位十六进制字符 (MD5) | 哈希 → VT + URLhaus |
| 40 位十六进制字符 (SHA1) | 哈希 → VT + URLhaus |
| 64 位十六进制字符 (SHA256) | 哈希 → VT + URLhaus |
如果所有目标都是哈希,则会自动激活哈希模式。否则,使用 IP/URL/域名模式。
## 独立脚本 (modules/)
每个来源都有一个可单独使用的独立脚本:
```
python3 modules/abuseipdb_lookup.py 1.2.3.4
python3 modules/virustotal_lookup.py 1.2.3.4
python3 modules/virustotal_lookup.py https://example.com --full
python3 modules/virustotal_lookup.py d41d8cd98f00b204e9800998ecf8427e
python3 modules/shodan_lookup.py 1.2.3.4
python3 modules/censys_lookup.py 1.2.3.4
python3 modules/urlhaus_lookup.py https://malicious.example.com
```
全部支持:`--file`, `--json`, `--export`, `--key`。
`virustotal_lookup.py` 还支持 `--full` 用于查询关系(通信文件等)。
## 项目结构
```
IOC Hunting/
├── main.py ← point d'entrée principal (corrélation + hash)
├── setup.py ← configuration et chiffrement des clés API
├── update.py ← mise à jour automatique depuis GitHub (avec rollback)
├── requirements.txt ← dépendances Python (pip install -r requirements.txt)
├── README.md
├── .internal/
│ └── config_loader.py ← chiffrement Fernet, lecture/écriture des clés
└── modules/
├── abuseipdb_lookup.py ← AbuseIPDB standalone
├── censys_lookup.py ← Censys standalone
├── googledorks_lookup.py ← Google Dorks via SerpAPI standalone
├── shodan_lookup.py ← Shodan standalone (+ InternetDB fallback)
├── urlhaus_lookup.py ← URLhaus standalone
└── virustotal_lookup.py ← VirusTotal standalone (IP / URL / Hash / --full)
```
## 输出示例 - IP 模式
如果目标在配置的缓存持续时间(默认 24 小时)内已被分析过,则结果将从缓存加载(不发起 API 调用):
```
IOC Hunting › 1.2.3.4 (cache)
```
```
════════════════════════════════════════════════════════════════════════
IOC Hunting › 1.2.3.4
Score de menace ████████████████░░░░ 80/100 [CRITIQUE]
Signaux détectés
· AbuseIPDB 100%
· VT 8 détections
· URLhaus online (2)
────────────────────────────────────────────────────────────────────────
Détails par source
AbuseIPDB score 100% | 121 rapports | APNIC (UA)
VirusTotal 8/91 moteurs | 1 suspects | Tags : scanner, vpn
Shodan 3 ports | 0 CVE(s)
Censys 6 ports
URLhaus is_host | online: 2 | botnet_cc
```
## 输出示例 - 哈希模式
```
════════════════════════════════════════════════════════════════════════
IOC Hunting - Hash › db349b97c37d22f5ea1d1841e3c89eb4
Score de menace ████████████████████ 95/100 [CRITIQUE]
Signaux détectés
· VT 67 détections
· YARA 5 match(es)
· Sandbox malicious (3)
· URLhaus référencé (offline)
· Famille: WannaCry
────────────────────────────────────────────────────────────────────────
URLhaus - Payload
Famille / Signature WannaCry
Type fichier exe
Taille 3723264 bytes
SHA256 ed01ebfbc9eb5bbea545af4d01bf5f1071661840...
────────────────────────────────────────────────────────────────────────
VirusTotal - Fichier
Détections 67/72 moteurs
...
Crowdsourced YARA Rules (5 matches)
Crowdsourced Sigma Rules critical: 2 high: 3
Dynamic Analysis Sandbox → malicious (WannaCry.Ransomware)
```
## 限制说明
- **VirusTotal 免费计划**:每分钟 4 次请求,每天 500 次。脚本在遇到频率限制(429)时会自动等待。连续分析多个哈希时,每个哈希之间需要约 16 秒的间隔。
- 此延迟**可通过 `python3 setup.py` 进行配置**(*Délai VirusTotal* 选项)。默认值:`16` 秒。
- 如果拥有 **VirusTotal 付费 API 密钥**(Premium),则需要将其调低 - 设置为 `0` 可完全消除请求之间的停顿。在任何情况下,遇到 429 时的自动退避机制都将保持激活。
- **Shodan 免费计划**:仅限通过 `/shodan/host/{ip}` 访问已索引的数据。若无密钥,将自动回退到 InternetDB。
- **AbuseIPDB**:每天 1,000 次请求(免费计划)。
- **Censys**:每月 250 次请求(免费计划)。
- **URLhaus**:免费计划没有官方限制,但建议合理使用。
## 依赖项
- **Python 3.10+**(类型注解中的 `set | None` 语法需要)
- `cryptography >= 41.0.0`(用于 API 密钥的 Fernet 加密)
所有其他依赖项(`urllib`, `json`, `argparse`, `hashlib`, `concurrent.futures`, `base64`, `re`, `getpass`)均属于 Python 标准库。
## 卸载说明
删除项目文件夹,然后删除由脚本生成的本地数据:
```
rm -rf ~/.config/ioc_hunting/
```
该文件夹包含 API 密钥(无论是否加密)、结果缓存以及设置(Web 端口、缓存持续时间、VirusTotal 延迟)。
*作者:hsa5*
标签:ESC4, IOC分析, OSINT, PB级数据处理, 威胁情报, 安全运维, 实时处理, 开发者工具, 逆向工具