• 浅谈SPF配置不当导致的任意邮件伪造漏洞


    1.1前提

    最开始从其他师傅那里见到这个漏洞,参照一些师傅的博客学习了一下SPF记录的相关安全问题,今天来聊聊吧,首先要介绍一个协议和两个记录。

    • SMTP协议是简单的邮件传输协议,目前邮件还是使用这个协议通信,但是它本身并没有很好的安全措施。SMTP协议本身没有机制鉴别寄件人的真正身份,电子邮件的“寄件者”一栏可以填上任何名字,于是伪冒他人身份来网络钓鱼或寄出垃圾邮件便相当容易,而真正来源却不易追查。
    • MX记录用于指定负责处理发往收件人域名的邮件服务器。MX记录允许设置一个优先级,当多个邮件服务器可用时,会根据该值决定投递邮件的服务器(值越小优先级越高)。SMTP会根据MX记录的值来决定邮件的路由过程。
    • SPF记录的全称为 Sender Policy Framework,中文译作“发件人策略框架”,它是一套电子邮件认证机制,可以确认电子邮件确实是由网域授权的邮件服务器寄出,防止有人伪冒身份网络钓鱼或寄出垃圾电邮。SPF允许管理员设定一个DNS TXT记录或SPF记录设定发送邮件服务器的IP范围,如有任何邮件并非从上述指明授权的IP地址寄出,则很可能该邮件并非确实由真正的寄件者寄出。

    这里做一个小总结:配置SPF记录的目的就是防止随意伪造发件人

    1.2语法

    查看一个域名的SPF记录命令:

    nslookup -type=txt example.com //windows
    dig -t txt example.com //linux

     

    SPF记录会结合“匹配机制”和“限定词”使用,它其实就是一条有特殊语法的TXT记录

    匹配机制主要用于定义和指定可由该域名发送邮件的主机,其定义方式包括:

    • all 匹配任何主机,它写在SPF记录最后以匹配在其前面所列出的主机
    • ip4 匹配 IPv4 地址或网络范围
    • ip6 匹配 IPv6 地址或网络范围
    • a 匹配主机名或域名
    • mx 匹配域名的MX记录,当出站与入站邮件为同一服务器时通常采用此种机制
    • ptr 通过DNS反向记录来匹配发件人IP和域名,由于会增加DNS负载,一般不采用此种机制
    • exists 只检查域是否在DNS中存在
    • include 将发件人IP和SPF记录指向另一个域,这种匹配机制通常用于云服务,如 Exchange Online Protection

     

    匹配机制会结合一些限定词来使用,以告诉服务器找到一条匹配记录时该怎么办。常见的限定词有:

    • + 放行,如果没有明确指定限定词,则为默认值
    • - 硬拒绝,直接拒绝来自未经授权主机的邮件
    • ~ 软拒绝,邮件可被接受,也可被标记为垃圾邮件
    • ? 中性,不考虑邮件是否被接受

     

    一些实例(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:173.194.72.103 -all"(允许当前域名的 a 记录和 mx 记录和一个给定的IP地址发送邮件)
    "v=spf1 include:example.com -all"(采用和 example.com 一样的SPF记录)

     

    1.3绕过

    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 字段特殊字符填充绕过

     

    1.4总结

    上一小节只讲了前三点进行SPF绕过的原理,因为写这篇随笔的初衷是如何判断邮件服务器有无配置SPF,如果没有或配置不当的话可以直接使用 swaks 伪造邮件发送,思路偏向于防守和挖洞,而后两点则是运用一些技术实践任意邮件伪造漏洞,思路偏向于红队,接下来会再出一篇实操任意邮件伪造的思路。

     

     

    参考文章:

    http://www.renfei.org/blog/introduction-to-spf.html

    https://zh.wikipedia.org/wiki/%E5%8F%91%E4%BB%B6%E4%BA%BA%E7%AD%96%E7%95%A5%E6%A1%86%E6%9E%B6#cite_note-3

    https://www.cnblogs.com/xiaozi/p/12906040.html

    https://blog.csdn.net/qq_36119192/article/details/106452010

    https://anchorety.github.io/2020/10/18/%E9%82%AE%E4%BB%B6%E5%AE%89%E5%85%A8%E4%B9%8B%E5%8F%91%E4%BB%B6%E4%BA%BA%E4%BC%AA%E9%80%A0/

  • 相关阅读:
    array_keys
    strval
    is_numeric
    php static延迟静态绑定
    page39 类的访问权限控制
    page34类的继承
    被遗忘在角落的类型检查函数
    2.2.5重写静态变量
    2.2.3使用parent作用域
    16个最棒的WordPress博客写作发布工具【博主桌面工具】
  • 原文地址:https://www.cnblogs.com/wkzb/p/15401932.html
Copyright © 2020-2023  润新知