zavetsec/ZavetSec-MailInspector

GitHub: zavetsec/ZavetSec-MailInspector

一款轻量级离线邮件安全分析工具,用于解析 .eml 和 .msg 邮件,检测钓鱼攻击和恶意附件,并生成可直接用于封堵的 IOC 和报告。

Stars: 1 | Forks: 0

![ZavetSec MailInspector](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/335188c10e162843.svg) # ZavetSec‑MailInspector **解析 `.eml` 和 `.msg` 邮件,检测网络钓鱼和恶意附件。** 单文件,几乎零依赖。输出判定结果、可直接用于封堵的 IOC 列表以及独立的 HTML 报告。 ![Python](https://img.shields.io/badge/python-3.8%2B-00ff88?style=flat-square&logo=python&logoColor=0a0d10&labelColor=0d1117) ![License](https://img.shields.io/badge/license-MIT-00ff88?style=flat-square&labelColor=0d1117) ![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-00ff88?style=flat-square&labelColor=0d1117) ![Report](https://img.shields.io/badge/report-offline%20%2F%20zero%20external%20refs-00ff88?style=flat-square&labelColor=0d1117) ![Use](https://img.shields.io/badge/use-defensive%20DFIR%20%2F%20SOC-00ff88?style=flat-square&labelColor=0d1117)
## 为什么需要它 abuse 邮箱里总会堆满转发的 `.eml` 和 `.msg` 邮件,L1 分析师需要快速判断:这封邮件是无害的、可疑的,还是一次正在发生的攻击。MailInspector 承担了初步筛查的工作,并给出可直接采取行动的判定结果,以及只需直接导入封堵系统的 IOC 列表。 - **两种格式,一个工具。** `.eml` (RFC822) 和 `.msg` (Outlook)。 - **随处运行。** 仅凭 Python 标准库即可处理 `.eml`。 - **默认离线。** 不使用 `--online` 参数,绝不会有任何数据外传。 - **报告不会向外联网。** HTML 中没有任何外部链接——没有 CDN、字体或追踪器。可以放心地在隔离主机上打开它,以解析恶意攻击者的邮件内容。 - **融入自动化。** 输出 JSON 及适用于 pipeline 的合理退出码。 ## 报告预览
![HTML-报告 MailInspector](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/1ea3ddbfd3162848.png) *独立的 HTML 报告:判定结果、带权重的指标、IOC 模块及邮件路由。无需联网即可打开。*
## 工作原理 ``` ┌─────────────┐ │ .eml / .msg │ └──────┬──────┘ ▼ ┌──────────┐ stdlib email · extract-msg │ Parser │ заголовки · тело · вложения └────┬─────┘ ▼ ┌──────────────────────┐ AUTH · HEADER · URL │ Detectors │ BODY · ATTACH · (TI) └──────────┬───────────┘ ▼ ┌───────────┐ взвешенные severity │ Scoring │ → CLEAN / SUSPICIOUS / MALICIOUS └─────┬─────┘ ▼ ┌────────────────────────────────┐ │ HTML-отчёт · JSON · список IOC │ + код возврата └────────────────────────────────┘ ``` ## 检测内容 | 层级 | 检查项 | |------|----------| | **身份验证** | SPF / DKIM / DMARC 结果 · `Received` 链及源 IP | | **发件人伪造** | From ↔ Return‑Path ↔ Reply‑To 不一致 · display‑name 中包含他人邮箱 · display‑name 中仿冒品牌 · **仿冒政府机构**(部委、委员会、俄/哈等国部门)使用非政府域名 · Message‑ID 域名不匹配 | | **URL** | 链接文本与 href 指向不符 (link spoofing) · 指向裸 IP 的链接 · 通过 `user:pass@` 混淆主机 · punycode / IDN 同形异义词 · **混合字符集(Latin + Cyrillic/Greek)—— 同形异义攻击 (homoglyph)** · 短链接 · 廉价及滥用型 TLD · 子域名中的品牌名 · `data:` / `javascript:` 协议 | | **正文** | 双语(RU + EN)社会工程学手法评分 · tracking‑pixel · 隐藏文本 · 邮件内嵌 HTML 表单 | | **附件** | MD5 / SHA‑1 / SHA‑256 · **根据 magic bytes 判断的真实类型与扩展名不符** · 危险及双重扩展名 · **VBA 宏检测**(auto‑exec / 可疑,通过 `oletools`) · **Shannon 上下文熵**(加壳/混淆 payload) · **加密压缩包** (ZIP / RAR / 7z) 及**与邮件正文密码的匹配** | | **递归压缩包** | **解压并重扫内部文件**(内存中处理 ZIP / TAR / GZIP;通过可选库处理 7z / RAR),深度达 3 层 · **防御 zip‑bomb**(限制深度、文件数、体积预算、compression‑ratio) · 每个内部文件都会经过全套检测器检测,其哈希值也会被纳入 IOC | | **QR 码 (quishing)** | 解码**图片和 PDF** 附件中的 QR 码(OpenCV / PyMuPDF),并将提取出的链接通过所有 URL 检测器——可抓出隐藏在 QR 码中以绕过文本过滤器的钓鱼 URL | | **威胁情报** | *可选* 通过 MalwareBazaar 和 ThreatFox 检查 SHA‑256 (`--online`) | | **输出** | 风险评分 → 判定 · 无重复的 IOC(域名 / IP / URL / e‑mail / 哈希) · 传递路由 | ### 递归分析压缩包 恶意软件几乎从来不会以裸 `.exe` 文件形式出现——它们会藏在压缩包里。MailInspector 会在内存中解压容器,并对每个内部文件重新运行所有检测器,因此即使是埋在 zip 中的 zip 里的 `.exe` 也会被挖出来,并附带完整路径:
![递归解压压缩包](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/323cddebdc162855.png)
深度、文件数、每个文件的体积以及总预算都受到限制,并辅以 compression‑ratio 控制:zip‑bomb 不会被解压,而是会被拦截并在报告中标记。内存解压同时彻底消除了 zip‑slip 漏洞隐患。 ### Quishing —— 通过 QR 码进行钓鱼 为了向文本过滤器隐藏链接,钓鱼者越来越多地将其以 QR 码图片的形式植入。MailInspector 可解码图片附件和 PDF 中的 QR 码,并将提取出的链接通过同样的 URL 检测器进行扫描——检测结果会标记为 `[来自 QR]`:
![Quishing 检测](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/2fedf6b1b4162901.png)
如果 QR 码包含的链接指向与发件人域名不一致的域名,风险等级将提升至 MEDIUM;合法的 QR 码(票据、指向自身域名的 2FA)将保持低干扰噪音。 ## 安装 ``` git clone https://github.com/zavetsec/ZavetSec-MailInspector.git cd ZavetSec-MailInspector # 对于 .eml 完全不需要任何依赖。 # 用于解析 .msg、检测宏以及在线 TI: pip install -r requirements.txt ``` | 依赖 | 作用 | 是否必需? | |-------------|----------|--------------| | `extract-msg` | 解析 Outlook `.msg` | 否 | | `oletools` | 分析 Office 附件中的 VBA 宏 | 否 | | `requests` | 在线威胁情报 (`--online`) | 否 | | `py7zr` | 7‑Zip 递归 | 否 | | `rarfile` | RAR 递归(以及更好的 RAR 加密检测) | 否 | | `opencv-python-headless` | QR 码解码 (quishing) | 否 | | `pymupdf` | 扫描 PDF 附件中的 QR 码 | 否 | 如果缺少某个库,工具不会崩溃——只会提示跳过了哪些检测。 ## 快速开始 ``` # 单封邮件 → HTML + JSON python ZavetSec-MailInspector.py suspicious.eml -o report.html -j result.json # 递归遍历整个 quarantine / abuse 文件夹 python ZavetSec-MailInspector.py ./abuse-inbox/ -o ./reports/ # Outlook 邮件,提取附件至沙箱 python ZavetSec-MailInspector.py message.msg --dump ./attachments/ # 启用基于哈希的信誉检查(附件哈希发送至 MB/ThreatFox) python ZavetSec-MailInspector.py invoice.eml --online -o report.html ``` 使用代码库中的示例进行测试: ``` python ZavetSec-MailInspector.py examples/sample_phish.eml -o demo.html ``` ## 输出示例 ``` ┌────────────────────────────────────────────────────────────────────── │ ZavetSec-MailInspector v1.3 │ sample_phish.eml [EML] └────────────────────────────────────────────────────────────────────── From : СберБанк Безопасность Subject : Подозрительный вход в ваш аккаунт Auth : SPF=fail DKIM=fail DMARC=fail URLs : 4 Attachments: 1 VERDICT: MALICIOUS (score 100/100) [HIGH] URL: Текст ссылки не совпадает с реальным адресом (link spoofing) [HIGH] URL: Ссылка ведёт на IP-адрес, а не на домен [HIGH] ATTACH: Двойное расширение файла (Уведомление_СберБанк.pdf.exe) [MEDIUM] HEADER: Имя отправителя имитирует бренд «сбербанк» [MEDIUM] URL: Бренд «сбербанк» в поддомене, но не в основном домене [MEDIUM] URL: Сокращатель ссылок (реальная цель скрыта) [MEDIUM] BODY: Триггеры социальной инженерии (13) ... ``` HTML 报告包含所有指标、完整的链接和附件表格、邮件路由以及可一键复制的 IOC 模块。全部采用 ZavetSec 的暗色终端风格,并且完全独立离线(参见上方的[预览](#превью-отчёта))。 ## CLI 选项 | 选项 | 功能 | |-------|------------| | `target` | `.eml` / `.msg` 文件或用于递归遍历的目录 | | `-o, --html PATH` | 保存 HTML 报告(如果是目录,则保存到报告文件夹) | | `-j, --json PATH` | 将结果保存为 JSON | | `--dump DIR` | 将附件提取到 `DIR`(命名为 `sha256_文件名` 形式) | | `--online` | 通过 MalwareBazaar 和 ThreatFox 进行检查(**哈希值将被外发**) | | `--no-color` | 控制台输出不使用 ANSI 颜色 | | `--quiet` | 不打印每一个指标 | ### 退出码 | 代码 | 含义 | 操作建议 | |-----|------------|------| | `0` | clean | 无需处理 | | `1` | suspicious / likely malicious | 交由分析师排查 | | `2` | malicious | 升级处理 / 自动隔离 | 对于目录,将返回批次中最严重邮件的代码——非常适合挂载到邮件网关的 hook 上,或用于定时解析 abuse 邮箱。 ## 评分机制 每个指标都有自己的严重性(`INFO` → `CRITICAL`)和权重。各项权重在同类目中会进行边际递减累加——十几个低危的 URL 本身并不会大幅推高最终判定——并且最高得分为 100 分。 | 分数 | 判定结果 | |------|---------| | `0 – 17` | **CLEAN** | | `18 – 39` | **SUSPICIOUS** | | `40 – 69` | **LIKELY MALICIOUS** | | `70 – 100` | **MALICIOUS** | 阈值以及关键字、品牌和 TLD 列表都位于脚本开头——您可以根据自己的环境进行修改,而无需变动核心逻辑。 ## 融入 SOC **自动解析 abuse 邮箱**:生成报告,将 JSON 提供给 SIEM,并根据退出码对邮件进行分发处理: ``` for f in /var/spool/abuse/*.eml; do python ZavetSec-MailInspector.py "$f" \ -o "/var/www/reports/$(basename "$f").html" \ -j "/var/log/mailinspect/$(basename "$f").json" --quiet rc=$? [ "$rc" -eq 2 ] && mv "$f" /var/spool/abuse/malicious/ done ``` JSON 中包含所有指标、IOC、附件哈希和邮件路由——可将其导入关联分析引擎,根据哈希进行封堵,或加入 watchlist。 ## 设计与 OPSEC - **报告中没有外部链接。** 邮件中的 URL 会以纯文本形式显示,而不是可点击的 ``/``。您可以放心地在隔离主机上打开报告。 - **默认离线优先。** 威胁情报需手动开启(`--online`);若不开启,机器绝不会有任何数据外传。 - **仅使用系统字体。** 不从外部加载任何内容——报告在离线状态下依然显示正常且保持完全独立。 ## 构建独立二进制文件 对于没有 Python 环境的分析师,可以构建可移植的独立构件(脚本位于 [`build/`](build/)): ``` # 跨平台单文件 zipapp(AV 不会标记,体积小巧) make pyz # или: build/build.sh pyz # Windows .exe(PyInstaller)——保持在内部,通过 EDR 中的 SHA-256 进行 allowlist build\build.ps1 ``` ## Roadmap - [ ] 校验 **ARC** 链(验证 `Authentication-Results` 是否能在各路由跳之间保留) - [ ] 检测 **S/MIME 和 PGP** —— 是否有签名、是否有效、签名者是否与发件人匹配 - [ ] 对附件进行 YARA 扫描(基于规则文件) - [ ] 将 IOC 导出为 **STIX 2.1**,并为批量扫描生成汇总仪表板 **v1.1 实现:** 附件的上下文熵检测 · 加密压缩包及其与正文密码的匹配。 **v1.2 实现:** 递归解压压缩包(ZIP / TAR / GZIP / 7z / RAR),具备防御 zip‑bomb 机制,并对内部嵌套文件进行全面重扫。 **v1.3 实现:** quishing 检测 —— 解码图片和 PDF 中的 QR 码,并分析提取出的链接。 ## 免责声明 MailInspector 是一款供拥有相关邮件解析授权的分析师使用的**防御性**工具。它属于静态分析,不能替代沙箱爆裂测试或完整的逆向工程。本工具按“原样”提供,不提供任何担保——参见 [LICENSE](LICENSE)。
**ZavetSec** · ZavetSec DFIR 工具包的一部分 基于 [MIT 许可证](LICENSE) 发布
标签:DAST, Python, 威胁情报, 开发者工具, 恶意软件分析, 数字取证, 无后门, 自动化脚本, 逆向工具, 邮件分析, 钓鱼检测