`

[译]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中
分享到:
评论

相关推荐

    win10 用bat脚本修改dns

    在Windows 10操作系统中,更改DNS(Domain Name System)设置有时可能会变得复杂,特别是对于不熟悉系统控制面板深层结构的用户。为了简化这一过程,我们可以利用批处理(BAT)脚本来快速有效地调整DNS配置。批处理...

    清除DNS缓存

    清除DNS缓存 清除DNS缓存是计算机网络维护中一个非常重要的操作。DNS(Domain Name System,域名系统)缓存是计算机中的一种缓存机制,当计算机对域名访问时,并不是每次访问都需要向DNS服务器寻求帮助的,一般来说...

    window中DNS溢出.zip

    MS07-029,Windows 域名系统 (DNS) 服务器服务的远程过程调用 (RPC) 管理接口中存在基于堆栈的缓冲区溢出。

    用Socket实现DNS查询

    5. **接收DNS响应**:设置一个足够大的缓冲区,使用`recvfrom()`函数等待DNS服务器的响应。响应报文包括与请求报文类似的头部,以及一个或多个回答记录,每个回答记录包含查询的域名、类型、类、TTL(生存时间)和...

    易语言DnsQuery解析DNS源码

    在本资源中,我们关注的是"易语言DnsQuery解析DNS源码",这是一段用于解析DNS(Domain Name System)的源代码,帮助用户获取域名对应的IP地址或者IP地址对应的域名。DNS是互联网上的一个关键服务,它将人类可读的...

    DNS域名劫持服务器

    这包括加密传输、防止缓冲区溢出等。 6. **多线程与并发**:DNS服务器需要处理多个并发请求,因此需要设计良好的并发模型,如使用线程池或者异步I/O来提高性能和响应速度。 7. **调试与日志**:为了便于测试和故障...

    dnsproxy dns 转发程序

    DNSproxy是一个DNS转发程序,它的主要功能是作为DNS透明代理,帮助用户实现DNS查询的智能路由和安全保护。 透明代理是指在用户无感知的情况下,DNSproxy会自动处理所有DNS查询请求。当用户将他们的DNS服务器设置为...

    coredns-1.8.6镜像包和安装文件

    CoreDNS 是一个现代化的、可插拔的DNS服务器,它被设计用来替代Kubernetes集群中的kube-dns服务,成为Kubernetes生态系统的默认DNS解决方案。CoreDNS 的核心目标是提供一个高效且灵活的服务发现机制,使得应用程序和...

    C#的DNS协议完整实现代码【有默认DNS服务器实现哦~】

    在IT领域,DNS(Domain Name System)协议是网络基础设施中的重要组成部分,它负责将人类可读的域名转换为IP地址,使得互联网上的通信能够顺利进行。C#是一种广泛用于开发Windows应用程序、网络服务和游戏的面向对象...

    dnsproxy2 --Android系统DNS修改工具优化版

    DNSproxy2是一款针对Android系统的DNS修改工具,经过优化以提供更高效、稳定的服务。这款工具的特色在于它允许用户自定义设置两个DNS服务器地址,从而提高网络连接速度和稳定性,或者用于绕过某些地区的网络限制。...

    DNS 大全 dns

    - **使用HTTPS**:保护DNS查询过程不被窥探,即使是在公共WiFi环境下也能够保障隐私安全。 - **定期更新和维护DNS服务器软件**,确保其拥有最新的安全补丁。 ### DNS与云计算 近年来,随着云计算的兴起,DNS服务也...

    全国网通dns电信dns大全

    ### 全国网通DNS与电信DNS大全:深入解析与应用 #### DNS服务器概念与作用 DNS(Domain Name System,域名系统)是互联网的一项服务,它作为域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网...

    DNS 域名服务协议

    DNS(域名服务协议)是互联网中的一项关键技术和基础服务,它负责将域名地址转换为IP地址,使得用户能够方便地访问网络资源。DNS系统采用分布式数据库的方式,将域名空间分割成多个层级,每个层级由不同的机构或个人...

    seed缓冲区溢出实验报告1

    《seed缓冲区溢出实验报告解析》 缓冲区溢出是一种常见的软件安全漏洞,它发生在程序尝试向固定大小的缓冲区内写入超过其容量的数据时。在这个实验中,我们将深入理解这一概念,以及如何利用它来获取不同级别的权限...

    dns的备份与恢复

    DNS备份 当你的DNS服务器正常运行起来后,大家可以按照下列步骤对自己的服务器配置进行备份: 1. 停止DNS服务。 2. 打开Regedit程序,找到键HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\DNS。 3....

    DNSBench DNS检查工具

    DNSBench是一款强大的DNS(Domain Name System)性能测试工具,由知名网络安全研究者Gibson Research Corporation开发。这款工具的主要目的是帮助用户评估和比较不同DNS服务器的响应速度和稳定性,从而选择最佳的DNS...

    清空本地DNS缓存

    ### 清空本地DNS缓存的方法 在计算机网络中,DNS(Domain Name System,域名系统)扮演着将网站域名转换为IP地址的重要角色。为了提高访问速度和效率,操作系统会缓存这些DNS查询结果,即DNS缓存。然而,在某些情况...

    DNS 扫盲实现智能DNS

    DNS(Domain Name System)是互联网中的重要组成部分,它将易于记忆的域名转换为计算机可识别的IP地址。在本文中,我们将深入探讨“DNS扫盲实现智能DNS”的相关知识点,帮助您更好地理解和配置智能DNS系统。 首先,...

    【DNS缓存中毒实验】SEED lab:DNS Remote Attack Lab The Kaminsky Attack

    DNS(域名系统)是互联网的重要组成部分,它负责将人类易读的域名转换为计算机可识别的IP地址。然而,DNS系统并非无懈可击,其中一种著名的攻击方式就是DNS缓存中毒,也被称为Kaminsky攻击。这个实验,"SEED lab:...

Global site tag (gtag.js) - Google Analytics