学习spf记录引发的问题(一)

什么是spf

刷hackerone的时候发现了个帖子:https://hackerone.com/reports/1416701
标题是Missing SPF record on trycourier.app domain which has been retired a while ago.
然后就开始学习什么是spf
在这里插入图片描述
是为了防范垃圾邮件所提出来的一种DNS记录类型,它是一种TXT类型的记录,它用于登记某个域名拥有的用来外发邮件的所有IP地址。

dns复习

dns有点忘了,重新学下dns,找到阮一峰的dns入门
我在centos上安装的dig,使用命令:

yum install bind-utils

文章中其中一条域名解析出了四个ip,我就很费解,印象中一个ip可以对应多个域名,而一个域名不能对应多个ip。我就开始寻找原因
其中https://www.leosem.com/idc_211951给出一个答复:

一个域名对应多个IP地址的时候,智能DNS服务器会根据请求的线路、地理位置等信息综合考虑,返回对于该请求最快的IP
如一个域名可以分给电信、联通、南方、北方等多个线路多台分布式的服务器使用,这样对各种用户来说,访问的服务器都是距离自己较近的
一个域名对应一个网站,但网站的内容可以镜像的存在多个位置、线路不同的运营商机房中

阮一峰给出的答复:

A记录和MX记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。

我查询了百度的四个ip,依次访问,确实都返回了百度的首页
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所以域名服务商到底是什么,他们怎样与baidu.com之间存在的联系?
这个问题先放到这,暂且回到阮一峰的文章

A和NS

什么是NS记录?
NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析

dig +trace baidu.com

在这里插入图片描述
首先我的虚拟机网关192.168.46.2返回.域名(根域名)由哪个dns服务器来进行解析,也就是ns服务器
在这里插入图片描述
然后依次对这些跟域名服务器发送消息,解析.com.,其中m.root-servers.net最先返回.com.的ns服务器。
在这里插入图片描述
接着依次询问这些.com.的ns服务器,baidu.com.的ns服务器在哪里。然后a.gtld-servers.net最先返回baidu.com.的5条ns服务器的位置,然后访问这5条ns服务器baidu.com的A记录,最终ns7.baidu.com最先返回两条A记录,也就是说baidu.com对应的ip地址为:220.181.38.251220.181.38.148。完毕
简化查法可以

查询A记录
dig A baidu.com
查询ns记录
dig ns baidu.com

CNAME

知乎下两个中肯的回答:
1.
在这里插入图片描述
2.
在这里插入图片描述
我们来找一个cname的例子,比如xz.aliyun.com
在这里插入图片描述
显然根据英文名,翻译成中文是:云盾waf1,是云盾waf的一个子域名9jxvmf8y7ujfl8hppt35mhqud9gbndab
我们来云盾官网看下,他们的waf都有什么功能:
在这里插入图片描述
应该是同时部署WAF和CDN了,CDN下面就是CNAME配置的部分
在这里插入图片描述
我突然想到,如果我创建一个网站,通常我会在阿里云华为云等购买vps,vpc服务。这些服务会给我一个公网ip,那如果是购买vps服务,公网ip不会改变,vpc则会变更公网ip。此时还有必要接通cdn吗,或者这些vps,vpc有没有自动的部署cdn?

我开通了阿里云的cdn服务,这个开通不花钱

我们一块学习一下CDN

在这里插入图片描述
也就是接通了阿里云的waf和cdn之后既能防护网络攻击,同时会部署网站到全球各地的cdn节点,这也就解释了最上面的问题:为什么同一个域名,可以对应多个ip。有一种可能是网站域名(比如www.aliyundoc.com)托管到阿里云的cdn,那么会有很多cdn的ip对应到域名。

下面是阿里云cdn加速原理,获取托管域名ip的规则
假设您的加速域名为www.aliyundoc.com,接入CDN开始加速服务后,当终端用户在北京发起HTTP请求时,处理流程如下图所示。请添加图片描述

