文章目录

  • 什么是spf
  • dns复习
    • A和NS
    • CNAME
      • 我们一块学习一下CDN
      • dns地区分派
      • dns负载均衡
      • dns错误转移
    • MX
      • 使用smtp发送邮件
      • 发送自定义邮件失败的原因
      • 探究spf
      • 那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

学习spf记录引发的问题(一)相关推荐

  1. 神经网络学习小记录2——利用tensorflow构建循环神经网络(RNN)

    神经网络学习小记录2--利用tensorflow构建循环神经网络(RNN) 学习前言 RNN简介 tensorflow中RNN的相关函数 tf.nn.rnn_cell.BasicLSTMCell tf ...

  2. 关于NB-IOT模块链接阿里物联网平台的学习笔记-记录

    关于NB-IOT模块链接阿里物联网平台思路的学习笔记-记录 叙述 调试思路总结 调试过程 AT命令-方式一 AT命令-方式二 AT命令-方式三 软件 关于遇到问题 总结 叙述 前一段是写了一篇&quo ...

  3. Hadoop学习全程记录——在Eclipse中运行第一个MapReduce程序

    网友分享,拿来共享一下 这是Hadoop学习全程记录第2篇,在这篇里我将介绍一下如何在Eclipse下写第一个MapReduce程序. 新说明一下我的开发环境: 操作系统:在windows下使用wub ...

  4. python多分类混淆矩阵代码_深度学习自学记录(3)——两种多分类混淆矩阵的Python实现(含代码)...

    深度学习自学记录(3)--两种多分类混淆矩阵的Python实现(含代码),矩阵,样本,模型,类别,真实 深度学习自学记录(3)--两种多分类混淆矩阵的Python实现(含代码) 深度学习自学记录(3) ...

  5. DNS的A、CNAME、MX、NS、TXT、SPF记录

    前言 最近工作过程中需要设定邮件服务器,其中涉及到dns服务器的设定. 整理并且记录自己的理解. 种类 A.CNAME.MX.NS.TXT.SPF 下面挨个介绍一下. A记录/AAAA记录 IPv4: ...

  6. MySQL学习足迹记录01--SOURCE,SHOW

    MySQL学习足迹记录01--SOURCE,SHOW MySQL学习足迹记录02--SELECT MySQL学习足迹记录03--ORDER BY,DESC MySQL学习足迹记录04--数据过滤--W ...

  7. Activiti 学习笔记记录(2016-8-31)

    上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件 转载于:https://ww ...

  8. 【深度学习】深度学习实验记录--自编码+分类器

    深度学习课程记录 自编码分类器神经网络记录 1.Train the autoencoder by using unlabeled data 训练1(fail) 训练2(fail) 训练3(fail) ...

  9. Kal系统学习:记录一次wifi破解过程

    Kal系统学习:记录一次wifi破解过程 1.前期准备: 监听网卡(tb就3.40一张) kali系统 2 正式开始: 2.1 提升权限 以下的操作我们都需要提升权限,默认的root密码都是kali ...

  10. 命令查看spf_什么是SPF、邮箱域名SPF记录查询方法

    新闻资讯 您的位置: 首页> 新闻资讯 什么是SPF.邮箱域名SPF记录查询方法 发布时间:2019-04-28 SPF(Sender Policy Framework) 是电子邮件系统中发送方 ...

最新文章

  1. 七段数码管段码表共阳_常用数字电路之显示篇数码管
  2. extjs 前端js代码调用后台函数方法
  3. OTL翻译(9) --常量的SQL语句
  4. (49)Verilog HDL SPI接收设计
  5. 详细分析小米抢购软件的实现步骤
  6. Thinkphp 6.0商城系统,B2C商城系统全新UI
  7. VTN泛读【Video Transformer Network】
  8. 设计模式大作业绘图系统【六种设计模式+文档】
  9. 琴生(jensen)不等式
  10. linux蓝牙鼠标唤醒电脑,蓝牙鼠标唤醒电脑,蓝牙鼠标怎么设置唤醒电脑
  11. android 自定义属性
  12. 基于人工势场法的二维平面内无人机的路径规划的matlab仿真,并通过对势场法改进避免了无人机陷入极值的问题
  13. 代理arp 无故arp 反向arp
  14. 影子系统详细内容最强大全
  15. 上海python周末培训班_上海python周末班
  16. discuz X3.2 DB:类数据库操作
  17. 关于c++中缺省问题的总结
  18. linux命令:at 命令
  19. 中艺人脸识别考勤机使用方法_人脸识别考勤机的使用方法
  20. VMware安装vmtools后不能粘贴复制和拖拽文件

热门文章

  1. 苹果iPad mini 5蜂窝数据版上架:3896元起
  2. 计算机类耗品有哪些,办公用品和办公耗材清单有哪些?
  3. 超详细! 利用Synopsys VCS对Verilog代码加密的四种方法
  4. java 多线程 原子_Java多线程:原子量
  5. 中国微型连接器市场趋势报告、技术动态创新及市场预测
  6. uniapp调用芯烨xprinter打印机安卓sdk
  7. C语言——链表简单介绍
  8. 可能是数据最全的世界各国地区下拉级联,包含国际化中英文
  9. 电脑外接显示器或ipad分屏
  10. TFIDF的原理及实现