免责声明:
本公众号致力于安全研究和红队攻防技术分享等内容,本文中所有涉及的内容均不针对任何厂商或个人,同时由于传播、利用本公众号所发布的技术或工具造成的任何直接或者间接的后果及损失,均由使用者本人承担。请遵守中华人民共和国相关法律法规,切勿利用本公众号发布的技术或工具从事违法犯罪活动。最后,文中提及的图文若无意间导致了侵权问题,请在公众号后台私信联系作者,进行删除操作。
最近在做邮箱测试时,碰到了邮箱来源伪造的测试需求,但是对于SPF了解不是很多,所以这篇文章通过测试经历来记录一下关于SPF的相关测试方法和原理。
我们先来看一下spf的百度百科解释,SPF记录(发信者策略架构),SPF是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录,它用于登记某个域名拥有的用来外发邮件的所有IP地址。按照SPF的格式在DNS记录中增加一条TXT类型的记录,将提高该域名的信誉度,同时可以防止垃圾邮件伪造该域的发件人发送垃圾邮件。
以上的图很通俗的解释SPF验证做了什么,您的域管理员或托管公司仅需在域名系统 (DNS) 中发布SPF记录。这些简单的文本记录标识了经过授权的电子邮件发送服务器(通过列出这些服务器的 IP 地址)。电子邮件接收系统会检查邮件是否来自经过正确授权的电子邮件发送服务器。
检查步骤如下,发送人向接收方发送一封电子邮件后,邮件接收服务器接收电子邮件并执行如下操作:
-
检查哪一个域声称发送了该邮件并检查该域的 SPF 记录的 DNS。
-
确定发送服务器的 IP 地址是否与 SPF 记录中的某个已发布 IP 地址相匹配。
-
对电子邮件进行打分:如果 IP 地址匹配,则邮件通过身份验证并获得一个正分。如果 IP 地址不匹配,则邮件无法通过身份验证并获得一个负分。
然后,对现有的防垃圾邮件筛选策略和启发式筛选应用这些结果。
咱们以qq邮箱为例,首先查询qq邮箱的spf记录
命令:nslookup -type=txt qq.com
继续往下查询
nslookup -type=txt spf.mail.qq.com
nslookup -type=txt qq-a.mail.qq.com
一条 SPF 记录定义了一个或者多个 mechanism,而 mechanism 则定义了哪些 IP 是允许的,哪些 IP 是拒绝的。
这些 mechanism 包括以下几类:
all | ip4 | ip6 | a | mx | ptr | exists | include
每个 mechanism 可以有四种前缀:
-
"+" Pass(通过)
-
"-" Fail(拒绝)
-
"~" Soft Fail(软拒绝)
-
"?" Neutral(中立)
其中include的含义:
格式为include:<domain>,表示引入<domain>域名下的 SPF 记录。注意,如果该域名下不存在 SPF 记录,则会导致一个PermError结果,这种匹配机制通常用于云服务。例如:
"v=spf1 include:example.com -all" 即采用和 example.com 完全一样的 SPF 记录
以qq-a.mail.qq.com为例,设置了多个ip为白名单,也就是说当我们的邮件服务器收到来自qq邮箱的邮件时,会确认来源ip是否在以上的ip段内,若不是则会拒绝接收邮件。
Swaks是由John Jetmore编写和维护的一种功能强大,灵活,可脚本化,面向事务的SMTP测试工具。可向任意目标发送任意内容的邮件。一般在Kali中自带。
常用Swaks指令
--ehlo [helo-string]:伪造ehlo头信息
--header [header-and-data]:伪造From、Subject、Message-Id、X-Mailer等头信息
--data [data-portion]:伪造DATA的全部内容,可直接将邮件源码作为选项
--attach [attachment-specification]:添加附件
来个示例
swaks --to testfrom admin .com --ehlo AAA --body hello --header hello .com --
尝试向自己的qq邮箱伪造一封发信者为[email protected]的邮件,返回550 SPF check failed.也就是说qq邮箱的邮件服务器识别我们的发信IP不是来自于SPF记录中提供的白名单IP,所以对我们的邮件进行拒绝。
找一个临时邮箱进行测试,临时邮箱地址https://temp-mail.org/zh/
查看邮件内容发现伪造成功
在配置了SPF的情况下,需要用一些权威的邮件服务商去发送邮件,如sendgrid,mailgun,这些权威邮件服务商,会被大部分邮件服务商加到白名单中,这样他们的邮件就不会进到垃圾箱,网站地址:
https://www.mailgun.com
https://sendgrid.com
一些提高送达成功率的小技巧:
-
适当控制发信的频率,如果短时间内向同一个邮箱地址发信,也会容易被标记为垃圾邮件;
-
将较大的收件人列表分割成若干个小的,分时间段发送,视接收方邮箱的规则调整每次发送人数量;
-
适当修改内容,一般来说,邮件服务器多次收到来自同一个邮件IP地址的相同内容邮件,很容易就被判定为垃圾邮件。在进行邮件编辑时,多采用变量设置,像公司名、收件人,可以进行变量添加,避免邮件内容完全一致。
如果你拥有自己的域名,并且用它发送邮件,那么你应该为它添加 SPF。通过域名服务商提供的「域名解析」、「DNS Editor」或者「DNS Zone Editor」等功能添加,并填写正确的 SPF 数据就可以了。
严格来说,SPF 数据应该创建为 SPF 记录。但是鉴于很多 DNS 服务商不支持 SPF 记录,甚至有的邮件服务器也不支持 SPF 记录,因此也可以创建为一条 TXT 记录。目前,你应该至少创建一条 TXT 记录。
因为本质上 SPF 的作用是为一个域名指定合法的发件 IP,所以你需要知道自己使用的邮件服务器的发件 IP 是什么。如果你使用第三方的域名邮箱服务(比如腾讯的域名邮箱),那么他们应该有相应的文档告诉你该怎么填写。如果你用虚拟主机,则主机提供商也应该会告诉你。
这里介绍一个工具,输入域名和SPF记录,可快速检查SPF记录是否正确。
测试地址:https://www.kitterman.com/spf/validate.html
将之前查询到的地址稍作修改,删除其中一个ip4进行验证
输入v=spf1 ip4:101.226.139.0/25 101.91.43.0/25 -all
点击测试,网站告知格式错误缺少ip4
SPF 记录本质上是一个 DNS 记录,所以并不是修改之后立即生效的——通常需要几个小时的时间。
原文始发于微信公众号(Lambda小队):邮箱伪造的克星——SPF防护
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论