目录
爆破邮箱账号
1:收集目标邮箱系统账号
2:验证邮箱账号可用性
3:爆破邮箱账号
绕过SPF
SPF记录的语法
1:SPF解析不当导致绕过
2、SPF配置不当导致绕过
3、高权限用户绕过
4、邮件客户端内容解析差异
5、From字段名截断绕过
鱼叉钓鱼
钓鱼文件制作
发送钓鱼邮件
在红蓝对抗中,邮箱是一个非常重要的一个入口。针对邮箱攻击有几个思路:
本文中,关于邮箱系统的漏洞暂不提及,会在以后的文章中继续分析。本文主要讲如何爆破出可用的邮箱账号和能否绕过SPF伪造任意用户发送邮件。
要想爆破邮箱账号,肯定首先得有足够多的邮箱账号。那么,我们从哪里去获取目标邮箱系统的邮箱账号呢?
这两个网站只要输入目标域名,就可以从互联网上搜到对应格式的邮箱账号。
还有两个Github上的项目:
收集到邮箱账号后,我们还需要对邮箱账号的可用性进行检测。因为有些邮箱账号很有可能已经弃用了。通过下面这些网站可以验证邮箱地址的可用性:
筛选出可用的邮箱账号后,我们就需要对目标邮箱系统进行爆破了。对邮箱进行爆破,有两种方式:
既然对端口号进行爆破,那么我们就自然得知道邮箱的常用端口号了。
传送门:SMTP、POP3和IMAP邮件协议
常见的爆破工具有:超级弱口令检查工具、medusa、hydra、SNETCracker、APT34组织、 owa爆破工具。
SPF(Sender Policy Freamwork)发件人策略框架,是一种以IP地址认证电子邮件发件人身份的技术。在SPF出现之前,发件人的邮箱地址是可以由发信人任意声明的,这带来了很大的危险性。SPF的出现,就是为了防止发信人随意伪造发件人。
SPF记录实际上是服务器的一个DNS记录,原理如下:假设邮件服务器收到一封来自IP为192.168.10.10主机发送的邮件,并且声称发件人为 [email protected] 。邮件系统为了确认发件人不是伪造的,邮件服务器会去查询 qq.com 的SPF记录。如果该域的SPF记录中允许该IP发送邮件,则邮件服务器就认为该邮件是合法的, 否则会认为这是一封非正常邮件并且拒收或标记为垃圾、仿冒邮件。因为攻击者虽然可以声称邮件是来自 qq.com ,但是他却无权操作qq.com的DNS记录,并且他也无法伪造自己的IP地址为SPF中允许的IP地址,因此正确配置SPF还是很有效果的。目前大多数邮件服务提供商都会去验证SPF。
邮件系统如果没有配置SPF,则攻击者可以随便伪造邮件。即使配置了SPF(错误配置),也存在被绕过的风险。下面命令查看目标域名邮件系统是否配置SPF。
nslookup -type=txt taobao.com
一条 SPF 记录定义了一个或者多个策略,而策略则定义了哪些 IP 是允许的,哪些 IP 是拒绝的。
这些策略包括以下几类:
all | ip4 | ip6 | a | mx | ptr | exists | include
all
表示所有 IP,肯定会命中。因此通常把它放在 SPF 记录的结尾,表示处理剩下的所有情况。例如:
"v=spf1 -all" 拒绝所有
"v=spf1 +all" 接受所有
ip4
格式为 ip4:
或者 ip4:
,指定一个 IPv4 地址或者地址段。如果prefix-length
没有给出,则默认为/32
。例如:
"v=spf1 ip4:192.168.10.1/24 -all"
只允许在 192.168.10.1 ~ 192.168.10.255 范围内的 IP
ip6
格式和ip4
的很类似,默认的prefix-length
是/128
。例如:
"v=spf1 ip6:1080::8:800:200C:417A/96 -all"
只允许在 1080::8:800:0000:0000 ~ 1080::8:800:FFFF:FFFF 范围内的 IP
a 和 mx
这俩的格式是相同的,以 a
为例,格式为以下四种之一:
a
a/
a:
a:/
会命中相应域名的 a 记录(或 mx 记录)中包含的 IP 地址(或地址段)。如果没有提供域名,则使用当前域名。例如:
"v=spf1 mx -all"
允许当前域名的 mx 记录对应的 IP 地址。
"v=spf1 mx mx:deferrals.example.com -all"
允许当前域名和 deferrals.example.com 的 mx 记录对应的 IP 地址。
"v=spf1 a/24 -all"
类似地,这个用法则允许一个地址段。
例如,这是一个比较常见的 SPF 记录,它表示支持当前域名的 a 记录和 mx 记录,同时支持一个给定的 IP 地址;其他地址则拒绝:
v=spf1 a mx ip4:173.194.72.103 -all
include
格式为include:
,表示引入
域名下的 SPF 记录。注意,如果该域名下不存在 SPF 记录,则会导致一个PermError
结果。例如:
"v=spf1 include:example.com -all" 即采用和 example.com 完全一样的 SPF 记录
exists
格式为 exists:
。将对
执行一个 A 查询,如果有返回结果(无论结果是什么),都会看作命中。
ptr
格式为ptr
或者ptr:
。使用ptr
机制会带来大量很大开销的 DNS 查询,所以连官方都不推荐使用它。
访问控制
每个策略可以有四种前缀:
"+" Pass(通过)
"-" Fail(拒绝)
"~" Soft Fail(软拒绝)
"?" Neutral(中立)
测试时,将从前往后依次测试每个策略。如果一个策略包含了要查询的 IP 地址(称为命中),则测试结果由相应策略的前缀决定。默认的前缀为+,也就是通过。如果测试完所有的策略也没有命中,则结果为Neutral中立。
除了以上四种情况,还有 None(无结果)、PermError(永久错误)和 TempError(临时错误)三种其他情况。对于这些情况的解释和服务器通常的处理办法如下:
结果 | 含义 | 服务器处理办法 |
Pass | 发件 IP 是合法的 | 接受来信 |
Fail | 发件 IP 是非法的 | 退信 |
Soft Fail | 发件 IP 非法,但是不采取强硬措施 | 接受来信,但是做标记 |
Neutral | SPF 记录中没有关于发件 IP 是否合法的信息 | 接受来信 |
None | 服务器没有设定 SPF 记录 | 接受来信 |
PermError | 发生了严重错误(例如 SPF 记录语法错误) | 没有规定 |
TempError | 发生了临时错误(例如 DNS 查询失败) | 接受或拒绝 |
注意,上面所说的服务器处理办法仅仅是 SPF 标准做出的建议,并非所有的邮件服务器都严格遵循这套规定。
关于v=spf1,这是必须的,这个表示采用 SPF 1 版本,现在它的最新版本就是第 1 版。
假设目标邮件系统的SPF记录设置为
v=spf1 ip4:192.168.10.0/24 ~all
这条SPF记录的意思是只接收192.168.10.0/24范围内的IP发送的邮件,其他地址发送的邮件软拒绝。
这就存在两个安全隐患:
当 SPF 记录设置成 ~all 时,通过测试可以发现,outlook 邮箱可以接收邮件,QQ邮箱不接收,163邮箱被标记为垃圾邮件。
还有一种极为严重的错误,就是SPF解析记录配置错误,早在之前鹅厂就出现过SPF解析错误,比如:
v=spf1 ip4:113.110.223.0/24 183.110.226.0/24 183.110.255.0/24 59.110.132.0/24 -all
这里介绍一个工具,输入域名和SPF记录,可快速检查SPF记录是否正确
测试地址:https://www.kitterman.com/spf/validate.html
SPF记录报错,在这条SPF记录中,存在多个IP段,但只有开头的一段ip用了ipv4,这就导致了语法错误。因为这个错误,将导致整个SPF记录完全失效,因为SPF无效,邮件接收方的SPF检测功能也就完全失效了。
综上,当我们在查看一个域名的SPF记录时,它其实不只是一条解析记录,更是一种邮件安全的策略,SPF记录配置不严或SPF解析错误,就容易导致大量本该被拦截的邮件直接被放进来,而绕过的策略就隐藏在这条SPF记录里面。
邮件服务器管理员做SPF配置时,其实是需要两个步骤的。首先在域名中增加SPF记录,向支持SPF功能的邮件服务器提供验证信息,使别人能验证自己;另外,需要配置邮件服务器支持 SPF,这样才可以验证别人。
那么,在SPF配置过程中,也常常因为配置不当导致绕过,比如:
第一种情况:
域名增加了SPF记录,但是邮件服务器不支持SPF检查或邮件网关未开启SPF检测,无法验证邮件来源。这种情况下,我们声明了自己是谁,但却无法验证对方是谁,SPF检测无效,可伪造任意用户发送到你的域名邮箱里。
第二种情况:
SPF解析在公网DNS,邮件服务器配置内部DNS,内部DNS无法进行SPF解析,从而导致绕过,可从公网伪造任意用户发送邮件。
第三种情况:
攻击者在公司内网,内网SMTP服务器开启匿名邮件发送或者在信任服务器IP段,就可以使用任意用户发送邮件。
比如,当 mynetworks=192.168.10.0/24,在内网,任意一台终端就可以直连公司的SMTP服务器,伪造了一封来自 [email protected] 的邮件发给自己。
python SimpleEmailSpoofer.py -t [目标邮箱] -n QQ邮箱管理员 -f [email protected] -j "邮件主题" -e 1.txt -s [内网邮件服务器IP]
对于Exchange邮箱系统,拥有Domain admins权限的域用户,可通过outlook直接指定发件人,伪造任意发件人发送邮件。伪造邮件的方式十分简单,且邮件头无法显示真实IP。
测试过程:我给自己的账号添加了Domain admin
权限。
使用Outlook2013
客户端指定发件人发送邮件,接收邮件直接显示伪造人的名字,伪造成功
使用Outlook2016
客户端测试,邮件接收方的发件人位置显示”XXX代表XXX”,伪造失败
很多时候,大部分的企业邮箱SPF配置都是正确的,理论上,它会对每一封邮件进行检测,那么它是如何验证发件人IP地址的?
我们使用一个SPF在线检测的工具,来做一个的尝试,利用我本地搭建的匿名SMTP服务器伪造 [email protected] 邮箱。
测试地址:https://www.kitterman.com/spf/validate.html
1、在IP address: 里输入将要发信的IP地址,即本地ip地址。
2、SPF Record v=spf1...://-->:输入nslookup查出来的SPF记录
3、Mail From address:输入将要发信的发件人
点击Test SPF Recod进行验证:
结果毫无疑问,SPF验证失败,伪造邮箱不成功,伪造的邮件将会被退回。
通过查看邮件头信息,有两个比较重要的字段,Sender和From。
Sender字段,代表的是邮件的实际发送者,邮件接收方会对它的邮件域名进行SPF检测,确认是否包含了发信人的IP地址。From字段,代表的是邮件发送人,即邮件里所显示的发件人,容易被伪造。
在SPF配置有效的情况下,Sender必须通过SPF检验,所以我们可以设置为正常的邮件服务器地址,然后对From字段进行伪造。
使用swaks做一个邮件测试:
sudo ./swaks --to 67*****[email protected] --from [email protected] --h-From: '=?GB2312?B?UVHTys/kudzA7dSx?= ' --ehlo evil.com --body hello --header "Subject: test"
--from <实际发件人,对应Sender字段>
--h-From <邮件显示的发件人,对应From字段>
QQ邮箱网页版查看邮件,Sender和From字段不一样时,发件人的位置显示由[email protected]代发。
使用Foxmail客户端查看同一封邮件,Sender和From字段不一样时,不显示代发,伪造成功。
我们分别使用网页版邮箱和客户端邮箱打开同一封邮件,通过对比可以发现,不同的邮件客户端对发件人位置的内容解析是不一样的。
平时工作中,不少使用腾讯企业邮箱的童鞋,都喜欢使用Foxmail客户端查收邮件,这就给了我们成功伪造邮件的可乘之机。
通过测试可以发现:qq邮箱、163邮箱网页版均会显示代发,Outlook邮箱不显示代发,具体邮件客户端软件可具体再行测试。
当我们伪造邮件发送的时候,Sender和From字段不一样,邮件接收方会这样提示邮件代发。
那么有没有办法只显示伪造的发件人,不显示邮件代发呢?
在网络上看到一种思路,来源于网贴《关于邮件伪造的一些新思路》,挺有意思的。
在用SMTP发送电子邮件时,发件人别名,格式为:From:发件人别名<邮件地址>
。通过对发件人别名字段填充大量的特殊字符,使邮箱客户端截取真实的邮件地址失败,从而只展示我们伪造的发件人别名和伪造邮箱。
邮件伪造测试过程:
From:=?gb2312?B?udzA7dSxIDxhZG1pbkBxcS5jb20+0aGhoaGhoaGhoaGhoaGhoaGhoaGhoQ==?=
=?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?=
=?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?=
=?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?=
=?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?=
=?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoSAgICAgICAgICAgICAgICAgIKGkoaQ=?=
=?gb2312?B?oaQgICAgICAgICAgICAgICAgIKGhICAgICAgIKGkoaShpA==?=
使用 —data 参数发送邮件
sudo ./swaks --data mail.eml --to 67*****[email protected] --from [email protected]
成功发送给目标邮箱,QQ邮箱接收邮件后的呈现效果
备注:从测试情况看,伪造的邮件进了QQ垃圾箱,但这种思路还是挺不错的,重新Fuzz,或许可以构造特殊的数据包触发这个问题。
如果目标邮件服务器没有配置SPF的话,可以直接使用swaks伪造邮件发送
参考文章:邮件伪造之SPF绕过的5种思路
红队测试之邮箱打点
SPF 记录:原理、语法及配置方法简介