[译]DNS缓冲窥探

原文地址:http://resources.infosecinstitute.com/dns-cache-snooping/
1. 介绍
DNS或则命名服务器用于解析域名到IP地址。有很多DNS服务器,它们用于解析特定的域名,但是他们存放特定的DNS记录。这些记录可以是如下:A,AAAA,NS,MX,等。所有的DNS服务器连接到一起来构建一个层级的DNS网络。我们来查询我们自己的DNS服务器来解析www.google.com。
# nslookup www.google.com 192.168.1.1
 
Server:    192.168.1.1
 
Address 1: 192.168.1.1
 
Name:      www.google.com
 
Address 1: 173.194.35.148 muc03s01-in-f20.1e100.net
 
Address 2: 173.194.35.144 muc03s01-in-f16.1e100.net
 
Address 3: 173.194.35.147 muc03s01-in-f19.1e100.net
 
Address 4: 173.194.35.145 muc03s01-in-f17.1e100.net
 
Address 5: 173.194.35.146 muc03s01-in-f18.1e100.net
 
Address 6: 2a00:1450:4016:800::1010 muc03s01-in-x10.1e100.net

可以看到查询返回5个地址173.194.35.144, 173.194.35.145, 173.194.35.146, 173.194.35.147 and 173.194.35.148,用来负载均衡。
2. DNS Queries
DNSDNS服务器的主要工作是相应DNS查询。一个DNS查询是一个如下啊的问题:“Hello DNS 服务器,请告诉我www.google.com的IP”。当DNS服务器接收到这样一个请求时,它将查询该域名的IP,然后返回相应的IP。DNS服务器可以从本地的cache中查询主机地址信息。如果hostname-ip关系存在,它立即返回结果。否则它将查询forward到他的DNS服务器。
DNSDNS服务器的目的是提供一个本地域名的hostname-IP的转换,它配置喜爱本地区域文件中。但这些不是DNS服务器通常解析的请求;通常情况下是DNS不知道的域名。当DNS服务器接收到这种请求的时候,DNS服务器做下面所有事中的一件:
1. Recursive Query:既然既然DNS服务器不知道hostname,它将会请求它自己的DNS服务器来解决它。如果IP存在,那么递归查询总会返回一个IP地址。递归查询不是DNS服务器必须支持的选项。
2. Iterative Non-Recursive Query:如果如果DNS服务器不知道查询的hostname,那么它返回一组可能知道该IP的DNS服务器。但是如果hostname-IP对存在本地cache中,那么对应的IP必须返回。所有DNS服务器必须支持Non-Recursive Query。
3. DNS Cache 窥探: Non-Recursive Queries are EnabledDNS cache窥探是一个获取已经被DNS服务器解析的请求的过程。如果我们想检查hostname是否被本地DNS网络解析,这将很有用。这意味着本地网络中的节点近期使用那台DNS服务器请求过hostname。从而可以窥探在某一个时间user访问了哪个页面。
如果我莫使用一个非递归查询来解析一个已经解析的域名,那么DNS服务器对于cache窥探很敏感。为了检查DNS服务器是否对于DNS窥探敏感,我们可以尝试用非递归请求来查找一个域名:如果DNS服务器不知道那么它也不请求其他DNS服务器。
我们可以通过nslookup命令:
nslookup -norecursive www.rapid7.com
首先首先我们使用nslookup命令访问8.8.8.8来解析hostname www.rapid7.com,通过-norecursive 选项来使用非递归。在下图的输出中,我们可以看到nslookup命令没有解析www.rapid7.com
# nslookup -norecursive -type=A www.rapid7.com
 
Server:  8.8.8.8
 
Address: 8.8.8.8#53
 
Non-authoritative answer:
 
*** Can't find www.rapid7.com: No answer

然后我们使用-recursive选项,则应该解析:
# nslookup -recursive -type=A www.rapid7.com
 
Server:  8.8.8.8
 
Address: 8.8.8.8#53
 
Non-authoritative answer:
 
Name: www.rapid7.com
 
Address: 208.118.227.10

我们可以看到DNS服务器8.8.8.8通过询问其他DNS服务器来获得www.rapid7.com信息。在查询的最后,它返回地址208.118.227.10,正是www.rapid7.com的IP.
r然后我们再使用-norecursive选项,这次应该显示IP。原因是使用了-recursive,DNS将返回的IP存储在它的cache中。只要该实体存在于cache中,那么即使使用non-recursive,仍然会返回结果。如下:
# nslookup -norecursive -type=A www.rapid7.com
 
Server:  8.8.8.8
 
Address: 8.8.8.8#53
 
Non-authoritative answer:
 
Name: www.rapid7.com
 
Address: 208.118.227.10

现在DNS服务器返回208.118.227.10。我们可以发现DNS服务器存在缓存窥探漏洞。
3. DNS Cache Snooping: Non-Recursive Queries are Disabled
对于窥探一个DNS服务器,我们可以使用non-recursive查询,从那里我们可以让DNS服务器返回一个给定资源的任何类型:A,MX,CNAME,PTR等。我们可以通过设置RD标志为0来实现.如果DNScache中存在任何实体,它将会返回。否则,DNS服务器将返回其他可以回答查询的服务器,大多数情况下我们将会获得root.hints文件。
通常情况下当配置DNS服务器时,可以禁止non-recursive。但是即使只允许递归查询,我们有时仍然可以某个实体是否存在于缓冲。有两种方法:
(一)检查query所需的时间:如果查询的时间大致等于发送数据包到服务器的时间,那么该实体可能存在于cache中,因为不需要浪费时间向其他DNS服务器查询。
我们首先用ping命令测量一些ICMP数据报包送指定DNS服务器所需时间。下图发送3个数据包到8.8.8.8服务器,花费大概30.387微秒。查看最后一行的avg
# ping -c 3 8.8.8.8
 
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
 
