首页 > 代码库 > DNS安全(一)DNS缓存投毒与防护

DNS安全(一)DNS缓存投毒与防护

       互联网的飞速发展,把人们带入了一个新的时代。一方面,人们享受着互联网带来的便捷多彩的生活,另一方面,个人信息安全也正面临者新的挑战。

        如今的互联网,时时刻刻都在发生网络攻击、病毒传播。一边是攻,另一边是防,可以说这是一场没有硝烟的持久战。战争推动了环境变革,战争也推动了武器的升级。本文站在DNS安全角度,简单聊聊DNS缓存投毒的原理与防御机制。

【第一 DNS介绍】

DNS(域名系统 Domain Name System)是一个多层次的分布式数据库系统,它基本的功能是完成域名解析,即提供域名和IP 地址之间的映射关系,属于互联网(Internet)的基础设施,为互联网(Internet)上用户提供便利。

 

【第二 DNS的工作原理概述】
在分析DNS 缓存投毒攻击原理之前,先了解一下DNS 解析过程。

假设我们在客户端上要查询的域名为www.test.com,并且客户端和我们的本地缓存DNS满足如下条件:
(1)客户端是首次访问www.test.com,即客户端本地没有缓存记录。

(2)本地缓存DNS中没有www.test.com的缓存记录,当然,本地缓存DNS肯定不是www.test.com的权威DNS。
那么,客户端发起www.test.com查询请求后的过程如下图所示:

wKiom1Rh62HQb5D7AACLNglYnxE732.jpg

(1)客户端向本地缓存DNS发起递归查询www.test.com 的请求。
(2)本地缓存DNS检查本地资源记录,若存在则作授权回答;若不存在,则检查本地缓存,如存在则直接给客户端返回结果。若本地资源记录和缓存中都不存在,则向根DNS发起迭代查询。

本例中本地缓存DNS向根DNS发起www.test.com的迭代查询。

(3)根DNS返回com 域的权威名字服务器(即顶级域DNS)的NS记录和对应IP地址。

(4)本地缓存DNS继续向顶级域DNS发起www.test.com的迭代查询。

(5)顶级域名服务器返回test.com域的权威DNS的NS记录和IP地址。

(6)本地缓存DNS继续向test.com的权威DNS发起www.test.com的迭代查询。

(7)test.com的权威DNS应答www.test.com的查询请求。

(8)本地缓存DNS将应答结果保存在本地缓存,并将结果应答给客户端。

 

【第三 DNS缓存投毒攻击】

DNS缓存投毒攻击可以分为传统的缓存投毒攻击Kaminsky缓存投毒攻击。但无论传统的DNS缓存投毒还是后来出现的Kaminsky缓存投毒均出现在下图红色区域,即权威DNS应答本地缓存DNS发起的迭代请求的过程中。

wKiom1Rh7rnCebvbAAC7q74-BBY353.jpg

【第四 传统的DNS缓存投毒攻击】

        由于DNS 采用UDP 协议传输查询和应答数据包,属于简单信任机制。对接收到的应答数据包仅进行原查询包IP 地址、端口和随机查询ID 的确认,而不会对数据包的合法性做任何分析。如果若匹配,则接受其作为正确应答数据包,继续DNS 解析过程,并丢弃后续到达的所有应答数据包。这就使得攻击者可以仿冒权威名字服务器向缓存DNS 服务器发送伪造应答包,力争抢先完成应答以污染DNS 缓存。
        如果攻击者发送的伪造应答包在权威DNS发送的正确应答包之前到达缓存DNS 服务器,并与原查询包IP 地址、端口和随机查询ID 相匹配,就能够成功污染DNS 缓存。

        例如,攻击者伪造上面的test.com权威应答内容,将www.test.com的A记录修改成一个非法的IP地址比如1.1.1.1,且伪造权威DNS的IP地址、端口号以及查询ID提前一步应答给本地缓存DNS,那么本地缓存DNS就会将此内容视为合法,并缓存到本地然后应答给客户端。即使后来真正的应答到了本地缓存DNS,那也没办法再改变。

 

【第五 传统的DNS缓存投毒的缺陷】

        根据DNS的工作原理可知:被攻击的域名只有在本地缓存DNS中没有缓存,那么才有可能攻击成功。本地缓存DNS中已经存在该域名的缓存,那么攻击者只能等到该域名缓存的生存时间(TTL)过期后再组织下一次攻击。这样的攻击效率和命中率是比较低的。


