浅谈任意邮件伪造漏洞的利用与防护

浅谈任意邮件伪造漏洞的利用与防护。任意邮件伪造漏洞,是指攻击者可以通过此漏洞对网站管理人员或者运维人员发送钓鱼邮件,对相关人员进行钓鱼攻击,进一步获取网站或者服务器权限。

0x01 任意邮件伪造漏洞

任意邮件伪造漏洞,是指攻击者可以通过此漏洞对网站管理人员或者运维人员发送钓鱼邮件,对相关人员进行钓鱼攻击,进一步获取网站或者服务器权限。

假设test.com存在邮件伪造漏洞时,我们事先知晓了管理员账户为admin@test.com。我们利用邮件伪造漏洞冒充管理员尝试对test.com的用户发送邮件,此时,用户很可能会因为邮件来源是admin的账户,对邮件内容没有过多怀疑,直接进行点击其中存在的链接或者下载邮件中存在的文件,导致遭受到攻击。进而被攻击者获取控制权限。

在任意邮件伪造漏洞的利用中,最常用的工具就是kali自带的Swaks,其可以通过构造特定的内容实现邮件的伪造。

0x02 漏洞利用

Swaks介绍

Swaks是由John Jetmore编写和维护的一种功能强大,灵活,可脚本化,面向事务的SMTP测试工具。可向任意目标发送任意内容的邮件。一般在Kali中自带。

官方下载地址:http://www.jetmore.org/john/code/swaks/

Swaks的基本使用

Swaks中采用不同的参数对邮件进行伪造。

-t(--to):表示指定目标地址,一般使用Swaks -t进行邮箱连通性的测试,如:

swaks -t bewrmq02614@chacuo.net

image.png

我们在新建的临时邮箱中成功获取了到信息。

这里我利用http://24mail.chacuo.net/enus来获取一个用于测试的邮箱账号。

image (1).png

-f(--from):表示构造来源(发件人),如:

swaks -t bewrmq02614@chacuo.net -f admin@qq.com

image (2).png

可以发现此时的发件人(Sender)已经变成了admin@qq.com

image (3).png

-h(--ehlo、--lhlo、--helo):用于伪造邮件的ehlo头,即发件人邮箱域名,用于绕过身份验证。

--header:用于伪造邮件的标题,利用 "Subject:伪造标题"实现,如:

swaks -t bewrmq02614@chacuo.net -f admin@qq.com -h qq.com --header "Subject:test_title"

image (4).png

可以发现在该邮件中实现了修改标题(Title)。

image (5).png

--body:用于伪造邮件的内容,如:

swaks -t bewrmq02614@chacuo.net -f admin@qq.com -h qq.com --header "Subject:test\_title" --body "test\_body"

image (6).png

可以发现其中的邮件内容已经被实现伪造。

image (7).png

在输入swaks语句后,输出的内容中:

\===:表示Swaks输出的信息行。
*:表示Swaks中产生的错误。
->:表示正常情况下,发送到目标的预期行。
<- :表示正常情况下,服务器的预期回复。
<**:表示出现错误情况时,服务器返回的错误信息。

当语句前出现===时,则是表示是否连接。

当语句前出现->时,则是输入我们预期构造好的信息,如EHLO qq.com等。

当语句前出现<-时,返回250 OK表示成功实现伪造。

当语句前出现<**时,为存在问题,一般为<** 550 SPF check failed.。如:

我利用swaks向qq邮箱发起请求连接,遭受到了拒绝,因为QQ邮箱采取了SPF验证,检测我们发出邮件的ip与实际SPF中记录的ip不同,因此无法正常进行邮件发送。

1672970734353.png

当对方的邮箱未采取SPF验证,或者SPF可以被绕过时,我们就可以考虑构造一个完整的钓鱼邮件进行攻击。

构造一个完整的钓鱼邮件

此时,我们需要采用--data参数,如:

swaks --data 1.txt

txt中的内容为构造的完整邮件请求包。

我尝试从qq邮箱中找到一个steam重置密码的邮件,对其进行伪造。

1672973427515.png

选择其中的显示邮件原文,对文本进行复制,保存到txt文件中。

1672975450753.png

可以将其中的Received字段去除,然后将该邮件原文中我本来的qq邮箱,全部替换成我们目标的邮箱:qdxrus79146@chacuo.net,然后将原本的"继续恢复"链接,修改为www.baidu.com.

1672976388835.png

然后在swaks中进行测试。

swaks -t qdxrus79146@chacuo.net --data 1.txt 

1672976536121.png

成功接收到了邮件,并且发现继续恢复的链接已经修改成了百度。

image (8).png

image (9).png

在实际情况中,如果我们将百度的地址,修改成预设好的恶意链接,这样一封看起来很官方正式的邮件,往往能让用户放松警惕性,实现对目标用户的任意邮件伪造攻击。

那么,为了防范任意邮件伪造漏洞的攻击,我们就需要引入SPF验证进行防护。

0x03 漏洞防护

什么是SPF验证?

SPF是发送方策略框架(Sender Policy Framework)的缩写,一种以IP地址认证电子邮件发件人身份的技术,是非常高效的垃圾邮件解决方案。接收邮件方会首先检查域名的SPF记录,来确定发件人的IP地址是否被包含在SPF记录里面,如果在,就认为是一封正确的邮件,否则会认为是一封伪造的邮件进行退回。

