SpoofScore
有人能通过电子邮件伪造你的域名吗?
具备评分、可伪造性判定以及可直接复制修复方案的 8 层电子邮件安全扫描器。
Made by bau1u
快速开始 •
8层检查 •
评分 •
对比竞品 •
用法
大多数电子邮件安全工具会问:*“你的 DNS 配置正确吗?”*
SpoofScore 提出了一个不同的问题:
只需一条命令。深入 8 个层级。给出一个明确的答案:**可伪造 (SPOOFABLE)** 或 **已防护 (PROTECTED)**。
## 演示
```
$ python spoofscore.py google.com
.-') _ (`-. ,-. .-. .-') ('-.
( OO ). ( (OO ) | | \ ( OO ) ( OO ).-.
(_)---\_)_.` \ .-'),-----. .-'),-----. ,------. | | ;-----.\ / . --. / ,--. ,--. .---. ,--. ,--.
/ _ |(__...--''( OO' .-. '( OO' .-. '('-| _.---' | | | .-. | | \-. \ | | | | /_ | | | | |
\ :` `. | / | |/ | | | |/ | | | |(OO|(_\ | | | '-' /_).-'-' | | | | | .-') | | | | | .-')
'..`''.)| |_.' |\_) | |\| |\_) | |\| |/ | '--. | | | .-. `. \| |_.' | | |_|( OO )| | | |_|( OO )
.-._) \| .___.' \ | | | | \ | | | |\_)| .--' | | | | \ | | .-. | | | | `-' /| | | | | `-' /
\ /| | `' '-' ' `' '-' ' \| |_) | | | '--' / | | | |(' '-'(_.-' | |(' '-'(_.-'
`-----' `--' `-----' `-----' `--' `-' `------' `--' `--' `-----' `---' `-----'
github.com/harrizuan/spoofscore
SpoofScore v2.0.0 Can someone impersonate your domain via email?
Scanning 1 domain...
[1/1] google.com
████████████████ 📡 Reputation
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
google.com (12.4s)
Score ██████████████░░░░░░ 70/100
Grade ▌▌▌ B ▐▐▐
Verdict ✓ PROTECTED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌────────────────────────────────────────────────────┐
│ 🔐 Layer 1 — DNS Authentication │
└────────────────────────────────────────────────────┘
MX Record ✓ smtp.google.com
SPF ~all (softfail)
v=spf1 include:_spf.google.com ~all
DMARC reject
Reporting mailto:mailauth-reports@google.com
DKIM ✓ selectors: 20230601, 20221208
┌────────────────────────────────────────────────────┐
│ 🔒 Layer 2 — SMTP/TLS Probing │
└────────────────────────────────────────────────────┘
STARTTLS Yes
TLS Version TLSv1.3
Cipher TLS_AES_256_GCM_SHA384
┌────────────────────────────────────────────────────┐
│ 📧 Layer 3 — Mail Platform │
└────────────────────────────────────────────────────┘
Provider Google
┌────────────────────────────────────────────────────┐
│ 🔗 Layer 4 — SPF Chain Analysis │
└────────────────────────────────────────────────────┘
DNS Lookups 1/10
Void Lookups 0/2
Chain Depth 1
┌────────────────────────────────────────────────────┐
│ 🛡️ Layer 5 — Transport & Reputation │
└────────────────────────────────────────────────────┘
MTA-STS ✓ RFC 8461
DANE/TLSA ✗ RFC 7672
BIMI ✗
TLS-RPT ✗
FCrDNS Verified sd-in-f27.1e100.net
RBL Status Clean 10 zones scanned
┌────────────────────────────────────────────────────┐
│ 📊 Layer 6 — Score Breakdown │
└────────────────────────────────────────────────────┘
DMARC ██████████ +30/30 p=reject
SPF ████████░░ +15/20 softfail
DKIM ██████████ +15/15
TLS ░░░░░░░░░░ +0/15 none
MTA-STS ██████████ +10/10
DANE/TLSA ░░░░░░░░░░ +0/10
────────────────────────────────────────────
TOTAL ██████████████░░░░░░ 70/100 B
✓ PROTECTED — DMARC enforcement blocks email spoofing
Completed in 12.4s
```
## 快速开始
```
pip install dnspython
python spoofscore.py example.com
```
就是这样。只有一个依赖项。无需配置文件。无需 API 密钥。
## 检查内容
| # | 层级 | 内容 | 方式 |
|---|-------|------|-----|
| 1 | **DNS 身份验证** | MX, SPF, DMARC, DKIM | 感知服务提供商的 DKIM,包含 80+ 个选择器 + 通配符测试 |
| 2 | **SMTP/TLS 探测** | STARTTLS, TLS 版本, 密码套件 | 通过 25 端口与邮件服务器建立实时连接 |
| 3 | **邮件平台** | 电子邮件服务提供商 | 根据 MX 主机名提取指纹 (Google, M365, SES, Zoho, ProtonMail, Mimecast) |
| 4 | **SPF 链分析** | 包含树遍历 | RFC 7208 10 次查询限制、无效查询限制、悬空包含检测 |
| 5 | **传输安全** | MTA-STS, DANE/TLSA, BIMI, TLS-RPT | 检查所有传输协议 (RFC 8461, RFC 7672) |
| 6 | **信誉度** | RBL/DNSBL 扫描 | 10 个主要的黑名单区域 (Spamhaus, SpamCop, Barracuda, SORBS, UCEPROTECT) |
| 7 | **基础设施** | FCrDNS, DMARC sp= | 正向确认反向 DNS + 子域名策略不匹配检测 |
| 8 | **综合评分** | 加权 0-100 | 提供可伪造性判定 + 可直接复制精确 DNS 记录的修复方案 |
## 评分模型
|
**积极信号**
| 组件 | 分数 |
|-----------|-------:|
| DMARC `p=reject` | **+30** |
| DMARC `p=quarantine` | +15 |
| DMARC `p=none` | +5 |
| SPF `-all` (硬失败) | **+20** |
| SPF `~all` (软失败) | +15 |
| 存在 DKIM | +15 |
| TLS 1.3 | +15 |
| TLS 1.2 | +10 |
| MTA-STS | +10 |
| DANE/TLSA | +10 |
|
**扣分项**
| 问题 | 分数 |
|-------|-------:|
| SPF `+all` (宽松) | **-10** |
| 被 RBL 列入黑名单 | **-10** |
| SPF 超过 10 次查询限制 | -5 |
| DMARC `sp=` 不匹配 | -5 |
| SPF 无效查询 > 2 | -3 |
**评级**
| 等级 | 分数 |
|:-----:|------:|
| **A** | 80-100 |
| **B** | 60-79 |
| **C** | 40-59 |
| **D** | 20-39 |
| **F** | 0-19 |
|
## 差异化优势
### 与竞品的功能逐一对比
| 功能 | SpoofScore | Spoofy | espoofer | checkdmarc | mailvalidator | dnsarmor |
|:-----------|:----------:|:------:|:--------:|:----------:|:-------------:|:--------:|
| **核心问题** | 可伪造? | 可伪造? | 绕过验证? | 记录有效? | 安全等级? | DNS 安全? |
| 综合 0-100 评分 | ✅ | ❌ | ❌ | ❌ | 扣分 | 发现 |
| 8 层分析 | ✅ | ❌ | ❌ | ❌ | 部分 | 仅 DNS |
| 可伪造性判定 | ✅ | ✅ | 不适用 | ❌ | ❌ | ❌ |
| 通配符 DKIM 测试 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 感知服务提供商的 DKIM | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| DKIM 选择器 | **80+** | API | 不适用 | 0 | 0 | 内置 |
| SPF 悬空包含 | ✅ | ❌ | ❌ | ❌ | 仅无效 | ❌ |
| SPF 无效查询限制 | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ |
| DMARC `sp=` 不匹配 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| RBL/DNSBL 区域 | **10** | 0 | 0 | 0 | 104 | 13 |
| FCrDNS | ✅ | ❌ | ❌ | ✅ | 部分 | ❌ |
| MTA-STS + DANE | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| BIMI + TLS-RPT | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| 包含 DNS 记录的修复方案 | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ |
| 用于研究的 CSV 批量处理 | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
| 依赖项 | **1** | 2 | 5+ | 7 | 6+ | 3 |
## 使用方法
### 扫描单个域名
```
python spoofscore.py example.com
```
### 扫描多个域名
```
python spoofscore.py example.com another.org third.gov
```
### 从文件加载扫描
```
python spoofscore.py -f domains.txt
```
### 导出为 CSV(用于研究/批量分析)
```
python spoofscore.py -f domains.txt -o results.csv
```
### JSON 输出(包含修复方案)
```
python spoofscore.py example.com --json
```
### 为大批量扫描自定义线程数
```
python spoofscore.py -f 1000-domains.txt -o scan.csv --smtp-threads 30
```
所有 CLI 选项
| 标志 | 描述 | 默认值 |
|------|-------------|---------|
| `domains` | 一个或多个要扫描的域名 | |
| `-f`, `--file` | 包含域名的文件(每行一个) | |
| `-o`, `--output` | 输出的 CSV 文件路径 | |
| `--json` | 输出 JSON 而不是 CLI 报告 | `false` |
| `--smtp-threads` | 批处理模式下的 SMTP 探测线程数 | `10` |
| `--version` | 打印版本号并退出 | |
## 输出格式
CSV 列名(用于研究/批量扫描)
| 列名 | 描述 |
|--------|-------------|
| `domain` | 目标域名 |
| `score` | 综合评分 0-100 |
| `grade` | 字母评级 A-F |
| `spoofable` | 是/否 判定 |
| `has_mx` | 存在 MX 记录 |
| `mx_primary` | 主要的 MX 主机名 |
| `spf_mechanism` | SPF all 机制 (硬失败/软失败/中性/宽松/缺失) |
| `spf_record` | 原始 SPF TXT 记录 |
| `dmarc_policy` | DMARC p= 值 |
| `dmarc_record` | 原始 DMARC TXT 记录 |
| `dmarc_rua` | DMARC 汇总报告 URI |
| `dkim_found` | 发现的 DKIM 选择器 |
| `dkim_selectors` | 找到的选择器名称 |
| `starttls` | 支持 STARTTLS |
| `tls_version` | 协商的 TLS 版本 |
| `tls_cipher` | 密码套件 |
| `platform` | 检测到的邮件平台 |
| `spf_lookups` | SPF DNS 查询次数 |
| `spf_void_lookups` | SPF 无效查询次数 |
| `spf_exceeds_limit` | 超过 10 次查询限制 |
| `spf_void_exceeds` | 超过无效查询限制 |
| `spf_dangling` | NXDOMAIN 包含 |
| `spf_chain_depth` | 包含树深度 |
| `mta_sts` | 已配置 MTA-STS |
| `dane_tlsa` | 存在 DANE/TLSA |
| `bimi` | 存在 BIMI 记录 |
| `tls_rpt` | 已配置 TLS-RPT |
| `rbl_listed` | 被列入黑名单的区域 |
| `rbl_clean` | 在所有 RBL 区域中均为干净状态 |
| `fcrdns_ptr` | PTR 记录 |
| `fcrdns_verified` | 正向确认 |
| `sp_mismatch` | sp= 策略不匹配 |
| `dkim_wildcard` | 检测到通配符 _domainkey |
JSON 输出(单个域名)
```
{
"domain": "example.com",
"score": 45,
"grade": "C",
"spoofable": "Yes",
"has_mx": "Yes",
"mx_primary": "mx1.example.com",
"spf_mechanism": "softfail",
"dmarc_policy": "none",
"dkim_found": "Yes",
"dkim_selectors": ["selector1"],
"platform": "Microsoft 365",
"mta_sts": "No",
"dane_tlsa": "No",
"rbl_clean": "Yes",
"remediation": [
{
"priority": "CRITICAL",
"issue": "DMARC policy is 'none' (monitor only)",
"fix": "Upgrade to p=reject to block spoofed mail",
"record": "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"
}
]
}
```
## 注意事项
- 需要使用 Python 3.8+。只有一个依赖项:`dnspython`
- DKIM 会探测 80+ 个选择器。自定义的选择器可能仍会被遗漏
- RBL 检查会查询 10 个主要的黑名单区域。某些区域可能会进行速率限制
- 这是一个时间点的快照扫描。DNS 记录和邮件服务器配置会发生变化
```
pip install dnspython
```
## 许可证
[MIT](LICENSE)。可随意使用、分叉并在其基础上进行开发。
由 bau1u 构建。一个依赖。一个问题。一个答案。
有人能伪造你的域名吗?
几秒钟内得出结论。