近来,网络上出现史上最强大的互联网漏洞——DNS缓存漏洞,此漏洞直指我们应用中互联网脆弱的安全系统,而安全性差的根源在于设计缺陷。利用该漏洞轻则可以让用户无法打开网页,重则是网络钓鱼和金融诈骗,给受害者造成巨大损失。
缓存中毒攻击者(cache poisoning)给DNS服务器注入非法网络域名地址,如果服务器接受这个非法地址,那说明其缓存就被攻击了,而且以后响应的域名请求将会受黑客所控。当这些非法地址进入服务器缓存,用户的浏览器或者邮件服务器就会自动跳转到DNS指定的地址。
这种攻击往往被归类为域欺骗攻击(pharming attack),由此它会导致出现很多严重问题。首先,用户往往会以为登陆的是自己熟悉的网站,而它们却并不是。与钓鱼攻击采用非法URL不同的是,这种攻击使用的是合法的URL地址。
一、DNS缓存中毒攻击原理
首先来了解一下DNS的工作过程。DNS被设计成C/S应用程序,需要把地址映射为名字或把名字映射为地址的主机调用DNS解析程序,向最近的DNS服务器发出查询请求,此时,DNS服务器可以有两种方式来响应客户的请求,一种叫递归解析,另一种叫迭代解析。DNS缓存中毒攻击主要是针对递归解析方式工作并缓存非本域的解析结果的DNS服务器。下面就主要分析递归解析过程。
(1)应用程序需要解析一个域名时,本机会发起域名解析请求,解析程序会向首选DNS服务器DNS-A发起域名解析请求;
(2)DNS-A收到解析请求后会去查询自己的管辖域,如果请求的是自己管辖域的域名就会直接将查询结果返回给解析程序,如果不在DNS-A的管辖域内,DNS-A就向它的上级服务器DNS-B发起解析请求,等待DNS-B的查询结果;
(3)如果DNS-B解析不了,就会告诉DNS-A,我解析不了,DNS-C可能会知道;
(4)DNS-A就会给DNS-C发出解析请求,等到DNS-C的查询结果;
DNS服务器不是对收到的任何DNS响应数据包都会接受,它会解码数据包,检查数据包是否符合接受的标准,那DNS服务器会检查数据包中的哪些数据来判断该数据包是不是它所希望的包呢?
1、在DNS服务器发出的查询请求包中包含了它的UDP端口号,返回的响应数据包的目的端口号不对,网络协议栈就会直接丢弃该数据包。
2、DNS服务器收到响应数据包后,可以通过检查问题域与发出的查询包中的问题域是否一致来判断响应数据包的合法性。
3、DNS服务器每发出一个查询请求都会分配对应的一个查询ID号,在内部对应是某一个域名查询请求,在DNS服务器内部区分不同的查询就是TID号,如果DNS服务器收到的响应数据包中的TID号不在DNS服务器等待响应数据的TID中,服务器就会丢弃该数据包。
4、响应数据包中的授权域和附加域
授权域和附加域中的域名必须和问题域中的域名是同属于某个域名下的子域名。
如果上述所有条件都满足了,DNS域名服务器就会确定该响应数据包是对它发出的某个查询请求的响应,接受使用相应数据包中的数据,并缓存结果。
如果某个攻击者可以预测和伪造响应数据包,他就可以对DNS服务器发起缓存中毒攻击了。由于DNS服务器发送的数据包中的TID只有16位,而且大部分的DNS实现发出的请求中的源端口都是固定不变的。因此,攻击者就可以伪造DNS响应包,DNS服务器在收到响应包后就会将解析结果保存在自己的缓存中,进而实现了缓存中毒攻击。
二、DNS缓存中毒的防护
及时检查自己的DNS服务器是否存在DNS缓存中毒漏洞,如果发现了自己的DNS服务器存在该漏洞就可以在被攻击前采取措施修补,避免攻击事件的发生。
目前检查DNS服务器是否存在缓存中毒漏洞的主要方法是模拟攻击过程中的一部分。检查的具体过程是首先需要搭建一个自己可以控制的DNS服务器,与扫描器协同工作,让扫描器向要检查的DNS服务器查询只有控制的DNS服务器才能解析的域名请求,被检查的DNS服务器需要解析该域名就会向别的DNS服务器请求解析,根据前边介绍的DNS服务器解析原理,最终被检查的服务器发出的查询请求可以被导向到我们控制的DNS服务器,这样,控制的服务器就可收到检查服务器的请求,进而可以收集到检查服务器发出请求包的特征,被控服务器就可以将收集到的特征信息作为查询的响应数据返回给检查的DNS服务器,进而可以返回给扫描器,这样扫描器就可以根据收集的特征来判断检查的DNS服务器是否存在缓存中毒漏洞。
技术层面的防护措施有如下方法:
UDP源端口随机化选择是一种比较有用的防护举措,不应该再是默认的53,而是应该在UDP端口范围内随机选择,使得投毒命中的概率极大的降低。
加密所有对外的数据流,对服务器来说就是尽量使用SSH之类的有加密支持的协议,对一般用户应该用PGP之类的软件加密所有发到网络上的数据。
禁用DNS缓存,在注册表中找到对应的键值,进行修改并保存。
及时刷新DNS,DNS缓存会被重建,再次用域名访问IP服务器,故障消失。
修改IP协议包中的TTL值可以有效防止缓存中毒,但较小的TTL值会增加服务器的负担,应根据服务器的性能和网络情况合理地选择。
采用域名系统安全协议(DNSSEC)机制,依靠公钥技术对于包含在DNS中的信息创建密码签名。
三、总结
去年发生了几次大规模的DNS攻击事件,充分暴露了DNS协议的安全隐患,我们也知道DNSSEC有着强大的优越性,虽然DNSSEC还不能完全解决DNS安全问题,但是我们有理由相信有了不断完善的DNSSEC技术,DNS安全问题将有望获得全面解决。
原文链接:https://blog.csdn.net/god_7z1/article/details/8025783
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/21668