mtayeb89/IOC-Scanner

GitHub: mtayeb89/IOC-Scanner

一款零依赖的 Python DFIR/威胁狩猎工具,可递归扫描目录中的文件,通过哈希比对和正则匹配发现恶意域名、IP、密钥、令牌等多种危害指标并生成 JSON/CSV 报告。

Stars: 2 | Forks: 0

# IOC Scanner 一款用于 **DFIR(数字取证与事件响应)** 和 **威胁狩猎** 的 Python 命令行工具,可递归扫描文件夹以查找 **危害指标**。 ## **版权所有 (c) Mahmoud Eltayeb** ## 检测内容 | IOC 类型 | 描述 | |---|---| | **可疑哈希** | 将 MD5 / SHA1 / SHA256 文件哈希与已知的恶意哈希列表进行比对 | | **已知恶意域名** | 将文本中发现的域名与域名黑名单进行比对 | | **IP 地址** | 在日志、配置文件或脚本中发现的 IPv4 地址 | | **电子邮件地址** | 标准的电子邮件地址模式 | | **比特币钱包** | 旧版 (`1...`)、P2SH (`3...`) 和 Bech32 (`bc1...`) BTC 地址 | | **API keys** | 通用样式的 `api_key=`、`secret_key=`、`access_token=`、`auth_token=` 赋值 | | **AWS keys** | AWS Access Key IDs (`AKIA…` / `ASIA…`) 以及 40 个字符的 AWS Secret Access Keys | | **JWT tokens** | JSON Web Tokens (`eyJ...`.`eyJ...`.`signature` 格式) | 扫描器会**递归**遍历目标目录,对每一个可读文件进行哈希处理,并根据上述 regex 模式扫描基于文本的文件。任何与用户提供的“已知恶意”哈希或域名列表匹配的内容都将被标记为**已确认的匹配**。 ## 环境要求 - Python 3.8 或更高版本 - 无第三方依赖 — 仅使用 Python 标准库 (`hashlib`, `re`, `os`, `json`, `csv`, `argparse`, `dataclasses`, `pathlib`, `datetime`) ## 项目结构 ``` ioc-scanner/ ├── ioc_scanner.py # Main program (entry point) ├── README.md # This file ├── LICENSE # MIT license, copyright Mahmoud Eltayeb └── sample_data/ ├── bad_hashes.txt # Example known-bad hash list ├── bad_domains.txt # Example known-bad domain list └── test_folder/ └── connection.log # Example log file containing sample IOCs ``` ## 安装说明 除了需要安装 Python 3.8+ 外,无需进行其他安装。 ``` git clone cd ioc-scanner python3 ioc_scanner.py --help ``` ## 用法 ### 基础扫描 ``` python3 ioc_scanner.py /path/to/folder ``` 这将递归扫描文件夹,打印控制台摘要,并生成一个名为 `ioc_report_.json` 的 JSON 报告到当前目录。 ### 使用已知的恶意哈希和域名列表进行扫描 ``` python3 ioc_scanner.py /path/to/folder \ --bad-hashes sample_data/bad_hashes.txt \ --bad-domains sample_data/bad_domains.txt ``` 哈希和域名列表文件为纯文本,**每行一条记录**。以 `#` 开头的行将被视为注释并忽略。 ### 自定义输出路径 ``` python3 ioc_scanner.py /path/to/folder \ --output results/report.json \ --csv results/report.csv ``` ### 静默模式(无控制台摘要,仅写入文件) ``` python3 ioc_scanner.py /path/to/folder --quiet ``` ### 完整 CLI 参考 ``` python3 ioc_scanner.py --help ``` ``` positional arguments: target Path to the folder to scan (scanned recursively). options: -h, --help show this help message and exit --bad-hashes BAD_HASHES Path to a text file with known-malicious hashes (one per line) --bad-domains BAD_DOMAINS Path to a text file with known-malicious domains (one per line) --output OUTPUT, -o OUTPUT Path to write a JSON report --csv CSV Optional path to also write a CSV report --quiet, -q Suppress the console summary --version Show program's version number and exit ``` ## 示例 使用内置的示例数据: ``` python3 ioc_scanner.py sample_data/test_folder \ --bad-hashes sample_data/bad_hashes.txt \ --bad-domains sample_data/bad_domains.txt ``` 示例控制台输出: ``` ====================================================================== IOC SCANNER REPORT Copyright (c) Mahmoud Eltayeb ====================================================================== Target directory : sample_data/test_folder Started at : 2026-06-30T09:44:11+00:00 Finished at : 2026-06-30T09:44:11+00:00 Files scanned : 1 Files skipped : 0 Total findings : 9 ---------------------------------------------------------------------- Findings by type: ipv4 : 2 domain : 2 email : 1 btc_wallet : 1 aws_access_key : 1 generic_api_key : 1 jwt_token : 1 ---------------------------------------------------------------------- !!! 1 CONFIRMED MATCHES against known-bad lists !!! [domain] malicious-c2-server.example <- sample_data/test_folder/connection.log ====================================================================== [+] JSON report written to: ioc_report_20260630T094411Z.json ``` ## 输出格式 ### JSON 报告 ``` { "scan_target": "sample_data/test_folder", "started_at": "2026-06-30T09:44:11+00:00", "finished_at": "2026-06-30T09:44:11+00:00", "files_scanned": 1, "files_skipped": 0, "findings": [ { "ioc_type": "domain", "value": "malicious-c2-server.example", "file_path": "sample_data/test_folder/connection.log", "matched_blocklist": true } ] } ``` ### CSV 报告 | ioc_type | value | file_path | matched_blocklist | |---|---|---|---| | domain | malicious-c2-server.example | sample_data/test_folder/connection.log | True | ## 工作原理 1. **目录遍历** — `os.walk()` 递归访问目标文件夹下的每一个文件。 2. **哈希处理** — 每一个可读文件都会以 64 KB 为数据块同时流式传输通过 MD5、SHA1 和 SHA256 进行处理(无需将整个文件加载到内存中)。如果提供了 `--bad-hashes`,每个计算出的哈希值都会与黑名单集合进行比对。 3. **文本扫描** — 如果文件具有已知的二进制扩展名(`.exe`、`.zip`、`.png` 等)或超过 25 MB,则会在文本扫描时跳过;否则,其内容将被解码为 UTF-8(忽略错误),并与 `PATTERNS` 中的每个 IOC regex 模式进行匹配。 4. **黑名单关联** — 在文本中发现的域名会与 `--bad-domains` 进行比对;哈希值会与 `--bad-hashes` 进行比对。匹配项将被标记为 `matched_blocklist: true`。 5. **报告生成** — 结果会被汇总到 `ScanReport` 中,作为控制台摘要打印,并导出为 JSON(始终)以及可选的 CSV。 ## 限制与说明 - 这是一个**静态的、基于签名/regex 的**扫描器 — 它不执行沙箱处理、行为分析或 YARA 规则匹配。 - 基于 regex 的检测(尤其是通用的 API keys 和 AWS secret keys)可能会产生**误报**;在采取行动之前,请务必手动筛选排查结果。 - AWS Secret Access Key 模式会匹配任何 40 个字符的类 base64 字符串,这是刻意为之的宽泛设计 — 请结合上下文审查命中结果。 - 对于大型环境,请提供精选的、最新的威胁情报源(例如来自 MISP、AlienVault OTX 或 VirusTotal)作为 `--bad-hashes` / `--bad-domains` 的输入文件。 - 此工具仅读取文件;它不会修改、隔离或删除磁盘上的任何内容。 ## 扩展扫描器 该工具具有刻意的模块化设计: - 通过在 `ioc_scanner.py` 中的 `PATTERNS` 字典中添加条目来增加新的 IOC 类型。 - 通过扩展 `load_lines_as_set()` 并将其接入 `IOCScanner.__init__` 来添加新的黑名单来源。 - 通过编写新的 `write_*_report()` 函数来添加新的输出格式。 ## 许可证 该项目基于 MIT 许可证授权 — 详情请参阅 [LICENSE](LICENSE)。 **Copyright (c) Mahmoud Eltayeb**
标签:Python, Ubuntu, 库, 应急响应, 数字取证, 无后门, 自动化脚本, 逆向工具