前言
目前很多邮件用的是简单邮件传输协议SMTP进行通信,但是由于这个协议本身没有很好的安全机制,没办法鉴别寄件人是谁!这也让很多不法分子钻了空子进行钓鱼诈骗。为了邮件的安全性,出现了SPF记录机制,以验证电子邮件的来源,那么下面就SPF安全机制的配置缺陷及漏洞利用展开交流。
在学习SPF相关安全问题之前,我们首先要介绍一下协议和两个记录。
SMTP
协议是简单的邮件传输协议,目前邮件还是使用这个协议通信,但是它本身并没有很好的安全措施。SMTP协议本身没有机制鉴别寄件人的真正身份,电子邮件的“寄件者”一栏可以填上任何名字,于是伪冒他人身份来网络钓鱼或寄出垃圾邮件便相当容易,而真正来源却不易追查。MX
记录用于指定负责处理发往收件人域名的邮件服务器。MX记录允许设置一个优先级,当多个邮件服务器可用时,会根据该值决定投递邮件的服务器(值越小优先级越高)。SMTP会根据MX记录的值来决定邮件的路由过程。SPF
记录的全称为Sender policy Framework 中文译作“发件人策略框架”, 它是一套电子邮件认证机制,可以确认电子邮件确实是有网域授权的邮件服务器寄出,防止有人伪冒身份网络钓鱼或寄出垃圾电邮。SPF允许管理员设定一个DNS TXT记录或SPF记录设定发送邮件服务器的IP范围,如有任何邮件并非从上述指明授权的IP地址寄出,则很可能该邮件并非确实由真正的寄件者寄出。
以上总结出一句话就是:配置SPF记录的目的就是防止随意伪造发件人
假设邮件服务器收到一封邮件,来源IP是1.1.1.1
,且发件邮箱为[email protected]。
为了验证发件人是不是伪造的,邮件服务器会去查询sysgeek.cn
服务器上的SPF记录~
如果记录中允许了1.1.1.1
这个IP为主机发送邮件,则认为合法,反之则根据SPF配置的策略进行对应的操作(退信/标记垃圾邮件)。
SPF的优点是:
1、 可以根据自己的需求进行对应的策略配置,以达到检查电子邮件来源的目的
2、 它使得仅有被授权的发送者可以代表域名发送邮件,并且阻止其他所有未经授权的发送者这样做
SPF的缺点是:
1、 容易配置不当,且已存在绕过的方式造成邮件伪造
2、 电子邮件中有两类From地址:envelope From地址
和头域From地址
。SPF仅验证envelope From地址,但是并不验证头域From地址
查看一个域名的SPF记录命令
Nslookup -type=txt baidu.com
dig -t txt baidu.com
一、SPF机制
SPF记录会结合匹配机制
和限定词
使用,它其实就是一条有特殊语法的TXT记录
匹配机制主要用于定义和指定可由该域名发送邮件的主机,其定义方式包括:
- all匹配任何主机,它写在SPF记录最后匹配在其前面所列出的主机
- ip4匹配IPv4地址或网络范围
- ip6匹配IPv6地址或网络范围
- a匹配主机名或域名
- mx匹配域名的MX记录,当出站与入站邮件为同一服务器时通常采用此种机制
- ptr通过DNS反向记录来匹配发件人IP和域名,由于会增加DNS负载,一般不采用此种机制
- exists只检查域是否在DNS中存在
- include将发件人IP和SPF记录指向另一个域,这种匹配机制通常用于云服务,如Exchange Online Protection
二、匹配机制的前缀
匹配机制会结合一些限定词来使用,以告诉服务器找到一条匹配记录时该怎么办,常见限定词有:
+
表示通过(pass), 如果没有明确指定限定词,则为默认值-
硬拒绝(Fail),直接拒绝来自未经授权主机的邮件~
软拒绝(Soft Fail),邮件可被接受,也可被标记为垃圾邮件?
中性(Neutral),不考虑邮件是否被接受
那么它一般如何配置呢? 配置流程如下:
Step1 –-登录域名注册商的控制台,找到DNS管理
或者域名解析
选项,点击进入
Step2 –-在DNS管理页面,找到SPF记录
,点击进入
Step3 –-在SPF记录设置页面中,会看到一个TXT类型的记录,输入相关信息
Step4 –-点击保存并完成设置
举一些配置的实例(v=spf1指采用SPF1版本,现在它的最新版本就是第1版):
v=spf1 -all
(拒绝所有,表示这个域名不会发出邮件)
v=spf1 +all
(接收所有)
v=spf1 ip4:192.168.0.1/16 -all
(只允许192.168.0.1/16 范围内的IP发送邮件)
v=spf1 mx -all
(允许当前域名的mx记录对应的IP地址发送邮件)
v=spf1 mx mx:test.example.com -all
(允许当前域名和test.example.com的mx记录对应的IP地址发送邮件)
v=spf1 a mx ip4:11.12.11.13 -all
(允许当前域名的a记录和mx记录和一个给定的IP地址发送邮件)
v=spf1 include:example.com -all
(采用和example.com 一样的SPF记录)
需要注意的是:SPF记录本质是个DNS记录,所以不是修改后立即生效,通常要几个小时后再生效。
同时提供几个网址,在进行SPF配置的时候或需要查询SPF配置的时候做参考:
Open SPF
:官方网站,有很多资料,值得一看(http://www.openspf.org/)RFC 4408
:SPFv1 的规范全文(http://www.openspf.org/RFC_4408)SPF: Why?
:为什么我发的邮件被拒绝了?(http://www.openspf.org/Why)Gmail
:如果你有 Gmail 的话,可以给自己的 Gmail 邮箱发一封邮件,然后用 Gmail 独有的 Show Original 功能查看 Gmail 服务器的 SPF 判断结果。
三、邮件伪造之SPF绕过方式
SPF解析不当
- 语法错误将导致SPF记录完全失效,
https://www.kitterman.com/spf/validate.html
网站输入域名和SPF记录,可以检查SPF记录是否正确(SPF记录本质上是一个DNS记录,所以并不是修改之后立即生效的,通常需要几个小时的时间) - 允许IP段过大,只要攻击者拿下一台网段内的机器即可绕过
~all
软拒绝,会接受来信,但可能标记为垃圾邮件(outlook邮箱可以接收邮件,qq邮箱不接收,163邮箱标记为垃圾邮件
)SPF记录设置硬拒绝,就会有大量的邮件被丢弃或者隔离,影响办公效率,为了减少业务影响,有些管理员采用软拒绝的策略,但也会在一定程度上造成安全风险。
SPF配置不当
- 域名增加了SPF记录,但是邮件服务器不支持SPF检查或邮件网关未开启SPF检测,无法验证邮件来源。这种情况下,我们声明了自己是谁,但却无法验证对方是谁,SPF检测无效,可伪造任意用户发送到你的域名邮箱里。
- SPF解析在公网DNS,邮件服务器配置内部DNS,内部DNS无法进行SPF解析,从而导致绕过,可从公网伪造任意用户发送邮件。
- 攻击者在公司内网,内网SMTP服务器开启匿名邮件发送或者在信任服务器IP段,就可以使用任意用户发送邮件。
高权限用户绕过
- Exchange邮箱系统,拥有Domain admin权限的域用户,可以通过outlook直接指定发件人,伪造任意发件人发送邮件并且邮件头不会显示真实IP,但是这条没有什么实际意义,已经拥有Domain admin权限就没必要进行邮件伪造了。
邮件客户端内容解析差异
From字段特殊字符填充绕过
四、漏洞危害
允许攻击者伪造发件人身份,从而发送钓鱼邮件或垃圾邮件,获取接收方的信任,进而可能导致主机被控制或重要资料泄露
比如: www.xxx.com
存在这个漏洞,你就可以伪造[email protected]
给受害人发邮件进行钓鱼
五、漏洞利用方式
在实操之前,可以先了解一下对方是否开启了反邮件伪造技术,了解是否有阻拦,是否需要想办法绕过,然后再行动。
查询地址供上:
SPF查询:https://www.kitterman.com/spf/validate.html?
DKIM查询:https://dmarcly.com/tools/dkim-record-checker
DMARC查询:https://dmarcly.com/tools/dmarc-checker
六、漏洞挖掘
dig -t txt baidu.com //如果是-all
就是不存在,要是~all
就是存在
利用工具:kali自带swaks
Swaks –body “钓鱼邮件测试” –header “Subject:钓鱼测试” -t [email protected] -f [email protected]
-to
: (你要发给哪个邮箱)-from
: (你想伪装成哪个邮箱)-ehlo
: (伪造的邮件ehlo头)-body
: (邮件正文)-header
: (邮件标题,要注意这边要在引号后面加上subject:再写标题)
能收到邮件就说明存在此漏洞
七、修复方式
1、建议对公司内部的邮件域名进行配置SPF并设置硬阻断,对其他所有域名不开启SPF检测(需要支持类似功能的邮件网关),关闭匿名发送功能,或限制开放匿名发送功能;在邮服前面配置过滤产品,解析MAIL_FROM
和FROM
字段,检查不匹配的直接告警。 2、将参数~all
更改为-all
反邮件伪造技术
现代邮件验证方案通常包含DKIM
、DMARC
、以及 SPF
这三者一起可以为商务邮件提供完全的反冒名邮件欺诈保护,并最小化相关的风险。SPF检查的结果会被DMARC用来做进一步的处理。
下面是两个新增专业术语的官方式介绍:
DKIM
是 DomainKeys Identified Mail 的缩写。它是一种电子邮件验证机制,用来检测伪造的邮件头域和内容。DKIM 使得接收者能够检查邮件头域和内容是否在传输过程中已经被篡改。
DMARC
是Domain-based Message Authentication, Reporting & Conformance 的缩写。它是一种用来确定电子邮件是否来自声称的发送者的机制。它建立于 SPF 和 DKIM 之上,并且增加了域名对齐检查和报告功能。