【第六 Kaminsky缓存投毒攻击】

        2008 年的夏天,Dan Kaminsky 发现了一种新型DNS 缓存投毒攻击,该攻击的方式一经公开立即引起了网络安全界的广泛关注。

        Kaminsky缓存投毒攻击克服了传统DNS 缓存投毒攻击存在的攻击所需时间长、成功率很低的缺陷。其攻击原理如下:

(1)攻击者向被攻击的本地缓存DNS发送一个域名的DNS 查询请求,该查询请求中的域名主机使用随机序列和目标域名的组合。

例如www123456.test.com,其中ns2.test.com为目标域名,www123456是随机生成的。很显然,这个查询的域名主机记录在test.com的权威DNS中是不存在的。正常test.com的权威DNS要返回NXDOMIAN(代表域名不存在)。换句话说就是本地缓存DNS中肯定没有www123456.test.com的缓存记录,本地缓存DNS接收到这个域名查询请求后肯定是要出去迭代请求的。

 

(2)攻击者伪造test.com的权威DNS应答数据包中,应答资源记录部分与正确应答包中部分是与正常结果一样的,比如test.com的DNS的IP地址、UDP端口号、应答结果是NXDOMAIN。

但是,在应答报文中的授权资源记录部分,攻击者伪造一个test.com的NS记录为ns2.test.com且该记录对应的A记录IP是2.2.2.2(可能是一个钓鱼网站的IP)。那么该资源记录信息将也被写入本地缓存DNS的Cache 中,在Cache 保持时间内,对test.com名字服务器所管辖的所有域名的查询都将被发送到攻击者自己控制的IP(2.2.2.2)中

通过dig命令测试类似报文应答内容如下。

wKioL1Rh-YjyJf8DAAHBIr_kkUI375.jpg

 

【第七 Kaminsky缓存投毒的优势】

        传统DNS 缓存投毒攻击中,存在攻击所需时间长、攻击成功率低的问题,而Kaminsky 攻击克服了这一缺陷。因为Kaminsky 攻击中,每次查询都会在目标域名上添加随机序列,这使得在被攻击的本地缓存DNS的 Cache 中根本就不存在各个临时构造域名主机的记录,因此若攻击不成功,则立即更换随机序列连续不断地进行攻击,不存在有效攻击时间的问题进而提升了攻击成功率。
       传统DNS 缓存投毒攻击成功后,只是污染了该与权威区中的某个域名,而Kaminsky 攻击成功后,污染的是本地缓存DNS Cache中一个域名主机的NS记录(即该域名的权威主机记录),之后对该名字服务器管辖的所有域名主机的查询都将被发送到攻击者控制的IP 地址中,破坏力度远高于传统缓存投毒攻击。

 

【第八 缓存投毒攻击防护】

     最后,我们来说说如何做好DNS的防护,降低DNS被缓存投毒的风险。简单总结大概有以下几点:

(1)作为权威域名的负责方,要尽量的部署多台权威DNS,比如一主多备。这样能有效的防止自己域名被投毒

        例如,test.com区,本来只有一个DNS服务器,NS为dns.test.com,对应的IP为1.1.1.1。那么攻击者伪造源IP回包的时候只需要伪造这一个IP应答给本地缓存DNS就可以了,因为本地缓存DNS肯定是向1.1.1.1发起了迭代请求。但如果有多台权威DNS,那么这个攻击的成功率就会降低,攻击的时间就会变长。因为,本地缓存DNS可能是向5.5.5.5发了www123456.test.com的域名解析请求。攻击者回的包可能回的是3.3.3.3,就算是伪造5.5.5.5回的包,那么可能已经在真正应答之后了。

(2)在选择DNS软件时要尽量选择DNS ”源端口随机性”较好的软件或者版本。

         例如,现在应用比较广泛的开源Bind软件,在比较早期的版本中,源端口的随机性并不是很好。微软windows serve中的DNS软件做“本地缓存DNS”更是不太合适,因为无论从源端口随机性、解析性能等等诸多方面都不健壮。但它也有自身的有点,例如与AD域的配合等方面。

(3)在现有的DNS基础上绑定新的安全机制,比如部署DNSSEC或者增加新的安全认证协议。

 

        总之,DNS安全是一个大课题,需要各方共同推动才会达到比较理想的效果。在日常的工作中最重要的是提高自身安全意识,了解目前负责的系统是否存在DNS安全隐患,及时的做好软件升级、做好网络规划等工作。

 

本文出自 “张舵主” 博客,请务必保留此出处http://zdzhu.blog.51cto.com/6180070/1575498

DNS安全(一)DNS缓存投毒与防护