DNS投毒攻击(DNS posing)

域名分层

域名从右到左分别为顶级域名, 二级域名…等. 如对于https://www.taobao.com这个网址, 其域名是www.taobao.com, .com是顶级域名, taobao.com是二级域名, www.taobao.com则是三级域名.

DNS查询

因为域名是分层的, 所以在进行查询时使用的DNS协议也是分层设计的. 我们可以从DNS服务器中获取部分域名对应的IP地址. DNS服务器具有和域名类似的分层设计, DNS服务器主要分为四层: 根服务器, 顶级域名服务器, 权威域名服务器, 本地域名服务器.

根服务器: 最高层次的域名服务器, 所有的根域名服务器都直到所有顶级域名服务器的域名和IP, 如果本地域名服务器中没有缓存记录, 会首先向根域名服务器发起请求.

顶级域名服务器: 管理在该顶级域名服务器注册的所有二级域名.

权威域名服务器: 负责查询域名的解析设置

本地域名服务器: 每一个ISP都可以拥有一个本地域名服务器, 也被称为默认域名服务器.

查询过程: 用户发起请求后, 主机会先查询浏览器缓存和本机操作系统缓存;

本机没有记录, 主机向本地服务器发起查询;

本地服务器没有记录, 会向根服务发起请求;

根据根服务器返回的结果, 本地服务器向对应的顶级服务器发起请求;

根据顶级服务器返回结果, 本地服务器向权威服务器发起请求;

本地服务器将解析记录告知主机, 并保存在本地缓存, 以供下次使用.

攻击

该攻击主要是通过污染DNS缓存, 使用虚假的IP地址信息替换DNS服务器中缓存的真实IP信息, 实现攻击.

DNS系统采用树形结构, 在域名解析的过程中, 会按照域名等级逐级迭代查询, 为了加速查询, 其引入了缓存机制, 即对一段时间内查询过的相关信息进行保存, 在一段时间内再次使用时直接从缓存中获取, 而不是再次查询.

DNS协议本身使用UDP协议进行传输, 这也是其被攻击的位置. 在UDP协议中, 采用相对简单的信任机制, 只对接收到的数据包进行部分内容的查验, 并且一旦受到一个合理的包之后将不再接收其余的数据包. 只要攻击者根据相关内容伪造出合理的数据包, 就可以进行投毒攻击, 攻击效果将持续缓存时间. 攻击的核心在于伪造的数据包应该先于正常的数据包到达.

传统的DNS投毒具有较大局限性, 其攻击时机较为苛刻, 必须在原有缓存失效重新向上请求时进行攻击.

Kaminsky攻击

首先介绍DNS协议数据包内部结构:

alt text

  • Header区域标识会话ID, flag和后面各区域中记录的数目
  • Queries区域一般填写需要查询的域名
  • 另外三个区域采用相同的格式, 其中存储域名, 查询类型, TTL等数据