缓存投毒攻击

安全咨询 0 206

DNS服务器缓存中的映射关系被修改,又称缓存投毒攻击

20210612230326129.png

系统检测到hosts文件中没有响应的域名的解析的时候就会发送给本地dns服务器进行解析,解析之前会先查看缓存中是否存在,如果没有,再将解析请求发送给下一个dns服务器。结果返回后将该域名的解析结果保存到缓存中,方便下一次的解析。


针对缓存中的解析的攻击有2种:传统的DNS缓存投毒攻击与kaminsky缓存投毒攻击


传统的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响应,攻击者需要知道:

目标域名的IP地址和真实的权威服务器

公开信息,容易获取

权威域名服务器的端口

53

请求的问题

目标域名

请求源端口

TxID

如何获取源端口和TxID信息?

传统DNS服务使用1个端口,并且TxID是递增的。

攻击者可以向目标DNS请求其控制的域名,从而获取源端口,并分析和预测TxID。


响应伪造的挑战

攻击必须是在目标域名服务器发出解析请求之后,并且请求域名必须是没有缓存的。

攻击者必须正确推断出响应接收端口和TxID

攻击者必须比正当响应先到达,否则域名服务器会缓存正确域名地址,直至缓存超时才能再次攻击。


缺陷

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


kaminsky缓存投毒攻击

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)中。


优势

传统DNS 缓存投毒攻击中,存在攻击所需时间长、攻击成功率低的问题,而Kaminsky 攻击克服了这一缺陷。因为Kaminsky 攻击中,每次查询都会在目标域名上添加随机序列,这使得在被攻击的本地缓存DNS的 Cache 中根本就不存在各个临时构造域名主机的记录,因此若攻击不成功,则立即更换随机序列连续不断地进行攻击,不存在有效攻击时间的问题进而提升了攻击成功率。

传统DNS 缓存投毒攻击成功后,只是污染了该与权威区中的某个域名,而Kaminsky 攻击成功后,污染的是本地缓存DNS Cache中一个域名主机的NS记录(即该域名的权威主机记录),之后对该名字服务器管辖的所有域名主机的查询都将被发送到攻击者控制的IP 地址中,破坏力度远高于传统缓存投毒攻击。


防护策略

(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或者增加新的安全认证协议。



也许您对下面的内容还感兴趣:

留言0

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。