1.当终端用户向www.aliyundoc.com下的指定资源发起请求时,首先向Local DNS(本地DNS)发起请求域名www.aliyundoc.com对应的IP。
2.Local DNS检查缓存中是否有www.aliyundoc.com的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向网站授权DNS请求域名www.aliyundoc.com的解析记录。
3.当网站授权DNS解析www.aliyundoc.com后,返回域名的CNAME www.aliyundoc.com.example.com。
4.Local DNS向阿里云CDN的DNS调度系统请求域名www.aliyundoc.com.example.com的解析记录,阿里云CDN的DNS调度系统将为其分配最佳节点IP地址。
5.Local DNS获取阿里云CDN的DNS调度系统返回的最佳节点IP地址。
6.Local DNS将最佳节点IP地址返回给用户,用户获取到最佳节点IP地址。
7.用户向最佳节点IP地址发起对该资源的访问请求。
8.如果该最佳节点已缓存该资源,则会将请求的资源直接返回给用户(步骤8),此时请求结束。
9.如果该最佳节点未缓存该资源或者缓存的资源已经失效,则节点将会向源站发起对该资源的请求。10.获取源站资源后结合用户自定义配置的缓存策略,将资源缓存到CDN节点并返回给用户(步骤8),此时请求结束。配置缓存策略的操作方法,请参见配置缓存过期时间。

这里在步骤3中提及了CNAME,当www.aliyundoc.com设置了CNAME时DNS就会去访问CNAME的解析记录,进而返回最佳节点的CDN的ip。
这意味着我们访问www.aliyundoc.com网站获取的不是真实的ip。真实ip在步骤9当中由最佳cdn节点发起请求。
我们在渗透测试当中经常会需要获取真实节点ip的需求,但是往往存在cdn加速,我们来学一下如何绕过cdn,获取真实ip。还是以xz.aliyun.com为例

直接dig A xz.aliyun.com是不行的,返回的是cdn节点ip
在这里插入图片描述
直接访问会报错
在这里插入图片描述
这篇文章给出了几个办法:https://cloud.tencent.com/developer/article/1634648
我尝试用钟馗之眼搜索并访问ip:
在这里插入图片描述
在这里插入图片描述
难道是设置了禁止通过ip访问网站?不过这个确实应该是先知社区的真实ip,我们通过wget访问一下
在这里插入图片描述
试一下censys网站,利用ssl证书搜索,第一个仍然是47.96.147.31,443端口,地址在杭州。其他的ip地址都是引用了xz.aliyun.com的文章,大部分都是同样学习网安的文章,发布到先知社区的。
,
再试一下外国多地ping,
这里为什么不能国内多地ping呢,如图所示,因为都是cdn节点的ip。
在这里插入图片描述

基本可以确定xz.aliyun.com的ip地址了

再看一下知乎答主所说的以下内容,学一学dns的花样:
dns地区分派,dns负载均衡,dns错误转移

dns地区分派

dns负载均衡

dns错误转移

MX

尝试使用dig +trace mx baidu.com
轮询前面都一样,直到查到baidu.com的五条ns记录
在这里插入图片描述
最终ns3.baidu.com先返回了6条mx记录

什么是 DNS MX 记录?

DNS“邮件交换”(MX) 记录(A mail exchanger record)将电子邮件定向到邮件服务器。MX
记录指示如何根据简单邮件传输协议(SMTP,所有电子邮件的标准协议)路由电子邮件。与 CNAME 记录类似,MX 记录必须始终指向另一个域。

电子邮件服务器是什么呢?

邮件服务器与其它程序协同工作用以组成有时被称作消息系统的内容。消息系统包括了所有必要的应用程序来保证电子邮件按照应有的路径传送。当你发送电子邮件消息时,你的电子邮件程序,如Outlook或Eudora,发送消息到你的邮件服务器,它再依次发送到其它邮件服务器或同一服务器的保存区,过后再发送出去。作为一个规则,该系统使用SMTP(简单邮件传送协议)或ESMTP(扩展SMTP)来发送电子邮件,使用POP3(电子邮局协议3)或IMAP(因特网消息访问协议)来接收电子邮件。 [2]

