[译]DNS缓冲窥探

原文地址:http://resources.infosecinstitute.com/dns-cache-snooping/
[b]1. 介绍[/b]
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,用来负载均衡。
[b]2. DNS Queries[/b]
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服务器做下面所有事中的一件:
[color=blue]1. Recursive Query:[/color]既然既然DNS服务器不知道hostname,它将会请求它自己的DNS服务器来解决它。如果IP存在,那么递归查询总会返回一个IP地址。递归查询不是DNS服务器必须支持的选项。
[color=blue]2. Iterative Non-Recursive Query:[/color]如果如果DNS服务器不知道查询的hostname,那么它返回一组可能知道该IP的DNS服务器。但是如果hostname-IP对存在本地cache中,那么对应的IP必须返回。所有DNS服务器必须支持Non-Recursive Query。
[color=blue]3. DNS Cache 窥探: Non-Recursive Queries are Enabled[/color]DNS 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服务器存在缓存窥探漏洞。
[b]3. DNS Cache Snooping: Non-Recursive Queries are Disabled[/b]
对于窥探一个DNS服务器,我们可以使用non-recursive查询,从那里我们可以让DNS服务器返回一个给定资源的任何类型:A,MX,CNAME,PTR等。我们可以通过设置RD标志为0来实现.如果DNScache中存在任何实体,它将会返回。否则,DNS服务器将返回其他可以回答查询的服务器,大多数情况下我们将会获得root.hints文件。
通常情况下当配置DNS服务器时,可以禁止non-recursive。但是即使只允许递归查询,我们有时仍然可以某个实体是否存在于缓冲。有两种方法:
[color=blue](一)检查query所需的时间[/color]:如果查询的时间大致等于发送数据包到服务器的时间,那么该实体可能存在于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

[color=blue](二) 当查询一个有漏洞的DNS服务器和root DNS服务器比较他们的TTL[/color]
以内因为不允许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中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值