Cyber-Threat-Hunting-Playground/generate_brand_domain_impersonations_with_punycode
GitHub: Cyber-Threat-Hunting-Playground/generate_brand_domain_impersonations_with_punycode
基于 Unicode TR39 视觉易混淆字符标准,为品牌域名批量生成 Punycode 仿冒变体的安全防御工具。
Stars: 0 | Forks: 0
# 使用 Punycode 生成品牌域名仿冒变体
这是一个可用于生产环境的实用工具,通过应用 Unicode TR39 视觉易混淆字符替换,为品牌域名列表生成 **Punycode (`xn--`) 仿冒变体**。输出的结果为 `(原始域名, punycode变体)` 对的 CSV/TSV/JSON 列表。
非常适合用于:
- 🎯 **威胁狩猎** — 在 DNS 日志、WHOIS 记录、SSL 证书中发现域名仿冒行为
- 🔍 **品牌保护** — 检测和监控欺骗性域名
- 📊 **学术研究** — 分析 IDN(国际化域名)攻击模式
- 🛡️ **安全测试** — 验证 DNS/邮件过滤防御机制
## 快速开始
### 1. 提供您的品牌域名
```
# 编辑模板以添加您的品牌 FQDN(每行一个)
cp brand_domains.txt.example brand_domains.txt
# 添加域名,例如:
# example.com
# mybrand.io
# your-domain.org
```
### 2. 运行生成器
```
python generate_brand_domain_impersonations.py
```
**输出结果**将写入 `brand_domains_impersonation.txt`:
```
example.com,xn--exmple-cua.com
example.com,xn--exampl-jua.com
mybrand.io,xn--mybrand-ewa.io
...
```
### 3. 高级选项
| 标志 | 默认值 | 描述 |
|---|---|---|
| `--input PATH` | `brand_domains.txt` | 域名列表的路径 |
| `--output PATH` | `brand_domains_impersonation.txt` | 目标文件 |
| `--confusables PATH` | `unicode_TR39_confusables.txt` (内置) | TR39 易混淆字符文件的路径 |
| `--max-substitutions N` | `1` | 一次最多用易混淆字符替换 N 个位置 |
| `--max-variants M` | `500,000` | 每个域名收集到 M 个唯一的 Punycode 输出后停止 |
| `--format {csv,tsv,json}` | `csv` | 输出格式 |
| `--deduplicate` | — | 移除所有输入域名中重复的 Punycode 变体 |
| `--workers N` | `1` | 用于并行处理的 worker 进程数 |
| `--stats` | — | 打印生成统计信息 |
| `--verbose` | — | 启用详细日志记录 |
#### 示例
生成所有双字符替换组合,每个域名的变体数量上限为 200,000:
```
python generate_brand_domain_impersonations.py \
--max-substitutions 2 \
--max-variants 200000
```
使用 4 个并行 worker 并获取带有统计信息的 JSON 输出:
```
python generate_brand_domain_impersonations.py \
--workers 4 \
--format json \
--stats
```
去重并导出为 TSV:
```
python generate_brand_domain_impersonations.py \
--format tsv \
--deduplicate \
--verbose
```
## 工作原理
```
Input: "example.com"
↓
1. Lookup visual confusables for each character:
- 'e' → ['ε', 'е', 'ℯ', ...] (Greek epsilon, Cyrillic e, etc.)
- 'x' → ['×', 'х', ...] (multiplication sign, Cyrillic h, etc.)
- 'a' → ['α', 'а', ...] (Greek alpha, Cyrillic a, etc.)
- 'm' → ['m', 'ᴍ', ...] (Latin m, Latin small cap m, etc.)
- 'p' → ['р', ...] (Cyrillic r, etc.)
- 'l' → ['l', 'ⅼ', '1', ...] (Latin l, Roman numeral L, digit 1, etc.)
- 'o' → ['ο', 'о', '0', ...] (Greek omicron, Cyrillic o, digit 0, etc.)
↓
2. Generate combinations (k=1 means single substitutions):
- exαmple.com (a → α)
- exаmple.com (a → а, Cyrillic)
- еxample.com (e → е, Cyrillic)
↓
3. Encode to IDNA/Punycode:
- exαmple.com → xn--exmple-cua.com ✓ (has xn--)
- example.com → example.com ✗ (no xn--, plain ASCII)
↓
Output: "example.com,xn--exmple-cua.com"
```
## 威胁上下文 (MITRE ATT&CK)
此工具可帮助检测 **[T1584.001 - 获取基础设施:域名](https://attack.mitre.org/techniques/T1584/001/)** 和 **[T1587.001 - 开发能力:恶意软件](https://attack.mitre.org/techniques/T1587/001/)** 攻击,在这些攻击中,对手会:
1. 使用易混淆的 Unicode 字符**注册相似域名**
2. 通过视觉上完全相同的域名(同形异义词攻击)**定位邮件用户**
3. **绕过**仅检查 ASCII 域名的安全过滤器
4. 在这些变体上**托管钓鱼、凭据窃取或恶意软件分发**
### 真实案例
| 品牌 | 欺骗性变体 | Punycode | 检测方法 |
|-------|-----------------|----------|------------------|
| `apple.com` | `αpple.com` (α = 希腊字母 alpha) | `xn--pple-1oa.com` | DNS 解析监控 |
| `amazon.com` | `amаzon.com` (а = 西里尔字母 a) | `xn--amazn-7ua.com` | 证书透明度日志 |
| `github.com` | `gіthub.com` (і = 西里尔字母 i) | `xn--gthub-5pf.com` | 电子邮件标头分析 |
## 性能与缓存
### IDNA 编码缓存
脚本会缓存 `encode("idna")` 的结果,以避免冗余的 Unicode 到 Punycode 的转换:
```
Without cache: 1000 domains × 500 variants = 500,000 encodings
With cache: Many duplicates eliminated → 10% cache hit rate typical
```
使用 `--stats` 查看缓存性能:
```
IDNA cache hits/misses: 47,382/52,618 (47.4% hit rate)
```
### 并行处理
使用 `--workers N` 来利用多核 CPU:
```
# 4 个 worker 并行处理 10,000 个域名
time python generate_brand_domain_impersonations.py \
--workers 4 \
--max-variants 10000
# 单线程:约 45 秒
# 4 个 worker:约 15 秒(3 倍加速)
```
**注意:**并行处理使用 `multiprocessing.Pool`。每个 worker 都会获得一份反向易混淆字符映射表的副本。
## 输出格式
### CSV (默认)
```
example.com,xn--exmple-cua.com
example.com,xn--exampl-jua.com
```
### TSV
```
example.com xn--exmple-cua.com
example.com xn--exampl-jua.com
```
### JSON
```
{
"version": "1.0",
"generated_at": "2026-05-27T15:37:13Z",
"variants": [
{
"original": "example.com",
"punycode": "xn--exmple-cua.com"
},
{
"original": "example.com",
"punycode": "xn--exampl-jua.com"
}
]
}
```
## 输入文件格式 (`brand_domains.txt`)
- 每行一个完全限定的域名(推荐使用 ASCII)
- 以 `#` 开头的行和空行将被忽略
- 去除首尾的空白字符
```
# 我的品牌域名(忽略注释行)
example.com
mybrand.io
# 生产域名
api.production.company.com
```
## 依赖项
- **Python 3.9+**
- **无需第三方包** — 仅使用标准库
- 内置 `unicode_TR39_confusables.txt` (Unicode 技术标准 #39)
## 文件
| 文件 | 描述 |
|---|---|
| `generate_brand_domain_impersonations.py` | 主脚本(增强了日志记录、缓存和并行处理功能) |
| `test_generate_brand_domain_impersonations.py` | 单元测试(20+ 个测试用例) |
| `unicode_TR39_confusables.txt` | 内置 Unicode TR39 易混淆字符数据 (UTS #39) |
| `brand_domains.txt.example` | 输入域名列表的模板 |
| `brand_domains.txt` | *(已 gitignore)* 您实际的域名列表 |
| `brand_domains_impersonation.txt` | *(已 gitignore)* 生成的 Punycode 变体(默认为 CSV) |
## 测试
运行包含的单元测试套件:
```
# 使用 pytest(如果已安装)
pytest test_generate_brand_domain_impersonations.py -v
# 或使用 unittest(Python 标准库)
python test_generate_brand_domain_impersonations.py
```
**测试覆盖率:**
- ✅ 易混淆字符文件的加载与错误处理
- ✅ 反向映射的生成
- ✅ 替换位置的检测
- ✅ 字符替换逻辑
- ✅ 带有缓存的 IDNA 编码
- ✅ 变体生成 pipeline
- ✅ 域名文件解析
- ✅ 输出格式化 (CSV, TSV, JSON)
- ✅ 集成工作流
## 安全考虑
### ⚠️ 范围限制
此工具基于 Unicode 易混淆字符生成**视觉上相似的变体**,但**不会**:
- 代替您注册域名(它仅生成变体名称)
- 执行 DNS 查找或 WHOIS 查询
- 验证变体是否已被实际注册/运营
- 检查域名变体的 HTTPS 证书
- 模拟钓鱼攻击或用户交互测试
### 推荐的用例
✅ **检测:**
- 监控 DNS 查询日志中是否包含在您变体列表中的 Punycode 域名
- 检查证书透明度日志中的证书签发情况
- 在电子邮件日志中搜寻基于域名的钓鱼企图
- 分析被动 DNS 数据库
✅ **防御:**
- 为您的品牌生成预期变体的基线
- 在邮件网关中为 Punycode/相似域名设置警报
- 在浏览器/客户端中实施同形异义词攻击检测
- 在攻击者之前注册防御性变体
### 负责任的披露
如果您发现使用此工具生成的变体进行的主动攻击:
1. **记录威胁**(域名、注册详情、托管 IP)
2. **向执法部门报告**(IC3、FBI InfraGard、INTERPOL)
3. 如果不是您的组织,**通知品牌所有者**
4. **向域名注册局发出警报**以寻求协助下架
5. **与 MISP/威胁情报源共享**(需获得许可)
## 示例与现实场景
### 场景 1:邮件安全团队监控
```
# 为受保护品牌生成变体
python generate_brand_domain_impersonations.py \
--input important_brands.txt \
--output threat_variants.csv \
--max-variants 50000
# 输入到 email gateway 的 homograph 检测中:
# - 阻止发往 threat_variants.csv 中域名的外发/入站电子邮件
# - 在邮件头精确匹配时发出警报
# - 记录尝试以供取证
```
### 场景 2:针对钓鱼数据集的安全研究
```
# 为常见目标品牌生成变体
python generate_brand_domain_impersonations.py \
--input phishing_targets.txt \
--format json \
--max-substitutions 2 \
--max-variants 100000 \
--workers 4 \
--stats
# 与 VirusTotal、URLhaus、PhishTank API 进行交叉比对
# 测量实际环境中 homograph 攻击的普遍程度
```
### 场景 3:品牌保护 CI/CD pipeline
```
# 自动每周生成 Slack 警报
#!/bin/bash
VARIANTS=$(python generate_brand_domain_impersonations.py \
--input company_domains.txt \
--format json \
--stats 2>&1)
# 检查变体是否已注册(使用 whois/API)
python check_registered_variants.py --input brand_domains_impersonation.txt
# 对任何新注册的变体发出警报
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"Found ${NEW_VARIANTS} new homograph variants\"}" \
$SLACK_WEBHOOK_URL
```
## Unicode 易混淆字符参考
内置的 `unicode_TR39_confusables.txt` 包含:
| 拉丁字母 | 相似字符 | Unicode 名称 |
|-------|-----------|---------------|
| `a` | α, а, ɑ | 希腊字母 Alpha, 西里尔字母 A, 拉丁文字 A |
| `e` | ε, е, ℯ | 希腊字母 Epsilon, 西里尔字母 Ie, 数学符号 E |
| `o` | ο, о, 0 | 希腊字母 Omicron, 西里尔字母 O, 数字零 |
| `p` | р, ρ | 西里尔字母 R, 希腊字母 Rho |
| `c` | с, ϲ | 西里尔字母 S, 希腊字母新月形 Sigma |
| `l` | 1, ⅼ, І | 数字一, 罗马数字 L, 西里尔字母 I |
| `i` | 1, і, ı | 数字一, 西里尔字母白俄罗斯 I, 无点 I |
[完整的 Unicode TR39 规范](https://unicode.org/reports/tr39/)
## 许可证
本项目是 **Cyber Threat Hunting Playground** 的一部分。详情请参阅仓库的 LICENSE。
## 参考
- [MITRE ATT&CK T1584.001](https://attack.mitre.org/techniques/T1584/001/) — 获取基础设施:域名
- [Unicode TR39 易混淆字符](https://unicode.org/reports/tr39/) — 同形异义词攻击防御
- [OWASP:国际化域名](https://owasp.org/www-community/attacks/IDN_Homograph_Attacks)
- [RFC 3490: IDNA](https://tools.ietf.org/html/rfc3490) — 应用中的国际化域名
- [RFC 5890: IDNA2008](https://tools.ietf.org/html/rfc5890) — 协议
## 免责声明
本工具按“原样”提供,**仅供经授权的安全研究和威胁狩猎使用**。用户需对以下事项负责:
- 遵守所有适用法律法规
- 在任何系统或数据上使用此工具前获得适当的授权
- 仅将结果用于防御目的(检测、监控、事件响应)
- 不得将此工具用于恶意目的(域名注册、钓鱼、欺诈)
未经授权访问计算机系统是违法行为。在部署之前,请咨询您组织的安全和法律团队。
标签:IDN欺骗, Python, 品牌保护, 域名安全, 无后门, 逆向工具, 配置审计