一、DNS基础知识:

1.DNS简介:

DNS 域名服务,用于建立 域名与 ip地址的 一对一 映射。DNS 将域名转换为 IP地址,以便浏览器能够加载 Internet 资源。

类似于一个翻译系统,将xxx.com 翻译为 ip地址(如:192.0.2.254),这种转换发生在幕后,因此用户只需记住域名,而不需要记住难记的IP

2.DNS数据包:

DNS数据包使用UDP进行封装,至于为什么使用UDP进行封装,可参考 为什么DNS使用UDP协议?

下面是DNS报文格式:

  • Transaction ID(16bit):事务ID,区分DNS应答报文对应哪个请求报文,DNS查询报文与DNS响应报文的会话ID相同,表示是对这个查询作出的响应。

  • Queries:其中包括查询的域名,查询的类型,查询的类。

    查询的类型,通常是A类型,表示要查的是域名对应的IP地址。第3节会进行详细介绍。

    查询类:地址类型,通常为互联网地址,值为1

  • Answers:一般在响应包,在请求包为空,主要包括name,type,address等,name表示要查的域名,type表示类型,同queries区域的类型,address 即返回的IP地址。

若想知道详细报文格式,可参考DNS报文格式解析(非常详细)

3.DNS记录类型:

DNS记录是用于解析的数据,最常见的3种记录为:NS记录、A记录、CNAME记录。

NS记录

如果DNS给你回应一条NS记录,就是告诉你,这个家伙是这个域的权威DNS,有事你去问它。

比如在com的DNS里,记录着baidu.com这个域的DNS,长的大概是这个样子:

baidu.com.  NS  ns1.baidu.com.
baidu.com. NS ns2.baidu.com.
baidu.com. NS ns3.baidu.com.

这三条记录,就是说ns1.baidu.com、ns2.baidu.com、ns3.baidu.com(以下简称ns1、ns2、ns3)都是baidu.com域的权威DNS,问任意其中一个都可以(一般都是顺序问的,如果连不上第一个,就去找第二个)。

注意,域名后面会比我们平时见到的多一个“.”,这就代表了根,严格地说,所有域名后面都应该有这一个“.”的,比如完整的www.baidu.com域名应该是www.baidu.com.,也可以把所有域名都看作有一个.root的后缀,比如www.baidu.com.root,但由于每个域名都有这个后缀,所以干脆就都省略了。

当然在com的权威域名服务器,也记录ns1,ns2,ns3这几个的ip地址,会一并返回让解析器去找这几个服务器解析。

A记录

A记录就是最经典的域名和IP的对应,在ns1.baidu.com里面,记录着百度公司各产品的域名和IP的对应关系,每一个这样的记录,就是一个A记录,比如下面的3个A记录(随意举的例子,IP都是随意写的)。

image.baidu.com   A   1.2.3.4
wenku.baidu.com A 5.6.7.8
tieba.baidu.com A 9.10.11.12

如果有人问ns1.baidu.com:“wenku.baidu.com的IP是多少?”,ns1就会找到对应的A记录或者CNAME记录并返回。

CNAME记录

这种记录比较有趣,你问DNS一个域名,它回CNAME记录,意思是说,你要解析的这个域名,还有另一个别名,你去解析那个好了。

比如,在ns1中,其实并没有www.baidu.com的A记录,而是一个CNAME记录:

www.baidu.com  CNAME  www.a.shifen.com

这就是在告诉递归解析器,www.baidu.com的别名是www.a.shifen.com,去解析www.a.shifen.com

其他记录类型

类型 描述
A记录 保存域名的IPv4地址的记录
AAAA记录 保存域名的IPv6地址的记录
NS 记录 存储 DNS 条目的权威域名服务器
CNAME 记录 将一个域或子域转发到另一个域,不提供 IP 地址
MX 记录 将邮件定向到电子邮件服务器
TXT 记录 可使管理员在记录中存储文本注释
SOA 记录 存储域的管理信息
SRV 记录 指定用于特定服务的端口
PTR 记录 把ip地址转化为域名

4.DNS服务器类型:

DNS递归解析器

也可以当作local DNS,也称为DNS解析器。是DNS查询中的第一站,作为客户端与 DNS 域名服务器的中间人。从 Web 客户端收到 DNS 查询后,递归解析器将使用缓存的数据进行响应,或者将向根域名服务器发送请求,接着向 TLD 域名服务器发送另一个请求,然后向权威性域名服务器发送最后一个请求。收到来自包含已请求 IP 地址的权威性域名服务器的响应后,递归解析器将向客户端发送响应。

