DNS缓存投毒细节泄露
来源:http://hi.baidu.com/heartdbg
昨天Mantasano上的一篇文章描述了Dan Kaminsky的DNS域名服务器攻击的细节。该文章发表了几分钟之后即被删掉了。
虽然Dan Kaminsky已经联合厂商发布了补丁,但是仍处于补丁推送阶段,目前仍有相当一部分域名服务器还没有打补丁。如果被恶意利用的话,对整个互联网还是很有威胁的。这也是为什么Dan 希望 “not speculate publicly”。
大概看了一下那篇hypothesis,基本上还是利用了”Cache 投毒”(cache poisoning)的方法,不过使用了一些新的技巧。
DNS查询是如何进行的?对于绝大多数桌面系统来说,DNS的查询并不是由自己的机器完成的,DNS查询会提交给另一台DNS服务器(这台服务器通常是由 ISP或者公司提供),然后这台服务器再去进行真正的查询操作。这样做的好处是DNS的查询结果可以由这台机器给缓存下来,从而提高查询效率并降低由 DNS带来的流量开销。
一台缓存DNS服务器(与权威DNS相对,这类系统提供的)下面的桌面系统可能有几百、几千、几万甚至几十万台桌面系统。
DNS缓存中毒攻击指的是更改了DNS服务器的DNS缓存中某项,这样缓存中与主机名相关的IP地址就不再指向正确的位置。例如,如果 www.example.com映射到IP地址192.168.0.1且DNS服务器的缓存中存在这个映射,则成功向这个服务器的DNS缓存投毒的攻击者 就可以将www.example.com映射到10.0.0.1。在这种情况下,试图访问www.example.com的用户就可能与错误的Web服务 器联络。
当攻击者试图请求查询某站点的域名时,DNS服务器首先会检查自己的DNS缓存中是否存在该域名,如果存在则将该域名所对应的IP地址返回给请求者,如果不存在则向上一级DNS或者权威DNS查询。这就会给攻击者带来一定的困难,如果是大一点的站点的话,攻击者发起DNS查询时,DNS服务器直接从缓存应答了,根本不会去请求权威域名服务器。怎么才能解决这个问题呢?云舒在他的DNS缓存中毒漏洞的一点推测中也提到过。
比如我们要攻击www.google.com.首先向目的DNS服务器查询根本不存在的二级域名,比如:aaa.google.com. DNS服务器在缓存中查找aaa.google.com,没有找到,则会向上级DNS或者权威DNS查询 。这时我们可以生成伪造的DNS Response数据包并发送这些的伪造DNS Response数据包给目的服务器。让目的DNS在上级DNS或者权威DNS服务器响应到达之前,接受到恶意的应答。
从表面上看这样只是截持了一个不存在的二级域名,只能用来钓钓鱼罢了。
其实DNS Response数据包可以不仅仅包含aaa.google.com的IP地址,还可以在DNS 数据包的Additional resource record中包含www.google.com的IP地址(当然该IP地址可以是伪造的)。当目的DNS收到该数据报时会将伪造的IP地址与www.google.com关联起来并刷新到缓存上。这样就完成了主域名的截持。