64 bytes from 8.8.8.8: icmp_req=1 ttl=47 time=29.7 ms
 
64 bytes from 8.8.8.8: icmp_req=2 ttl=47 time=30.7 ms
 
64 bytes from 8.8.8.8: icmp_req=3 ttl=47 time=30.6 ms
 
--- 8.8.8.8 ping statistics ---
 
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
 
rtt min/avg/max/mdev = 29.725/30.387/30.769/0.491 ms

然后使用8.8.8.8服务器来解析hostname,但是应该使用一个可以统计时间的工具-dig。如下所示,用8.8.8.8查询www.google.com花费31 ms。
# dig @8.8.8.8 www.google.com
 
; <<>> DiG 9.9.1-P2 <<>> @8.8.8.8 www.google.com
 
; (1 server found)
 
;; global options: +cmd
 
;; Got answer:
 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39294
 
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
 
; EDNS: version: 0, flags:; udp: 512
 
;; QUESTION SECTION:
 
;www.google.com.                        IN      A
 
;; ANSWER SECTION:
 
www.google.com.         256     IN      A       173.194.35.146
 
www.google.com.         256     IN      A       173.194.35.144
 
www.google.com.         256     IN      A       173.194.35.145
 
www.google.com.         256     IN      A       173.194.35.147
 
www.google.com.         256     IN      A       173.194.35.148
 
;; Query time: 31 msec
 
;; SERVER: 8.8.8.8#53(8.8.8.8)
 
;; MSG SIZE  rcvd: 123

发送ICMP所需时间大致等于DNS查询时间,所以www.google.com很可能在DNS服务器8.8.8.8的缓存中。
我们解析www.imdb.com,我们将会看到它不在cache中:
# dig @8.8.8.8 www.imdb.com
 
; <<>> DiG 9.9.1-P2 <<>> @8.8.8.8 www.imdb.com
 
; (1 server found)
 
;; global options: +cmd
 
;; Got answer:
 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28806
 
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
 
; EDNS: version: 0, flags:; udp: 512
 
;; QUESTION SECTION:
 
;www.imdb.com.                  IN      A
 
;; ANSWER SECTION:
 
www.imdb.com.           9410    IN      CNAME   us.dd.imdb.com.
 
us.dd.imdb.com.         33      IN      A       207.171.162.180
 
;; Query time: 61 msec
 
;; SERVER: 8.8.8.8#53(8.8.8.8)
 
;; MSG SIZE  rcvd: 77

查询话费时间61毫秒,意味着查询时间加倍。这表明www.imdb.com不在缓存中。如果我们再次查询同样域名,我们将会看到只需31 ms,可能是因为hostname-ip对由之前的查询已经放到本地cache中了
# dig @8.8.8.8 www.imdb.com
 
; <<>> DiG 9.9.1-P2 <<>> @8.8.8.8 www.imdb.com
 
; (1 server found)
 
;; global options: +cmd
 
;; Got answer:
 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53647
 
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
 
; EDNS: version: 0, flags:; udp: 512
 
;; QUESTION SECTION:
 
;www.imdb.com.                  IN      A
 
;; ANSWER SECTION:
 
www.imdb.com.           10776   IN      CNAME   us.dd.imdb.com.
 
us.dd.imdb.com.         36      IN      A       72.21.203.211
 
;; Query time: 31 msec
 
;; SERVER: 8.8.8.8#53(8.8.8.8)
 
;; MSG SIZE  rcvd: 77

(二) 当查询一个有漏洞的DNS服务器和root DNS服务器比较他们的TTL
以内因为不允许non-recursive查询,唯一的选项是使用recursive查询-将会在DNS服务器中缓冲结果。但是即使那样,我们可以检查应答的TTL值来判断一个host是否已经存在于cache中。
# nslookup -type=A www.google.com 8.8.8.8 -debug
 
Server:         8.8.8.8
 
Address:        8.8.8.8#53
 
------------
 
QUESTIONS:
 
www.google.com, type = A, class = IN
 
ANSWERS:
 
->  www.google.com
 
internet address = 173.194.35.146
 
ttl = 300
 
->  www.google.com
 
internet address = 173.194.35.148
 
ttl = 300
 
->  www.google.com
 
internet address = 173.194.35.144
 
ttl = 300
 
->  www.google.com
 
internet address = 173.194.35.145
 
ttl = 300
 
->  www.google.com
 
internet address = 173.194.35.147
 
ttl = 300
 
AUTHORITY RECORDS:
 
ADDITIONAL RECORDS:
 
------------
 
Non-authoritative answer:
 
Name:   www.google.com
 
Address: 173.194.35.146
 
Name:   www.google.com
 
Address: 173.194.35.148
 
Name:   www.google.com
 
Address: 173.194.35.144
 
Name:   www.google.com
 
Address: 173.194.35.145
 
Name:   www.google.com
 
Address: 173.194.35.147

在上图结果中TTL值是300,认为是一个低值。它意味着在查询的时候hostname www.google.com已经在cache中

猜你喜欢

转载自j4s0nh4ck.iteye.com/blog/2146265
DNS