marez8505/PhishHook
GitHub: marez8505/PhishHook
专业的Python邮件钓鱼分析工具包,可对.eml文件进行标头取证、URL去混淆、附件扫描和风险评分,帮助SOC分析师快速判断邮件是否为钓鱼尝试。
Stars: 0 | Forks: 0
# PhishHook 🎣
**邮件钓鱼分析工具包 — SOC 一级至二级取证**
[](https://www.python.org/)
[](LICENSE)
[](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去混淆, 代码生成, 威胁情报, 威胁检测, 安全规则引擎, 库, 应急响应, 开发者工具, 恶意软件扫描, 恶意附件检测, 渗透测试工具, 电子邮件取证, 社会工程学防御, 网络威胁分析, 网络安全, 邮件头分析, 邮件安全, 钓鱼邮件分析, 钓鱼防护, 隐私保护, 风险评分