文章总结: 本文详细介绍了SPF(SenderPolicyFramework)邮件安全机制及其绕过技术。文章首先解释了SPF的基本原理和配置格式,然后系统总结了多种SPF绕过方法,包括SPF解析不当、配置不当以及邮件客户端内容解析绕过等。关键发现是即使配置了SPF,攻击者仍可通过语法错误、IP段过大、软拒绝策略、内外网DNS解析差异、伪造Sender和From字段等方式绕过验证。文章建议管理员应正确配置SPF记录,使用硬拒绝策略,并确保邮件服务器支持SPF检查,同时建议安全人员了解这些绕过技术以进行有效防护。
综合评分: 87
文章分类: 网络安全,应用安全,漏洞分析,渗透测试,应急响应
邮箱伪造之SPF绕过
原创
信安路漫漫
信安路漫漫
2025年7月29日 07:00
上海
前言
目前钓鱼邮件在hw中使用的越来越频繁,如果能到得到被调公司的域名,那么对于钓鱼来说是事倍功半的。目前很多公司的邮箱域名都设置了SPF,本篇文章就来看看SPF如何进行绕过。
专注分享安全知识,如果感觉对你有点作用,麻烦点下关注,在此谢过了。
#
SPF简介
SMTP(SimpleMail Transfer Protocol) 即简单邮件传输协议,正如名字所暗示的那样,它其实是一个非常简单的传输协议,无需身份认证,而且发件人的邮箱地址是可以由发信方任意声明的,利用这个特性可以伪造任意发件人。
SPF出现的目的,就是为了防止随意伪造发件人。SPF,全称为 Sender Policy Framework,是一种以IP地址认证电子邮件发件人身份的技术。邮件接收方首先会去检查域名的SPF记录,来确定发件人的IP地址是否被包含在SPF记录里面,如果在,就认为是一封正确的邮件,否则会认为是一封伪造的邮件并进行退回。
众所周知,如果没有配置SPF,攻击者可以任意伪造邮件,即使配置了SPF,在特定的情况下,依然可以完美伪造邮件发件人。当我们开始查看一个目标邮箱的SPF记录时,一场关于邮件安全策略的对抗也就开始了。
#
查看是否配置了SPF
nslookup -type=txt qq.com
#
SPF的配置格式
| | | | |
| — | — | — | — |
| 语法元素 | 说明 | 示例 | 注意事项 |
| 版本声明 | 固定以 v=spf1 开头,表示使用SPF协议版本1 | v=spf1 … | 必须为首项 |
| 机制 | 定义授权发送邮件的服务器规则 | | |
| – ip4 / ip6 | 指定IPv4/IPv6地址或CIDR范围 | ip4:192.0.2.0/24 ip6:2001:db8::/32 | 支持单个IP或网段 |
| – a | 允许域名A记录对应的IP发送邮件 | a:mail.example.com | 默认使用当前域名 |
| – mx | 允许域名MX记录对应的服务器发送邮件 | mx | 通常用于企业邮件服务器 |
| – include | 引用其他域名的SPF记录 | include:_spf.google.com | 需确保被引用域配置正确 |
| – all | 匹配所有未明确指定的IP,通常用于结尾 | -all | 必须搭配限定符使用 |
| 限定符 | 控制匹配结果的处理方式 | | |
| – + (Pass) | 明确授权(默认值,可省略) | +ip4:192.0.2.1 | 邮件会被接受 |
| – – (Fail) | 硬失败,直接拒绝邮件 | -all | 严格模式推荐使用 |
| – ~ (SoftFail) | 软失败,标记但可能接受邮件 | ~ip4:203.0.113.0/24 | 常用于过渡期 |
| – ? (Neutral) | 中性结果,不表态 | ?include:example.net | 极少使用 |
| 修饰符 | 可选扩展功能(如重定向或解释说明) | | |
| – redirect | 将验证重定向到另一域名的SPF记录 | redirect=example.com | 替代 include 的简写方式 |
| – exp | 定义失败时的说明信息链接 | exp=explain._spf.example.com | 需配置对应的TXT记录 |
示例
"v=spf1 -all" (拒绝所有,表示这个域名不会发出邮件)"v=spf1 +all" (接受所有)"v=spf1 ip4:111.111.0.1/16 -all"(只允许 111.111.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:111.111.1.1 -all"(允许当前域名的 a 记录和 mx 记录和一个给定的IP地址发送邮件)"v=spf1 include:example.com -all"(采用和 example.com 一样的SPF记录)
SPF绕过总结
SPF解析不当
1)语法错误导致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记录中,存在多个IP段,但只有开头的一段ip用了ipv4,这就导致了语法错误。因为这个错误,将导致整个SPF记录完全失效,因为SPF无效,邮件接收方的SPF检测功能也就失效了。
2)允许的IP端过大,只要攻击者拿下一台网段内的机器即可绕过
3)~all 软拒绝,会接收来信,但可能被标记为垃圾邮件(outlook 邮箱可以接收邮件,qq 邮箱不接收,163 邮箱标记为垃圾邮件)SPF记录设置硬拒绝,就会有大量的邮件被丢弃或者隔离,影响办公效率,为了减少业务影响,有些管理员采用软拒绝的策略,但也会在一定程度上造成安全风险
SPF配置不当
1)域名增加了SPF记录,但是邮件服务器不支持SPF检查或邮件网关未开启SPF检测,无法验证邮件来源。这种情况下,我们声明了自己是谁,但却无法验证对方是谁,SPF检测无效,可伪造任意用户发送到你的域名邮箱里
2)SPF解析在公网DNS,邮件服务器配置内部DNS,内部DNS无法进行SPF解析,从而导致绕过,可从公网伪造任意用户发送邮件(测试的时候要测试公网和内网发送邮件)
3)攻击者在公司内网,内网SMTP服务器开启匿名邮件发送或者在信任服务器IP段,就可以使用任意用户发送邮件
邮件客户端内容解析绕过
1)伪造发送别名
Sender字段,代表的是邮件的实际发送者,邮件接收方会对它的邮件域名进行SPF检测,确认是否包含了发信人的IP地址。From字段,代表的是邮件发送人,即邮件里所显示的发件人,容易被伪造。
在SPF配置有效的情况下,Sender必须通过SPF检验,所以我们可以设置为正常的邮件服务器地址,然后对From字段进行伪造。
使用swaks做一个邮件测试:
sudo ./swaks --to 67*****[email protected] --from [email protected] --h-From: '=?GB2312?B?UVHTys/kudzA7dSx?= <[email protected]>' --ehlo evil.com --body hello --header "Subject: test"其中参数:--from <实际发件人,对应Sender字段>--h-From <邮件显示的发件人,对应From字段>
QQ邮箱网页版查看邮件,Sender和From字段不一样时,发件人的位置显示由[email protected]代发。
2)From字段名截断绕过
在用SMTP发送电子邮件时,发件人别名,格式为:From:发件人别名<邮件地址>。通过对发件人别名字段填充大量的特殊字符,使邮箱客户端截取真实的邮件地址失败,从而只展示我们伪造的发件人别名和伪造邮箱。
邮件伪造测试过程:
1、在QQ邮箱中导出mail.eml文件,删除前面不必要的字段信息。
2、填充发件人别名,伪造邮件头Fron字段:
From:=?gb2312?B?udzA7dSxIDxhZG1pbkBxcS5jb20+0aGhoaGhoaGhoaGhoaGhoaGhoaGhoQ==?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh?==?gb2312?B?oaGhoaGhoaGhoaGhoaGhoaGhoaGhoSAgICAgICAgICAgICAgICAgIKGkoaQ=?==?gb2312?B?oaQgICAgICAgICAgICAgICAgIKGhICAgICAgIKGkoaShpA==?= <[email protected]>
3、使用 —data参数发送邮件。
sudo ./swaks --data mail.eml --to 67*****[email protected] --from [email protected]
邮箱的常见消息头以及作用
一、基本信息字段
-
From: 指定邮件的作者或发件人地址,但可能与实际发送者不一致;可由发件人自行编辑,常用于显示发件人姓名和邮箱。
-
To: 标识邮件的主要收件人地址,支持多个地址,用于指定邮件应送达的对象。
-
Subject: 邮件主题或标题,通常使用编码(如 Base64)支持多语言,可由发件人自定义。
-
Date: 记录邮件创建的时间戳,格式为标准日期时间(如 “Mon, 25 Mar 2024 12:45:00 +0800″。
-
CC 和 BCC:
-
CC: 抄送地址,用于指定次要收件人,收件人列表。
-
BCC: 密送地址,收件人不可见其他人地址,常用于匿名发送。
二、传输与路由字段
- Received: 记录邮件传递的完整路径,每个中转服务器自动添加一行,包含发送时间、服务器 IP/域名及协议;用于追踪邮件路由和诊断投递问题23。示例:Received: from mail.example.com by mailserver.example.net; Mon, 8 Aug 2023 10:00:00 -0400。
- Return-Path: 指定退信地址,当邮件无法投递时,错误信息将发送至此。
- X-Originating-IP: 显示邮件的原始来源 IP 地址,有助于识别发送服务器地理位置。
- DKIM-Signature: 用于验证邮件真实性的加密签名字段,防止伪造和钓鱼攻击。
三、其他重要字段
- Sender: 标识邮件的实际发送者地址;若与 From 不同,部分客户端会显示“代发”标志。
- Message-ID: 邮件的唯一标识符,类似身份证号,用于追踪和引用特定邮件。
- Reply-To: 指定回复邮件的目标地址,可能与 From 不同。
- Content-Type: 定义邮件内容的类型(如文本、HTML、图像),格式为“主类型/子类型”(如 text/plain 或 multipart/mixed),支持多媒体和非 ASCII 字符。
- MIME-Version: 标识使用的 MIME 协议版本,确保邮件正确处理附件和编码。
- Content-Transfer-Encoding: 指定正文传输编码方式(如 Base64),用于解码非文本内容
参考链接
https://www.cnblogs.com/yizhiyuyyy/p/18083458
https://cloud.tencent.com/developer/article/1631003
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:信安路漫漫 信安路漫漫《邮箱伪造之SPF绕过》