Skip to content

dns-cache-attack

复制本地路径 | 在线编辑

title: DNS 学习二:DNS 缓存攻击(DNS Cache Attacking)

本学期有一门课程我所在的小组所做的是 DNS 综述,在找文献的过程中,意外看到了一篇很不错的博客文章,特此记录一下。
正如名字所属,利用了 DNS 缓存进行的攻击。主要参考了 http://unixwiz.net/techtips/iguide-kaminsky-dns-vuln.html

什么是 DNS 缓存

首先要知道什么是 DNS 缓存,很简单明了,比如第一次访问百度,DNS 服务器查询到它的 IP 地址,会记录,等到下次就会一下子就知道这个地址了。
但是这只是抽象说一说,现在一个问题: DNS 服务器难道一直存储这个地址吗?空间不够,地址也可能更改。所以 DNS 缓存每条记录都是有对应的存储时间的。来看下面这样一张图。

dns-cache

这是一个回应包,就是 DNS 服务器进行递归查询时,某个域名服务器发回给我们本地 DNS 服务器的报文。重点关注最后几项内容,现在我们以这个域名服务器(也就是这个报文的发送方)的角度来看问题。
1. 第一个是 Qu,这个意思是这个为你之前问我的问题,我这次顺带把这个问题再复述一遍,以免我答非所问了。
2. 第二个第三个是 Au,这两项意思是我不知道 unixwiz.net 它的 IP 地址,但是我知道 linux.unixwiz.net 和 cs.unixwiz.net 这两个应该存储了 unixwiz.net 的地址,你去问问它们。
3. 第四个第五个是 Ad,这两项意思是我刚才说你去问问这两个地址,所以这两个地址分别是 xxx。然后因为这两个地址是我告诉你的,所以我来决定这两个地址可以在你这里缓存多久,这也就是后面的 1hr 的意思,在你那里缓存 1 小时。
所以 DNS 缓存的时间不是自己决定的,是别人来发我的时候告诉我的。

污染 DNS 缓存的要求

什么是 DNS 缓存污染呢,就是如果 DNS 服务器事先没有存储网站 A 的 IP,它会请求上层服务器对吧。此时攻击者伪造上层的服务器发一个假的消息给 DNS 服务器,告诉它网站 A 的 IP 是 xxx (某个恶意地址)。这个 DNS 服务器将这个恶意地址和网站 A 对应关系缓存起来,以后如果有人像这个 DNS 服务器请求网站 A,通过 DNS 缓存就受害了。

DNS 服务器发送一个包给上层 DNS 服务器,那么上层 DNS 服务器返回的包肯定某些地方要保持一致,让它确保这个消息来自上层 DNS 服务器,具体是哪些地方要求一样呢?
1. UDP port 需要一样,DNS 服务器通过 X 端口发给上层服务器的 53 端口(53 端口是 DNS 接收请求的固定端口),那么上层服务器就要从 53 端口返回给 DNS 服务器 X 端口
2. Question 需要一样,也就是刚才提到的 Qu 那个记录
3. Query Id 需要一样

如果控制了一个恶意子域名的 DNS 服务器,那就很好办了。看下面的图,攻击者向正常的 DNS 服务器询问这个恶意子域名下的网址,最后 DNS 服务器会问我们可以控制的恶意子域名 DNS 服务器: 这个恶意子域名 IP 是多少。然后就可光明正大地查看了。
dns-cache-attack-03

但这是上一次的 DNS 请求呀,和这一次 DNS 请求有什么关系呢。这就是关键,有些 DNS 服务器的过分简单实现造成了攻击利用。下面来进行一一击破。
1. UDP Port: 有一些 DNS 服务器的 UDP port 一直保持一致的,它启动的时候是随机的,但之后都是一个同样的端口,对于所有请求,DNS 服务器都是通过这个端口来向上层服务器询问具体 IP 地址。
2. Question: 这个知道问了什么问题就可以人工构造的,没什么难点。
3. Query ID: 有一些 DNS 服务器的 Query id 是递增增加的,每进行一个来回的发收环节后就进行加一,所以我们只要窃听上一次的 Query id,然后加一就行了。

DNS 缓存污染版本一

  1. 首先攻击者发送一个询问请求,请求的网址是一个合法的地址
  2. 该步有两个事件。2b 是正常的,就是 DNS 服务器向根服务器发送请求。2a 是攻击者采取的行动,攻击者发送大量的伪造包,伪造宣称子域名服务器的 IP 地址。其中 Query id 从之前方法观测到的 query_id 不断递增,只要距离上一次窃听很近,那么就很有可能碰撞到正确的。
  3. 现在根域名服务器回复消息,很正常。
  4. DNS 服务器向 2nd 域名服务器发送请求。
  5. 2nd 域名服务器返回消息。但是如果第二步攻击者伪造的包比这个消息更早到,那么 DNS 服务器就会认为伪造的信息了而丢掉现在 2nd 域名服务器回复的消息
  6. 所以,DNS 服务器就会认为: 请求的网站 == 伪造包所宣称的 IP 地址。

dns-cache-attack-01

DNS 缓存污染版本二

之前的版本很不错,但是每次只能污染一个具体的网址,Dan Kaminsky 想到了一个方法,可以污染一整个子域名。

2021/05/18 更新: 不久前 Dan Kaminsky 去世了,祝安息

方法特别简单,就是之前伪造的包是宣称某个具体网址是个恶意地址,现在就改成宣称: 不知道具体地址,但是可以去 xxx 地址(某个恶意地址)中去查。
可以看到图中访问 xxx.bankOfsteve.com,最终要去问 ns1.bankOfsteve.com,但它被污染为恶意地址。以后只要查询 xxx.bankOfsteve.com,那么就会去问 ns1.bankOfsteve.com,那么就访问了恶意地址。
另外细节之处就是,询问网址的时候使用 www.12345678.bankOfsteve.com 这种明显不可能存在的网址,这样一定会从根服务器中去找,免得我们查的网址之前就存在缓冲了。

dns-cache-attack-04

Comments