利用SPF,可以避免发件人被随意伪造,导致攻击者冒充他人身份来实现钓鱼攻击和垃圾邮件攻击。

如何检查一个网站的SPF记录

在window机中,可以利用nslookup查看设置的spf信息。

nslookup -type=txt 域名

在Linux中,则采用dig进行获取信息

dig -t txt 域名

这里以百度为例

1672889704483.png
可以发现,百度的spf信息为

v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com include:spf4.baidu.com a mx ptr -all

SPF的设计

SPF的设置有对应的语法,可以将SPF视作一个具有特殊语法的TXT记录。通过”匹配机制“实现匹配对应的主机,通过”限定词“来告诉服务器找到匹配记录时应当如何进行处理。

常见的限定词包括:

+:表示放行,如果没有限定词时,其为默认值,如:

v=spf1 +all

表示接受所有域名发出邮件。

-:表示硬拒绝,直接拒绝来自未经授权主机的邮件,如:

v=spf1 -all

表示拒绝所有域名发出邮件。

~:表示软拒绝,邮件可被接受,也可被标记为垃圾邮件,这种情况一般是在测试中,如

v=spf1 ~all

接收方遇到这种情况时,通常采取的策略是放行或者标记为垃圾邮件。

:表示忽略,不考虑邮件是否被接受。

常见的匹配机制的定义方式包括了:

all:匹配任何主机,它写在SPF记录最后以匹配在其前面所列出的主机。

ip4:匹配ipv4地址或网络范围。如:

v=spf1 ip4:192.168.0.1/16 -all

表示匹配192.168.0.1/16网段下的所有IP进行邮件的发送,-all则表示拒绝除了限定的网段下其他IP进行邮件的发送。

ip6:匹配ipv6地址或网络范围。

a:匹配主机名或者域名,如:

v=spf1 a -all

假设该语句说明了允许发送 @test.com的IP地址,则其中的a则指test.com解析出来的ip。

mx: 匹配域名的MX记录,当出站与入站邮件为同一服务器时通常采用此种机制,如:

v=spf1 mx -all

假设该语句说明了允许发送 @test.com的IP地址,则其中的mx则指test.com对应的ip,即 mail.test.com的a记录所对应的ip。

v=spf1 mx mx:test.abc.com -all

表示允许当前域名和 test.abc.com 的 mx 记录对应的IP地址发送邮件。

ptr :通过DNS反向记录来匹配发件人IP和域名,由于会增加DNS负载,一般不采用此种机制。

exists :只检查域是否在DNS中存在。

include :非常常见的一种匹配方式,将发件人IP和SPF记录指向另一个域,这种匹配机制通常用于云服务。如:

v=spf1 include:test.abc.com -all

表示该地址采用和test.abc.com一样的SPF记录。

那么我们重新回到一开始百度的SPF记录,则可以表示其匹配与spf1.baidu.com、spf2.baidu.com、spf3.baidu.com、spf4.baidu.com相同的SPF记录,允许当前域名(baidu.com)的a记录及x记录,DNS反向记录进行邮件的发送,其余地址均拒绝。

一条合理的SPF记录,可以帮助我们很好的避免遭受到任意邮件伪造攻击,但是如果SPF配置出问题时,没有很好的发挥他的功能,也可能存在被绕过的情况。

SPF常见绕过思路

1、SPF解析不当,比如将允许的IP段范围选择为整个C段。

v=spf1 ip4:192.168.0.0/24 -all

此时,C端中其中一台电脑被攻击者拿下下,则可以利用该IP进行邮件伪造。

或者将限定词使用错误,采用软拒绝的方式。

v=spf1 ip4:192.168.0.1 ~all

或者将匹配机制使用错误,多条ip只使用一个ip4引入。

v=spf1 ip4:192.168.0.1 192.168.0.2 -all

2、SPF配置不当。

①:对域名增加SPF记录,但未对他人的SPF记录进行检测,导致无法对邮件的来源进行校验。(本文测试中的测试邮箱就是未对SPF进行校验)

②:邮件服务器配置在内网当中,SPF解析在公网中,内部的DNS无法对SPF进行解析,导致可以绕过。

③:攻击者通过内网的内网SMTP服务器,采用匿名邮件的方式进行发送邮件。或者SMTP服务器连接信任的IP数量过度,为一整个IP段,任意一台的终端可以连接SMTP服务器,导致伪造邮件发送。

3、邮件客户端对内容的解析不同,不同的邮箱客户端所解析的邮件头字段不同,导致可以被绕过。

4、对From字段进行特殊字符填充,使邮件客户端在验证SPF时验证失效,导致显示的实际发送人为我们伪造的发送人。实现任意邮件伪造。

0x04 总结

任意邮件伪造漏洞是一种很好的社工方式,在日常生活中如果对该漏洞的疏忽,可能会造成不可估量的风险。注意细节也是很重要的噢。

  • 发表于 2023-01-16 09:00:02
  • 阅读 ( 11153 )
  • 分类:漏洞分析

0 条评论

请先 登录 后评论
ENJOEY
ENJOEY

1 篇文章

站长统计