大多数 Internet 用户使用他们 ISP 提供的递归解析器,但还有其他可用选择;例如 Google的8.8.8.8。

根域名服务器

一共有13个根域名服务器(并不表示只有13台计算机,13种类型),解析器查询的第一站,根域名接收到查询后,告知相应的顶级域名服务器(TLD DNS)所在域地址,如.com域。

顶级域名服务器

例如,.com TLD 域名服务器包含以“.com”结尾的每个网站的信息。如果用户正在搜索 baidu.com,则在收到来自根域名服务器的响应后,递归解析器将向 .com TLD 域名服务器发送查询,然后将通过针对该域的权威性域名服务器进行响应。

权威域名服务器

​ 递归解析的最后一站,查找IP地址的最后一步。此时根据要查询的域名,返回相应的IP地址或其他类型记录。

5.DNS解析过程:

客户端在浏览器输入example.com,去进行访问,需要找到该域名的IP地址。

1.向DNS 递归解析器(DNS Resolver)发送查询,优先查看缓冲区是否存在记录,若没有 ,继续 2。

2.向根域名服务器发出查询。

3.根域名服务器给出.com (TLD)顶级域名服务器的地址。

4.然后,DNS解析器向 .com TLD Server 发出请求。

5.TLD 服务器随后使用该域的域名服务器 example.com 的 IP 地址进行响应。

6.最后,递归解析器将查询发送到example.com的权威域名服务器。

7.权威域名服务器将example.com 的 IP 地址响应给解析器。

8.然后 DNS 解析器将最初请求的域的 IP 地址响应 Web 浏览器,并在自己的高速缓存,记录下来,以备下次使用,不用再次查询。

DNS 查找的这 8 个步骤返回 example.com 的 IP 地址后,浏览器便能发出对该网页的请求:

9.浏览器向该 IP 地址发出 HTTP 请求。

10.位于该 IP 的服务器将网页返回。

二、攻击原理:

这里引用,清华大学团队的原理图,进行解释。

trudy是一个偏离信道的攻击者(off-path),即不可以进行监听和篡改 递归解析器 到权威域名服务器 信道上的内容,trudy拥有一定的IP spoof 能力。

  • Trudy 通过web浏览器访问 www.bank.com,假如此时 resolver 缓存中并无此记录。
  • 解析器进行递归查询,向根域名服务器,顶级域名服务器,以及权威域名服务器发出查询。
  • 攻击者Trudy此时使用 bank.com的权威域名服务器IP地址,伪造 回应报文向 解析器发送。 该回应报文解析的IP地址,指向攻击者自己的服务器。
  • 解析器收到Trudy假冒的DNS响应报文之后,将 www.bank.com对应的假冒 IP =6.6.6.6 写入缓存。
  • 待真正的响应报文到达解析器时,为时已晚,此时解析器发现已经有了相应的记录,会进行丢弃
  • 这时 用户 Alice 想要访问www.bank.com,通过解析器查看自己的错误缓存表,会访问到一个错误的IP,得到一个攻击者伪造一模一样的错误页面。(此时如果用户输入各种账号密码,会被窃取。)

但真正的攻击却不是如此简单,根据上文介绍的DNS协议数据包,IP头|UDP头|DNS

攻击者伪造的响应数据包,如下:

注意:

这里的目的端口与事务ID都是未知的,攻击者如果想要同时爆破这两个字段,目的端口两个字节,事务ID两个字节,一共 \(2^{32}\)种可能,目前不太可能实现。

DNS权威域名服务器 响应的源端口 一般是确定的53端口, DNS 解析器客户端以前也默认用源端口53去查询,这样随机性只靠TxID,很容易进行攻击 ,\(2 ^{16}\),65536种可能。 2008年7月,Dan Kaminsky就利用了这个。因此,为了有效的防御,DNS解析器采取了源端口随机化。

为了解决上述问题,在这篇论文中,清华大学安全团队,提出了一种分治的思想,即先通过ICMP侧信道探测开放的端口,后猜测相应事务ID,一共 \(2^{17}\) 种可能。

另外,相应的扩大攻击窗口的时间,可更容易的实现这种进攻。

推测源端口

​ 这里只介绍其中的一个 Private Source Port Scan Method。首先了解一下以下知识:

IP速率限制: 比如IP 速率限制 为 1/s ,即在1秒这段时间内只限1个IP访问DNS解析器上的端口。

ICMP速率限制:表示在这段时间内,DNS解析器最多能发出的ICMP响应报文个数。比如:ICMP 速率限制为 50 /20ms ,这里表示 在20ms内只能返回50个ICMP响应。比如攻击者以 1000/20ms 的速度进行探测端口,这里只能返回50个ICMP不可达报文。

侧信道攻击:大体意思是,攻击者借助服务器进行响应的一些信息,发动攻击。

端口探测:意思是通过向DNS解析器发送UDP报文,遍历目的端口,如果端口未开放,则会返回ICMP不可达报文,如果开放,不会收到响应报文

临时端口:只对权威域名服务器开放,攻击者并不知晓,所以要用到IP欺骗,伪造权威域名服务器的IP发送UDP探测报文。

在上图中,假设解析器的ICMP速率限制为 50/20ms, 攻击者通过伪造权威域名服务器的IP,向解析器发送50个探测UDP报文,那么攻击者以自己的IP再向解析器发送一个UDP报文,如果没收到任何ICMP回复,说明已达到ICMP速率限制,可进行下一个20ms的探测,不断循环。如果此时收到回复,说明至少有一个端口是开放的。可通过二分查找,查找开放的端口。

但是 存在IP速率限制怎么办?

假如IP速率限制为1个/秒,即在这一秒内只允许一个IP访问解析器。在这篇论文中提到,清华大学安全团队通过观察源码发现,ICMP速率限制 是在IP速率限制之前 进行验证的。所以,即使最后一个IP只返回一个ICMP响应包,但是ICMP 速率限制的计数器是变化的。 所以与上图同理,只在这一方面有些许变化。

论文原图如下:

大约可以每秒1000的速度去探测解析器开放的端口。但是仍需很长时间,所以这就需要去相应扩大攻击窗口。

扩大攻击窗口

攻击窗口,指DNS解析器向服务器发送查询,到权威域名服务器响应报文到达解析器的这段时间。

所以扩大攻击窗口的主要思路,应该集中在阻止响应报文的到达,或延迟响应报文的到达。

通过发送大量的DNS查询来淹没权威域名服务器,类似于攻击者伪造解析器,发送大量DNS query,高于配置限制的速率(服务器上配置的RRL),会权威域名服务器不发送响应,创建足够高的丢失率。

TTL时间

​ 对于解析器缓冲区而言,可能已经拥有某条记录,但攻击者不得不等待这条记录消失之后,再发动攻击。TTL即表示这条记录的生存时间,时间可能为1天或者更久。

这就很头疼,有没有解决办法?

​ 有。

​ 攻击者可以去问类似1.xxx.com、2.xxx.com、3.xxx.com等等这些大概率就完全不存在的域名,由于DNS解析器并没有这些域名的缓存,就会发起查询,假设ns1.xxx.com是foo.com的权威DNS,DNS解析器就会去ns1.xxx.com询问。

Q:要投毒的是www.xxx.com,搞定83.xxx.com有什么意义啊。

A:没错,我们的目标并不是83.xxx.com,这个攻击比较精彩的地方是,可以并不是在应答区做手脚,而是在权威区和附加区行骗!

伪造的响应包,大约是这个样子:

问题区:83.xxx.com A

应答区:(空)

权威区:xxx.com NS www.xxx.com

附加区:www.xxx.com A 6.6.6.6

这个响应的意思是:“我不知道83.xxx.com的A记录,你去问问www.xxx.com吧,它负责xxx.com这个域,对了,他的IP是6.6.6.6”。

而这里的6.6.6.6,就是攻击者意欲让DNS解析器相信的IP地址。

本文参考DNS Cache Poisoning Attack Reloaded: Revolutions with Side Channels这篇论文,若想详细了解,可去阅读!同时,若有不太理解的问题,欢迎在下面评论进行讨论!


参考文档:

SADDNS官网

SADDNS explained

DNS服务器类型

一次出人意料而名留青史的 DNS 投毒攻击

IP报文分片