也就是说,比如我们用qq邮箱,写一个邮件发送出去,首先邮件会存储在qq的电子邮件服务器中,然后再使用smtp协议等进行转发等步骤。电子邮件服务器也就是下文中我们的mx记录

不难看出baidu.com的mx记录指向的域。域前面的数字是优先级,较低的优先级是首选,所以服务器将始终先尝试mx.maillb.baidu.com,其发送失败时会尝试mx.n.shifen.com以此类推。优先级相同的服务器会根据平衡负载收到相同数量的邮件

baidu.com.		7200	IN	MX	20 jpmx.baidu.com.
baidu.com.		7200	IN	MX	20 mx50.baidu.com.
baidu.com.		7200	IN	MX	20 usmx01.baidu.com.
baidu.com.		7200	IN	MX	10 mx.maillb.baidu.com.
baidu.com.		7200	IN	MX	15 mx.n.shifen.com.
baidu.com.		7200	IN	MX	20 mx1.baidu.com.

使用smtp发送邮件

我们尝试使用smtp协议向电子邮件服务器发送邮件,这里使用163邮箱服务器,因为百度只有企业邮箱,供企业内部使用。而163有免费邮箱,任何人都可以注册使用。
首先把我们的windows开启telnet命令参考https://help.aliyun.com/document_detail/40796.html

输入:telnet 163mx00.mxmail.netease.com 25
或者先输入telnet再o 163mx00.mxmail.netease.com 25

在这里插入图片描述

连接成功
在这里插入图片描述
先要发送EHLO mx.maillb.baidu.com,向邮件服务器提供连接的域名,发送标识。如果不发EHLO会产生错误
然后登陆用AUTH LOGIN
接下来输入账号的base64编码youaccent@163.com
然后输入密码的base64编码password
结果返回550 User has no permission
在这里插入图片描述
哎,行吧。的确是有我这个用户,但是应该没有权限登录。

然后尝试发送邮件
通过 SMTP 协议发送邮件的整体过程如下:

客户端使用 telnet 命令连接到SMTP服务器,建立会话。
客户端发送一个 HELO 或 EHLO 命令向邮件服务器提供连接的域名,身份标识
客户端发送一个 AUTH 认证命令进行用户登录(使用 smtpd 方式)。
客户端发送一个 MAIL FROM:<test@qq.com>命令指定发件人。
客户端发送一个 RCPT TO:<test@163.com>命令指定收件人。
客户端发送一个 DATA 命令准备输入邮件正文。
客户端发送一个 <回车>.<回车> 命令表示 DATA 命令结束。
客户端发送一个 QUIT 命令结束会话。

MAIL FROM:<account@qq.com>指定发件人。结果报错MI:SPF,也就是写这篇文章的重点
在这里插入图片描述

我们回到spf,我们先访问网易邮箱给出的报错网址:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
他给出了

发送自定义邮件失败的原因

在这里插入图片描述
其中spf位于如下位置
在这里插入图片描述
我们可以尝试一下spf上面的报错:发信人电子邮件地址不合规范
在这里插入图片描述
报错确实是MI:IMF
我们回到spf的定义:

SPF 记录是由域名管理员发布在 DNS 中的 TXT 记录。SPF 记录指定一个 IP 地址的白名单,在该白名单中的 IP 地址被允许来代表该域名发送邮件。当邮件到达目标服务器的时候,服务器会在 DNS 中查找该 SPF 记录,然后用 SPF 记录来判断该邮件是否来自于一个被授权的 IP 地址。

探究spf

我使用qq.com的时候出现了spf报错,但是尝试使用123.com的时候就没有报错,并返回了250 Mail OK
在这里插入图片描述
这证明spf检验是通过@后面的域名。网易邮箱使用dns查询qq.com这个域名拥有的用来外发邮件的所有ip地址,其中没有我的电脑所在的ip,所以就不允许我发送,所以就报错了。

