105 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Homograph / Homoglyph Attacks in Phishing
{{#include ../../banners/hacktricks-training.md}}
## 概述
同形异义词(又称同形字)攻击利用了许多**来自非拉丁脚本的Unicode代码点在视觉上与ASCII字符完全相同或极为相似**的事实。通过用一个或多个外观相似的字符替换拉丁字符,攻击者可以制作:
* 看起来对人眼合法的显示名称、主题或消息正文,但可以绕过基于关键字的检测。
* 让受害者相信他们正在访问受信任网站的域名、子域名或URL路径。
因为每个字形在内部是通过其**Unicode代码点**来识别的,单个替换字符就足以击败简单的字符串比较(例如,`"Παypal.com"``"Paypal.com"`)。
## 典型钓鱼工作流程
1. **制作消息内容** 用来自另一种脚本(希腊文、斯拉夫文、亚美尼亚文、切罗基文等)中视觉上无法区分的字符替换被模仿品牌/关键字中的特定拉丁字母。
2. **注册支持基础设施** 可选地注册一个同形字域名并获得TLS证书大多数CA不进行视觉相似性检查
3. **发送电子邮件/SMS** 消息在以下一个或多个位置包含同形字:
* 发件人显示名称(例如,`Ηеlрdеѕk`
* 主题行(`Urgеnt Аctіon Rеquіrеd`
* 超链接文本或完全合格的域名
4. **重定向链** 受害者通过看似无害的网站或URL缩短器被转发然后落在收集凭据/投放恶意软件的恶意主机上。
## 常被滥用的Unicode范围
| 脚本 | 范围 | 示例字形 | 看起来像 |
|--------|--------------|--------------|------------|
| 希腊文 | U+0370-03FF | `Η` (U+0397) | 拉丁字母 `H` |
| 希腊文 | U+0370-03FF | `ρ` (U+03C1) | 拉丁字母 `p` |
| 斯拉夫文 | U+0400-04FF | `а` (U+0430) | 拉丁字母 `a` |
| 斯拉夫文 | U+0400-04FF | `е` (U+0435) | 拉丁字母 `e` |
| 亚美尼亚文 | U+0530-058F | `օ` (U+0585) | 拉丁字母 `o` |
| 切罗基文 | U+13A0-13FF | `` (U+13A2) | 拉丁字母 `T` |
> 提示完整的Unicode图表可在 [unicode.org](https://home.unicode.org/) 获取。
## 检测技术
### 1. 混合脚本检查
针对英语组织的钓鱼电子邮件应该很少混合来自多个脚本的字符。一个简单但有效的启发式方法是:
1. 遍历被检查字符串的每个字符。
2. 将代码点映射到其Unicode块。
3. 如果存在多个脚本**或**在不应出现的地方显示名称、域名、主题、URL等出现非拉丁脚本则发出警报。
Python概念验证
```python
import unicodedata as ud
from collections import defaultdict
SUSPECT_FIELDS = {
"display_name": "Ηоmоgraph Illusion", # example data
"subject": "Finаniаl Տtatеmеnt",
"url": "https://xn--messageconnecton-2kb.blob.core.windows.net" # punycode
}
for field, value in SUSPECT_FIELDS.items():
blocks = defaultdict(int)
for ch in value:
if ch.isascii():
blocks['Latin'] += 1
else:
name = ud.name(ch, 'UNKNOWN')
block = name.split(' ')[0] # e.g., 'CYRILLIC'
blocks[block] += 1
if len(blocks) > 1:
print(f"[!] Mixed scripts in {field}: {dict(blocks)} -> {value}")
```
### 2. Punycode 正规化 (域名)
国际化域名 (IDN) 使用 **punycode** 编码 (`xn--`)。将每个主机名转换为 punycode 然后再转换回 Unicode 允许在字符串被正规化 **后** 进行白名单匹配或相似性检查例如Levenshtein 距离)。
```python
import idna
hostname = "Ρаypal.com" # Greek Rho + Cyrillic a
puny = idna.encode(hostname).decode()
print(puny) # xn--yl8hpyal.com
```
### 3. 同形字典 / 算法
工具如 **dnstwist** (`--homoglyph`) 或 **urlcrazy** 可以枚举视觉上相似的域名排列,对于主动下架 / 监控非常有用。
## 预防与缓解
* 强制执行严格的 DMARC/DKIM/SPF 策略 防止来自未授权域的欺骗。
***Secure Email Gateways****SIEM/XSOAR** 方案中实施上述检测逻辑。
* 标记或隔离显示名称域名 ≠ 发件人域名的消息。
* 教育用户:将可疑文本复制粘贴到 Unicode 检查器中,悬停链接,永远不要信任 URL 短链接。
## 现实世界示例
* 显示名称: `Сonfidеntiаl ikеt` (西里尔字母 `С`, `е`, `а`; 切罗基 ``; 拉丁小写大写 ``)。
* 域名链: `bestseoservices.com` ➜ 市政 `/templates` 目录 ➜ `kig.skyvaulyt.ru` ➜ 假冒的 Microsoft 登录在 `mlcorsftpsswddprotcct.approaches.it.com` 受自定义 OTP CAPTCHA 保护。
* Spotify 冒充: `Sρօtifŭ` 发件人,链接隐藏在 `redirects.ca` 后面。
这些示例来源于 Unit 42 研究2025 年 7 月),展示了同形字滥用如何与 URL 重定向和 CAPTCHA 规避结合,以绕过自动分析。
## 参考文献
- [The Homograph Illusion: Not Everything Is As It Seems](https://unit42.paloaltonetworks.com/homograph-attacks/)
- [Unicode Character Database](https://home.unicode.org/)
- [dnstwist domain permutation engine](https://github.com/elceef/dnstwist)
{{#include ../../banners/hacktricks-training.md}}