SAD DNS--新型DNS缓存中毒攻击的更多相关文章

  1. DNS劫持 DNS污染

    编号:1021时间:2016年6月24日17:23:50功能:DNS劫持 DNS污染URL:http://www.itechzero.com/dns-hijacking-dns-pollution-i ...

  2. DNS及DNS有什么作用

    什么是DNS,DNS有什么作用: DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直 ...

  3. 配置域从DNS服务器以及缓存DNS服务器

    一.域从DNS服务器的作用 我们在之前上一篇随笔里有提到,DNS服务器一般有三种类型,一个是Primary DNS Server(主DNS服务器),一个是Secondary DNS Server(从D ...

  4. DNS笔记 DNS区域集成到 Active Directory

    可以将 DNS 区域集成到 Active Directory 中以提供增强的容错功能和安全性.OpenDNS   Google Public DNS往返时间 (RTT) 远程访问服务 (RAS)域名与 ...

  5. Linux系统下搭建DNS服务器——DNS原理总结

    2017-01-07 整理 DNS原理 域名到IP地址的解析过程 IP地址到域名的反向域名解析过程 抓包分析DNS报文和具体解析过程 DNS服务器搭建和配置 这个东东也是今年博主参见校招的时候被很多公 ...

  6. 被动信息收集1——DNS基础 + DNS解析工具 NSLOOKUP使用

    被动信息收集 特点: 基于公开渠道 与目标不直接接触 避免留下一切痕迹 标准參考--OSINT: 美国军方 北大西洋公约组织 名词解释 DNS--Domain Name System 域名系统 因特网 ...

  7. 【DNS】DNS的几个基本概念

    一. 根域 就是所谓的“.”,其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),一般我们在浏览器里输入时会省略后面的点,而这也已经成为了习惯. 根域服 ...

  8. DNS与DNS劫持原理、IP、域名、服务器访问浅讲

    我们都知道,平常我们所访问的网站,都是与服务器进行数据交互的.但是,浏览器和服务器是分处于不同的计算机上的,那他们是怎样进行通信的呢?今天,我们就来粗浅地聊一聊.不涉及很深的技术原理,只讲大概的流程. ...

  9. DNS(三)DNS SEC(域名系统安全扩展)

    工作需要今天了解了下DNS SEC,现把相关内容整理如下: 一.DNS SEC 简介 域名系统安全扩展(英语:Domain Name System Security Extensions,缩写为DNS ...

随机推荐

  1. Java学习的第十四天

    1.JAVA的继承使用关键字extends继承 class 子类 extends 父类{} 子类可以用super来调用父类的非私有属性和非私有方法,还可以调用非私有的父类构造函数 如果父类子类的方法名 ...

  2. 调度《Taint(污点) 和 Toleration(容忍)》

    节点亲和性(详见这里),是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点.Taint 则相反,它使 节点 能够 排斥 一类特定的 pod. Taint 和 tolerat ...

  3. [C#] (原创)一步一步教你自定义控件——04,ProgressBar(进度条)

    一.前言 技术没有先进与落后,只有合适与不合适. 本篇的自定义控件是:进度条(ProgressBar). 进度条的实现方式多种多样,主流的方式有:使用多张图片去实现.使用1个或2个Panel放到Use ...

  4. SSM实现文件上传

    1.导入上传需要的jar包 commons-fileupload-1.3.3.jar commons-io-2.6.jar 2.创建 index.jsp <%@ page contentType ...

  5. Docker(3)- Centos 7.x 下 Docker 镜像加速配置

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 前言 默认情况下,Docker ...

  6. 聊聊Go代码覆盖率技术与最佳实践

    "聊点干货" 覆盖率技术基础 截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道: go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpo ...

  7. Java_包装类

    包装类 在实际应用中, 经常需要把基本数据类型转化为对象以便操作. 因此, Java在设计类时, 为每个基本数据类型设计了一个对应的类进行包装, 这样八个和基本数据类型对应的类统称为包装类(Wrapp ...

  8. dhcp、tftp、httpd、pxe安装CentOS6.9

    虚拟机网络设置 要xshell连接虚拟机注意设置VMware Network Adapter VMnet2在同一网段 1.利用光盘配置本地yum源 [root@ZYB ~]# mount -r /de ...

  9. 腾讯云对象存储COS新品发布——智能分层存储,自动优化您的存储成本

    近日,腾讯云正式发布对象存储新品--智能分层存储,能够根据用户数据的访问模式,自动地转换数据的冷热层级,为用户提供与标准存储一致的低延迟和高吞吐的产品体验,同时具有更低的存储成本. 熟悉数据存储的用户 ...

  10. axios封装接口

    我们一般都是在做一个大型项目的时候,需要用到很多接口时,我们为了方便使用,就把接口封装起来. 先安装axios命令 :npm install axios --save 那么思路是什么呢? 首先在src ...