紧接着我继续用刚没报错的随意填的邮件账号2849771625@123.com来发送邮件,这次可以向我注册的网易账号发送邮件,只不过他报错了DT:SPM,是因为我发送的邮件正文带有敏感词,等待一会
在这里插入图片描述
再次发送,发送成功,我伪造一个123.com的随机用户发送了邮件
在这里插入图片描述
自动保存在了垃圾邮件里
在这里插入图片描述
我们研究一下:网易反垃圾邮件政策说明
其中明确指出:3、使用或包括伪造的、无效的或者不存在的域名;
在这里插入图片描述
之所以网易没有对123.com进行spf拦截,是因为根本就不存在此域名,所以网易没有查到相关spf记录,暂时没有spf拦截,而因为123.com域名无效,所以就被放在了垃圾邮件的位置。

那spf如何设置查看呢?

首先进行说明一下

如果希望对域名进行标识和说明,可以使用 TXT 记录,绝大多数的 TXT 记录是用来做 SPF 记录(反垃圾邮件)。

所以查看spf记录,基本上等价于查看txt记录,我们来看谷歌邮箱gmail.com的spf记录。同理可以查看网易邮箱和qq邮箱
在这里插入图片描述
解释一下,所有的 SPF 记录严格地以 “v=spf1” 开始,redirect的含义是把整个gmail.com的spf交给_spf.google.com来处理,
基于上面的信息,我们来尝试dig一下_spf.google.com
在这里插入图片描述
include 可以让 SPF 记录把定义在另外一个 SPF 记录中的第三方 IP 地址包括进来。
我们尝试dig一下第一个_netblocks.google.com的spf记录
在这里插入图片描述
解释一下,从位于ip4:35.190.247.0/24 ip4:64.233.160.0/19 等之间的任何 IP 地址发送的邮件通过 SPF 认证,也就是说在以gmail.com名义发送邮件给网易的时候,网易会通过dns来查询gmail.com的spf,如果发送者在该ip列表里则通过验证。后面的~all代表前面的ip都不匹配的时候,温柔的拒绝(可能是拒绝的语气比较委婉)。还可以使用符号-代表强制拒绝,+代表通过,?代表看着办,看着办的意思是暂且允许只不过具体怎么处理要交给include这张表的域名单独设置,不添加符号默认为+。测试版建议使用~all,上线后建议使用-all

总结一下

1.一个域名如果开放了25号端口(存在邮件服务器),但是通过dig txt domain.com +short没有查到spf记录,那么任何人可以伪造该域名的邮箱(user@domain.com)来发送邮件
2.通过dig mx domain.com +short搜索到的邮件服务器域名然后telnet连接,后以一个真实邮箱用户(比如user@qq.com)的名义发送邮件并通过,则证明domain.com没有校验qq.com的spf。

spf是一个双方的约定,任何一方没有遵守都会引发问题。

我们测试一下常见的邮箱后缀

@gmail.com
@yahoo.com
@msn.com
@hotmail.com
@aol.com
@ask.com
@live.com
@qq.com
@0355.net
@163.com
@163.net           
@263.net                             
@3721.net  
@yeah.net
@googlemail.com
@mail.com

发现了这种问题,甚至bilibili的邮箱后缀都有outlook等字样:
在这里插入图片描述
这些邮箱的邮件服务器是使用了雅虎,outlook邮箱服务器的api。我在网上找到了这篇文章:
使用微软 Outlook API 接口给 WordPress 站点配置 SMTP 发送邮件
我测的时候直接就把我拉进黑名单了,算了。
在这里插入图片描述

关于smtp存在的其他漏洞:OpenBSD SMTP漏洞

参考:
https://www.ruanyifeng.com/blog/2016/06/dns.html
https://www.cloudflare.com/zh-cn/learning/dns/dns-records/dns-mx-record/
https://help.aliyun.com/document_detail/51622.html
https://www.sqlsec.com/2017/08/smtp.html#toc-heading-1
https://learnku.com/articles/55237
https://www.zhihu.com/question/22916306/answer/26650717
https://help.aliyun.com/document_detail/27101.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值