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, 品牌保护, 域名安全, 无后门, 逆向工具, 配置审计