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级数据处理, 威胁情报, 安全运维, 实时处理, 开发者工具, 逆向工具