码迷,mamicode.com
首页 > 其他好文 > 详细

SAD DNS--新型DNS缓存中毒攻击

时间:2020-12-07 12:06:33      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:udp协议   href   local   密码   查询   src   开放   递归查询   ram   

一、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缓存中毒攻击

标签:udp协议   href   local   密码   查询   src   开放   递归查询   ram   

原文地址:https://www.cnblogs.com/PsgQ/p/14071890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!