marez8505/PhishHook

GitHub: marez8505/PhishHook

专业的Python邮件钓鱼分析工具包,可对.eml文件进行标头取证、URL去混淆、附件扫描和风险评分,帮助SOC分析师快速判断邮件是否为钓鱼尝试。

Stars: 0 | Forks: 0

# PhishHook 🎣 **邮件钓鱼分析工具包 — SOC 一级至二级取证** [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Tests: 107 Passed](https://img.shields.io/badge/tests-107%20passed-brightgreen.svg)](tests/) PhishHook 是一个专业级的 Python 工具包,用于分析 `.eml` 邮件文件以检测钓鱼尝试。它复现了 SOC 分析师每天在调查邮件威胁时执行的核心分析工作流程 — 邮件是机会性攻击和针对性攻击的首要初始访问向量。 ## 目录 - [什么是钓鱼?](#what-is-phishing) - [SPF、DKIM 和 DMARC 解析](#spf-dkim-and-dmarc-explained) - [常见钓鱼手法](#common-phishing-tactics) - [SOC 分析师如何调查钓鱼](#how-soc-analysts-investigate-phishing) - [PhishHook 功能](#phishhook-features) - [安装](#installation) - [快速开始](#quick-start) - [CLI 参考](#cli-reference) - [风险评分方法论](#risk-scoring-methodology) - [示例输出](#sample-output) - [项目结构](#project-structure) - [运行测试](#running-tests) - [Python API](#python-api) ## 什么是钓鱼? 钓鱼是一种社会工程攻击,攻击者发送伪装成可信实体的欺诈性邮件,诱骗收件人: - **泄露凭证** — 登录虚假门户 - **执行恶意软件** — 打开恶意附件 - **转移资金** — 商业邮件欺诈(BEC) - **提供敏感数据** — 税号、社保号码、信用卡号码 ### 邮件结构 钓鱼邮件会操纵邮件协议的多个层级: ``` ┌─────────────────────────────────────────────────────┐ │ ENVELOPE (SMTP) ← Attacker controls this │ │ MAIL FROM: attacker@evil.tk │ │ │ │ HEADERS (RFC 5322) ← Can be forged │ │ From: "PayPal" │ │ Reply-To: attacker@evil.tk │ │ Subject: URGENT: Verify your account │ │ │ │ BODY ← Social engineering │ │ "Click here immediately to avoid suspension..." │ │ paypal.com │ │ │ │ ATTACHMENTS ← Malware delivery │ │ Invoice.pdf.exe (double extension) │ │ Report.docm (macro-enabled Office) │ └─────────────────────────────────────────────────────┘ ``` **关键攻击技术:** | 技术 | 描述 | |-----------|-------------| | 显示名称欺骗 | `"PayPal Security" ` — 真实姓名,虚假地址 | | 域名相似 | `paypa1.com`、`micosoft.com`、`paypal-secure.tk` | | 同形异义攻击 | 西里尔字母 **а**(U+0430)与拉丁字母 **a** 看起来完全相同 | | URL 缩短服务 | `bit.ly/3xAbCd` 隐藏真实的恶意目标 | | 双扩展名 | `invoice.pdf.exe` — Windows 默认隐藏最后一个扩展名 | | 宏启用的 Office 文件 | `.docm/.xlsm` 文件包含自动执行的 VBA 宏 | ## SPF、DKIM 和 DMARC 解析 这三种邮件认证机制构成了反欺骗防御的基础。 ### SPF — 发件人策略框架 SPF 允许域名公布哪些 IP 地址被授权代表其发送邮件。当邮件服务器收到消息时,它会检查发送 IP 是否列在该域名的 DNS TXT 记录中(来自 `MAIL FROM` 信封发件人)。 ``` # DNS: example.com TXT 记录 v=spf1 ip4:192.0.2.0/24 include:sendgrid.net ~all ─────────────── ─────────────────── ─── Authorized IPs Authorized provider Softfail (not in list) ``` **SPF 结果:** | 结果 | 含义 | 风险 | |--------|---------|------| | `pass` | 发送 IP 已获授权 | 安全 | | `fail` | 发送 IP 明确被拒绝 | 高风险 — 可能是伪造的 | | `softfail` | 未获授权但未被拒绝 | 中等风险 | | `none` | 无 SPF 记录 | 低至中等 | | `neutral` | 域名未做任何声明 | 低风险 | **局限性:** SPF 检查的是 `MAIL FROM` 地址,而不是可见的 `From:` 标头。攻击者可以使用自己的域名通过 SPF,同时显示伪造的友好名称。 ### DKIM — 域名密钥识别邮件 DKIM 为外发邮件添加加密签名。发送服务器使用私钥对选定的标头和邮件正文进行签名。接收服务器使用 DNS 中发布的公钥验证此签名。 ``` DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=mail; h=from:to:subject:date; bh=; b= ``` - 如果 **DKIM 通过**:邮件标头和正文自签名服务器发送以来未被篡改 - 如果 **DKIM 失败**:邮件在传输过程中被篡改(伪造标头、内容修改) - 如果 **DKIM 不存在**:发送域名不对外发邮件进行签名(对大品牌来说可疑) ### DMARC — 基于域名的消息认证、报告和一致性 DMARC 基于 SPF 和 DKIM 构建: 1. 要求 SPF 或 DKIM 与可见的 `From:` 域名**对齐** 2. 指定对齐失败时采取什么操作(`none`、`quarantine` 或 `reject`) 3. 向域名所有者提供报告 ``` # DNS: _dmarc.paypal.com TXT 记录 v=DMARC1; p=reject; rua=mailto:dmarc@paypal.com; pct=100 ────── Reject any mail failing DMARC (strongest protection) ``` **DMARC 对齐:** 来自 `security@paypal-secure-notifications.tk` 的邮件即使通过了 `paypal-secure-notifications.tk` 的 SPF,也会因 DMARC 对齐失败,因为该域名与 `From:` 标头中的 `paypal.com` 不匹配。 ## 常见钓鱼手法 ### 1. 紧迫性和恐惧 制造时间压力以阻止理性分析: ### 2. 冒充权威 声称来自可信权威: - **CEO/高管欺诈(BEC)**:"你好,我是 CEO。立即电汇 5 万美元。" - **IT 服务台**:"IT 部门:重置您的密码 — 检测到可疑登录。" - **政府机构**:IRS 退税、法律执法威胁。 ### 3. 品牌欺骗 冒充主要品牌(Microsoft、PayPal、Amazon、Apple、Google),使用: - 合法登录页面的视觉克隆 - 相似域名:`paypa1-secure.xyz`、`microsofft-secure.ru` - 同形异义攻击:`раурal.com`(西里尔字母 р 和 а) ### 4. 凭证窃取 将受害者引向虚假登录页面: - URL 显示文本与实际 href 不匹配:链接显示 `paypal.com` 但 href 是 `evil.tk/login` - IP 地址 URL:`http://185.220.101.47/microsoft/verify` - 凭证路径指示符:`/login`、`/verify`、`/account`、`/signin` ### 5. 恶意软件投递 - **宏启用的 Office 文档**(`.docm`、`.xlsm`):自动执行 VBA 宏 - **双扩展名**:`invoice.pdf.exe` — 收件人看到 "invoice.pdf" - **ZIP 压缩包**:将可执行文件隐藏在压缩包中以绕过邮件过滤器 - **加密/打包的有效载荷**:高熵文件可规避签名检测 ### 6. 商业邮件欺诈(BEC) 针对组织的针对性攻击: - **虚假发票欺诈**:来自相似域名供应商的发票 - **电汇欺诈**:"CEO" 请求紧急电汇 - **工资单转移**:"HR" 要求工资单将直接存款更新为攻击者的账户 ## SOC 分析师如何调查钓鱼 当报告钓鱼邮件时,一级 SOC 分析师遵循以下分类流程: ### 步骤 1:保存邮件 以 `.eml` 格式(原始 MIME)保存邮件,以保留所有标头和元数据。切勿仅截图。 ### 步骤 2:标头分析 ``` From: "PayPal" Return-Path: Received: from mail.phish-infra.ru ([185.220.101.47]) Received-SPF: fail (185.220.101.47 not authorized for paypal.com) Authentication-Results: spf=fail; dkim=none; dmarc=fail ``` 检查: - **SPF 结果** 在 `Received-SPF` 标头中 - **DKIM 存在** 在 `DKIM-Signature` 标头中 - **DMARC 结果** 在 `Authentication-Results` 中 - **中继链** 在 `Received` 标头中 — 追踪发送 IP - **From 与 Return-Path** 不匹配 - **Reply-To** 标头指向攻击者控制的地址 ### 步骤 3:URL 分析 提取所有 URL。检查: - 显示文本与实际 href 是否匹配? - 域名是否是相似域名(同形异义、 typosquat)? - 是否是隐藏目标的 URL 缩短服务? - 域名是否有可疑的 TLD(`.tk`、`.xyz`、`.ru`)? - 是否有凭证窃取路径(`/login`、`/verify`)? **不要点击链接。** 使用 VirusTotal、URLScan.io 或沙箱分析等工具。 ### 步骤 4:附件分析 如果存在附件: - 检查文件扩展名与魔术字节(它实际上是什么?) - 是否启用宏(`.docm`、`.xlsm`)? - ZIP 是否包含可执行文件? - 熵值是否异常高(加密/打包)? **不要打开附件。** 提交到沙箱(Cuckoo、ANY.RUN、Joe Sandbox)。 ### 步骤 5:内容分析 - 是否存在紧迫性/威胁短语? - 引用了哪些?发件人域名是否匹配? - 是否在索要凭证? - 是否有非母语英语钓鱼的语法特征? ### 步骤 6:判定和升级 | 分数 | 判定 | 操作 | |-------|---------|--------| | 0–30 | 可能安全 | 记录并关闭 | | 31–60 | 可疑 | 升级到二级进行更深入调查 | | 61–100 | 可能是钓鱼 | 阻止发件人/域名,通知受影响用户,提取 IOC | ### IOC 提取 记录妥协指标: - 发件人 IP 地址 - 恶意域名和 URL - 附件的文件哈希(MD5/SHA256) - 邮件主题和发件人地址 - DKIM 签名域名 ## PhishHook 功能 | 模块 | 功能 | |--------|-----------| | `email_parser.py` | RFC 5322 `.eml` 解析、MIME 提取、附件解码 | | `header_analyzer.py` | SPF/DKIM/DMARC 解析、中继链分析、欺骗检测 | | `url_analyzer.py` | URL 提取、同形异义检测、缩短服务检测、IP 在 URL 中、显示文本不匹配 | | `attachment_analyzer.py` | 魔术字节验证、双扩展名检测、宏检测、熵分析 | | `content_analyzer.py` | 紧迫性/威胁关键词、品牌欺骗、凭证窃取模式、语法启发式 | | `risk_scorer.py` | 加权 0–100 评分引擎,带置信度估计和证据链 | | `report_generator.py` | 深色主题 HTML 取证报告 + JSON 输出 | ## 安装 **要求:** Python 3.8+、Jinja2 ``` git clone https://github.com/edwardmarez/phishhook.git cd PhishHook pip install -r requirements.txt ``` 或作为包安装: ``` pip install -e . ``` ## 快速开始 **生成示例邮件:** ``` python sample_emails/generate_samples.py ``` **运行演示:** ``` python -m phishhook demo ``` **分析单个邮件:** ``` python -m phishhook analyze --email sample_emails/phishing_urgent.eml ``` **生成取证 HTML 报告:** ``` python -m phishhook report --email sample_emails/phishing_credential.eml --output ./reports/ ``` ## CLI 参考 ### `analyze` — 分析单个邮件 ``` python -m phishhook analyze --email suspicious.eml [--verbose] [--output results.json] ``` | 标志 | 描述 | |------|-------------| | `--email, -e` | `.eml` 文件路径(必需) | | `--verbose, -v` | 显示所有发现,包括低严重级别 | | `--output, -o` | 将 JSON 结果保存到文件 | ### `scan-dir` — 扫描目录 ``` python -m phishhook scan-dir --path ./inbox/ [--output results.json] ``` | 标志 | 描述 | |------|-------------| | `--path, -p` | 递归扫描 `.eml` 文件的目录 | | `--output, -o` | 保存 JSON 扫描结果 | ### `report` — 生成取证报告 ``` python -m phishhook report --email suspicious.eml --format html,json --output ./reports/ ``` | 标志 | 描述 | |------|-------------| | `--email, -e` | `.eml` 文件路径 | | `--format, -f` | `html`、`json` 或 `html,json`(默认:两者) | | `--output, -o` | 输出目录(默认:`./phishhook_reports`) | ### `demo` — 演示模式 ``` python -m phishhook demo [--report] [--verbose] ``` | 标志 | 描述 | |------|-------------| | `--report, -r` | 为每个示例生成 HTML/JSON 报告 | | `--verbose, -v` | 显示所有发现 | ## 风险评分方法论 PhishHook 使用跨四个分析类别的加权评分系统: ``` Total Score = Headers (0–25) + URLs (0–30) + Attachments (0–25) + Content (0–20) = 0–100 ``` ### 标头评分(最高 25 分) | 发现 | 分数 | |---------|--------| | SPF 硬失败 | 10 | | SPF SoftFail | 5 | | SPF 缺失 | 2 | | DKIM 签名不存在 | 5 | | DKIM 签名失败 | 10 | | DMARC 失败 | 8 | | 显示名称欺骗 | 10 | | From/Return-Path 不匹配 | 7 | | Reply-To 不匹配 | 5 | | 缺少 Message-ID | 3 | ### URL 评分(最高 30 分) | 发现 | 分数 | |---------|--------| | 同形异义/IDN 攻击 | 15 | | IP 地址作为主机名 | 10 | | 显示文本 URL 不匹配 | 10 | | 凭证窃取路径 | 8 | | URL 缩短服务 | 8 | | Data URI 方案 | 5 | | 高风险 TLD | 5 | ### 附件评分(最高 25 分) | 发现 | 分数 | |---------|--------| | 危险文件扩展名(.exe、.ps1 等) | 15 | | ZIP 压缩包中的可执行文件 | 12 | | 双扩展名(invoice.pdf.exe) | 10 | | 宏启用的 Office 文档 | 10 | | 魔术字节/扩展名不匹配 | 8 | | 高香农熵 | 7 | ### 内容评分(最高 20 分) | 发现 | 分数 | |---------|--------| | 品牌欺骗 | 8 | | 钓鱼域名模式 | 10 | | 紧迫性/账户威胁语言 | 8 | | 威胁语言(法律行动、执法) | 6 | | 冒充权威 | 5 | | 凭证窃取语言 | 5 | | 金钱诱惑 | 4 | ### 判定阈值 | 分数 | 判定 | 建议操作 | |-------|---------|-------------------| | 0–30 | **可能安全** | 记录并关闭;如有进一步疑虑则审查 | | 31–60 | **可疑** | 升级;通过其他渠道与发件人核实 | | 61–100 | **可能是钓鱼** | 阻止发件人/域名;通知收件人;提取 IOC | ### 置信度级别 置信度反映有多少独立信号类别支持该判定: | 活跃类别 | 置信度 | |-----------------|------------| | 0(干净邮件) | 高 | | 1 | 低 | | 2 | 中等 | | 3+ | 高 | ## 示例输出 ### 终端输出(phishing_urgent.eml) ``` ┌──────────────────────────────────────────────────────────┐ │ PhishHook Analysis Result │ └──────────────────────────────────────────────────────────┘ Subject: URGENT: Your PayPal account will be suspended within 24 hours From: PayPal Security Date: Fri, 15 Nov 2024 09:22:45 +0000 VERDICT LIKELY PHISHING SCORE 75/100 [Confidence: high] Score Breakdown: Headers ████████████████████████ 25/25 URLs ████████████████████████ 30/30 Attachments ░░░░░░░░░░░░░░░░░░░░░░░░ 0/25 Content ████████████████████████ 20/20 Authentication: SPF: FAIL DKIM: MISSING DMARC: FAIL Findings: (17 total) [CRITICAL] Credential harvesting language detected (6 matches) [CRITICAL] Possible PayPal brand impersonation [CRITICAL] Phishing domain pattern: 'paypal-' in sender domain [HIGH ] SPF hard FAIL — sending IP not authorized [HIGH ] DMARC policy FAILED (p=reject) [HIGH ] Display-text URL mismatch (paypal.com → paypa1-secure.xyz) [HIGH ] Credential-harvesting path in URL (/verify/login) [HIGH ] Urgency language (7 matches) [HIGH ] Threat language (legal action, unauthorized access) Evidence Chain: › SPF: FAIL › DKIM: no signature › DMARC: FAIL › 3 URLs found ``` ### JSON 报告(摘录) ``` { "phishhook_version": "1.0.0", "generated_at": "2024-11-15T09:22:45", "email": { "subject": "URGENT: Your PayPal account will be suspended within 24 hours", "from": "PayPal Security ", "date": "Fri, 15 Nov 2024 09:22:45 +0000" }, "verdict": { "verdict": "LIKELY PHISHING", "total_score": 75, "confidence": "high", "score_max": 100 }, "scores": { "headers": {"score": 25, "max": 25}, "urls": {"score": 30, "max": 30}, "attachments": {"score": 0, "max": 25}, "content": {"score": 20, "max": 20} }, "authentication": { "spf": "fail", "dkim_present": false, "dkim_result": null, "dmarc": "fail", "dmarc_policy": "reject" } } ``` ## 项目结构 ``` PhishHook/ ├── phishhook/ │ ├── __init__.py # Package exports │ ├── __main__.py # python -m phishhook entry point │ ├── main.py # CLI: analyze, scan-dir, report, demo │ ├── email_parser.py # RFC 5322 .eml parsing │ ├── header_analyzer.py # SPF/DKIM/DMARC, relay chain, spoofing │ ├── url_analyzer.py # URL extraction and risk analysis │ ├── attachment_analyzer.py # File type, macro, entropy analysis │ ├── content_analyzer.py # NLP-style body analysis │ ├── risk_scorer.py # Weighted 0–100 scoring engine │ ├── report_generator.py # HTML + JSON forensic reports │ └── utils.py # Shared utilities ├── indicators/ │ ├── suspicious_tlds.json # High/medium-risk TLD lists │ ├── phishing_keywords.json # Urgency/threat/credential keyword sets │ ├── brand_patterns.json # Brand impersonation patterns │ └── known_shorteners.json # URL shortener domains ├── sample_emails/ │ ├── generate_samples.py # Generates all 5 sample .eml files │ ├── phishing_urgent.eml # PayPal urgency phish (score: 75) │ ├── phishing_invoice.eml # Fake invoice with .docm attachment (score: 53) │ ├── phishing_credential.eml# Microsoft credential harvest (score: 75) │ ├── legitimate_newsletter.eml # Clean newsletter (score: 5) │ └── legitimate_receipt.eml # Clean receipt (score: 0) ├── tests/ │ ├── __init__.py │ ├── test_header_analyzer.py # 30 tests │ ├── test_url_analyzer.py # 28 tests │ ├── test_content_analyzer.py # 31 tests │ └── test_risk_scorer.py # 18 tests ├── requirements.txt # jinja2 only ├── setup.py ├── LICENSE # MIT └── README.md ``` ## 运行测试 ``` # 运行所有 107 个测试 python -m pytest tests/ -v # 运行特定的测试模块 python -m pytest tests/test_header_analyzer.py -v # 带覆盖率运行(如果安装了 pytest-cov) pip install pytest-cov python -m pytest tests/ --cov=phishhook --cov-report=term-missing ``` 预期输出: ``` ============================= 107 passed in 0.19s ============================== ``` ## Python API PhishHook 可用作 Python 库,集成到 SOAR 平台、工单系统或自定义脚本中。 ``` from phishhook.email_parser import EmailParser from phishhook.header_analyzer import HeaderAnalyzer from phishhook.url_analyzer import URLAnalyzer from phishhook.attachment_analyzer import AttachmentAnalyzer from phishhook.content_analyzer import ContentAnalyzer from phishhook.risk_scorer import RiskScorer from phishhook.report_generator import ReportGenerator # 解析邮件 parser = EmailParser() parsed = parser.parse_file("suspicious.eml") # 运行所有分析器 header_result = HeaderAnalyzer().analyze(parsed) url_result = URLAnalyzer().analyze(parsed) attachment_result = AttachmentAnalyzer().analyze(parsed) content_result = ContentAnalyzer().analyze(parsed) # 评分 score = RiskScorer().score( parsed, header_result, url_result, attachment_result, content_result ) print(f"Verdict: {score.verdict}") print(f"Score: {score.total_score}/100") print(f"SPF: {header_result.auth.spf_result}") # 生成报告 gen = ReportGenerator() saved = gen.save_report( score, output_dir="./reports/", formats=["html", "json"], header_result=header_result, url_result=url_result, ) print(f"HTML report: {saved['html']}") ``` ## 展示的 SOC 技能 PhishHook 展示了以下一级至二级 SOC 能力: - **邮件标头取证** — 追踪中继链、提取认证结果 - **邮件认证分析** — 解读 SPF/DKIM/DMARC 以检测欺骗 - **URL 分析** — 解码混淆的 URL、检测同形异义攻击、缩短服务 - **恶意软件分类** — 文件类型验证、宏检测、熵分析 - **威胁情报** — 针对已知钓鱼指标进行模式匹配 - **指标提取** — 系统性收集 IP、域名、URL、文件哈希 - **基于风险的优先级排序** — 加权评分以实现高效的警报分类 - **取证文档** — 结构化 HTML/JSON 报告用于事件记录 ## 许可证 MIT 许可证 — 版权所有 (c) 2024 Edward Mareed。详见 [LICENSE](LICENSE)。 *PhishHook 是一个用于教育和专业用途的取证分析工具。结果应由合格分析师审查。此工具不会建立网络连接或解析 URL。*
标签:AMSI绕过, DKIM验证, DMARC验证, Python安全工具, SOC分析工具, SPF验证, URL去混淆, 代码生成, 威胁情报, 威胁检测, 安全规则引擎, 库, 应急响应, 开发者工具, 恶意软件扫描, 恶意附件检测, 渗透测试工具, 电子邮件取证, 社会工程学防御, 网络威胁分析, 网络安全, 邮件头分析, 邮件安全, 钓鱼邮件分析, 钓鱼防护, 隐私保护, 风险评分