DNS(域名系统)作为当前全球最大 、最复杂的分布式层次数据库系统,具有着开放、庞大、复杂的特性。它为全球用户提供域名解析服务,是互联网的重要基础设施。但由于其在设计之初未考虑安全性、人为破坏等因素 ,DNS系统在互联网高度发达的今天面临着严重 的安全威胁。而解决此威胁则首先需要知己知彼,既了解 DNS 设计存在的具体缺陷,又需要了解攻击手段的方式种类。本篇报告以 DNS协议原理简述切入,着重于DNS攻击(DNS反射放大攻击、DNS缓存投毒攻击)的原理与分析 。最后进行 DNS安全增强相关标准如 DNSSEC 、DNSCrypt 协议的简介。
DNS协议机制
DNS的三个主要部分
域名空间与资源记录(domain namespace and resource records)。二者是树状结构名 称空间和与这些名称关联的数据的规范。
名称服务器(name servers)。名称服务器是保存着有关域树的结构信息和设置信息的 服务器程序。
解析器(resolvers)。解析器是为了响应客户端请求从名称服务器提取信息的程序。三者在应用中的简单组织关系如下:
解析器也可以适用于缺乏解析器功能的PC群中,此时可以从本地机器中移出解析功能,并将其移进支持递归查询的名称服务器,使之同时为多个PC提供解析服务。
名词辨析:域(domain)与区域(zone)
在逻辑上,DNS由域(domain)组成,在物理上,DNS由区域(zone)组成。通过域名结构可以清晰直观地了解DNS的层次化划分,而解析过程所需的文件是以区域为单位进行存储的。
DNS域名结构:层次化的树形结构
如下图表示的是DNS的域的结构。可见通过域的划分可以清晰地了解DNS的层次划分。
DNS区域组织形式:树形结构
如下图是DNS中区域的树形结构。每个DNS区域要求至少有一个权威域名服务器发布关于这个区域的信息,因此在某些情况下域和区域的划分并不是完全重叠的。
以上便是DNS的原理简述。在实际应用过程中,用户访问本地DNS服务器时使用递归方式,即在用户视角中通过一次请求就能得到所需要的解析结果。而本地DNS服务器查询则采用迭代方式,即通过一次或多次请求才能层次渐进地找到所需结果。
DNS报文响应格式简述
DNS 查询和响应使用标准的消息格式。此消息格式有包括众多固定字段的首部和携带查询参数和 RRs 的4个部分。四个部分依次为:问题、回答、权威、附加。后三部分内皆由多条RRs组成。
首部中:操作码(4 位) 用于区分查询。1表示标准查询,2表示反向查询和状态查询。四个部分的大致含义如下:
问题查询名称等参数。
回答直接回答问题的RRs。
权威携带描述其它权威服务器的RRs。
附加其它可能有帮助的资源记录。
DNS攻击的原理与分析
由于DNS在设计之初并未考虑安全性因素,如在消息传输中未进行加密、认证、签名 等安全手段,DNS 攻击是非常常见的。攻击者开展攻击通常是为了得到收益。而对 DNS 的 攻击也可根据收益类型进行区分。一是表层利益,对应DNS欺骗。如攻击者通过克隆网站欺骗消费者进行支付,再通过欺骗手段使用户收到的解析结果为克隆网站而非正规网站。二则是深层利益,对应 Dos(拒绝服务) 攻击。如2019年亚马逊的云计算部门DNS服务器 遭受了持续了大约八小时的 DDoS (分布式拒绝服务)攻击,造成大量客户无法使用该服务。亚马逊权威 DNS 遭受到海量的查询数据,资源耗尽,无法正常响应。导致DNS服务彻底瘫痪。
DNS缓存投毒攻击
DNS 的缓存机制可以说是一把双刃剑。在性能提升方面,DNS通过在一次查询结束时 将查询结果缓存在本地服务器,在下一次查找同样域名时,直接读取对应IP地址,节省了 DNS 解析服务器间通信所需时间,能有效地缩短域名解析时间 、减少大量重复的查询 、优化用户体验,从而提升 DNS 的性能。
而在安全性方面,缓存策略增加了安全威胁,因为只要攻击者修改了缓存,所有使用该 DNS 服务器的客户都可能得到攻击者提供的 IP 地址。DNS 查询时优先从缓存中寻找解析后地址的操作,使得恶意对象只需更改缓存中特定域名对应地址,即可让 DNS 向客户端返回错误的解析结果。
DNS缓存投毒攻击属于表层收益类型。它利用DNS 欺骗技术,即使客户端查询到虚假的 IP 解析地址,再利用 DNS 服务器的缓存机制将虚假信息进行缓存,从而产生持续危害。
DNS欺骗技术需要伪造DNS回复,类型通常是UDP 数据包。为了实现伪造 UDP 数据包,攻击者需要知道请求中的一些参数,如 UDP 源端口号、请求的交易 ID、请求的问题等。由于UDP 包并没有加密措施,处于同一局域网内的攻击者可以直接捕获请求,从而嗅探到所需信息。由此可以引申出 DNS缓存投毒机制的两个子分类: 本地DNS缓存中毒攻击与远程DNS缓存中毒攻击。
本地 DNS 缓存中毒攻击
此种攻击中,攻击者与用户端处于同一局域网内。此时攻击者可以在局域网直接捕获并 解析本地 DNS 服务器请求数据包,从而实现攻击。如下图所示,①②两处消息都可被攻击 者获取,而由于 DNS 报文并未加密认证等,攻击者可以直接拦截报文获取需要的一切信息 并将内容进行篡改后给出伪造报文,发送给本地 DNS 服务器或用户端。
针对报文伪造区域又可以分为两种类别。其一是只针对DNS响应报文中回复部分的伪造,此种伪造相对危害较小,只影响一个主机名 (如将 www.baidu.com 映射到攻击者 IP)。 其二是针对DNS响应报文中权威和附加部分的伪造。攻击者将由自己控制的域名当作权威 域名服务器域名插入权威区并在附加区给出对应域名与攻击者 IP 的映射关系。伪造记录被本地DNS服务器放入缓存后,当查询目标域内任何一个主机名时,本地服务器会把请求发 给伪造的、攻击者控制的“权威域名服务器”。此种方式危害较大,可以殃及整个目标域内的 主机。
本地DNS缓存中毒攻击的弊端也很明显,由于需要与本地 DNS服务器处于一个局域网内,该攻击对攻击者的物理位置做了限制,因此很难在现实中使用,大部分缓存中毒攻击 都采用远程攻击实现。
远程 DNS 缓存中毒攻击
远程 DNS 缓存攻击应用范围更为广泛,但其难度较本地也显著增加。由于不同局域网内不能嗅探 DNS 请求数据包,远程攻击很难获取报文的两个数据:一是UDP的源端口号,二是 DNS 响应报文头部的交易 ID,二者皆为 16 比特。因此,远程 DNS 攻击需要猜测至少32位数据。然而猜测所需的时间往往超过本地 DNS服务器得到真实回答并存入缓存的时间,接受后 LDNS 就不再向权威服务器发起请求,这就会导致攻击者伪造的回复失去作用,攻击失败。因此,远程DNS缓存中毒攻击若想成功,必须想办法让 LDNS 持续发出查询请求。而当本地 DNS 的缓存失效后,伪造报文才会被接受。因此,远程DNS缓存中毒攻击需要完成三个任务:
(1) 令标 DNS 服务器发出查询报文;
(2) 伪造回复;
(3) 使缓存失效。
Kaminsky攻击是第一个成功实现的远程缓存中毒攻击。一方面,它通过发送DNS请求给目标DNS服务器触发服务器发送请求;另一方面,这种攻击手段通过不断查询随机化的域名、针对性的伪造授权记录从而绕过缓存失效的束。
具体而言,Kaminsky攻击方动访问不存在的域名,这种域名在名称服务器的缓存中并不存在,因此不存在缓存时限问题。
具体攻击方式及图示如下:
攻击者向被攻击DNS服务器询问一个随机产生的域名。
被攻击 DNS 服务器向权威域名服务器请求。
攻击者发送大量回复,猜测源端口号和交易 ID。
猜对则本地 DNS 服务器接受其中的 IP 和 NS 记录,污染被攻击 DNS 服务器的缓存。
猜错了,重新开始用另一个随机产生的域名查询实施新一轮攻击。
DNS反射放大攻击
DNS 反射放大攻击是 DDos 攻击 (分布式拒绝服务攻击) 的一种 。“放大”是指诱发一个与发送的原始包请求不成比例的服务器响应。这种攻击主要利用 DNS 应答报文比请求包大 的特点,以沿途DNS服务器为放大器,从而实现放大流量。
在DNS反射放大攻击中,攻击者通过将 DNS 报文的源地址修改为受攻击者地址,同时面向大量互联网公共递归请求海量的全记录类型域名查询,将应答包的流量引入受害的服务器,从而造成被攻击者的网络带宽、服务器性能资源的耗尽。这种攻击的对象是主机 (终端用户) 。 在 DNS 放大攻击期间,攻击者将一个伪造的 IP 地址发送到一个开放的 DNS 解析器中,促使它使用 DNS 响应报文回复该地址。无数的伪造查询被发送出去, 并且有若干 DNS 解析器同时回复 。这样受害者的网络很容易被大量DNS 响应所淹没。
普通 Dos 攻击的常见流程如下:
僵尸主机群发起大量的 (随机) 伪造域名的 DNS 请求。
收到请求的 DNS 服务器查询本地数据,如不存在则来到③。
本地服务器缓存中对应项不存在,向下一个DNS服务器请求。流程2、3多次重复。
僵尸主机群的 DNS 请求被逐级放大,大量占用目标服务器的资源。
反射放大攻击的机理与上述流程相似。放大攻击的特点也是攻击者不把通信包直接发给 受害者, 而是发给放大器(DNS 服务器),然后再反射给受害者。攻击者利用 DNS 协议回复 包比请求包大的特点,对流量进行放大,伪造请求包的源 IP,最终将 DNS 服务器的应答包 引向被攻击的目标。反射放大攻击的流程如下:
僵尸主机群发送大量、全类型的伪造源地址为受害者 IP (例如 100.100.1.1) 的 DNS 请求报文
DNS 服务器经过正常查询流程,且以为是受害者发送的请求
由于 DNS 应答报文比查询报文更大 (伪造报文时请求的是全类型) ,被攻击者 (例如 100.100.1.1) 收到大量 DNS 服务器返回的全类型应答报文,直接导致大量服务器、带宽资源被挤占,其正常功能受到极大影响,攻击成功。
对以上介绍的两类 DNS攻击的对象,做总结如下:
针对以上介绍的两种 DNS 攻击手段,主要的检测方法如下:
1. 被动监听检测法
针对DNS缓存中毒攻击 (DNS 欺骗类型) ,DNS服务器可以采用被动监听检测法检查一段时间内接收到的 DNS 应答报文。本机发出的一个DNS请求报文只会对应一个DNS响应报文,所以在一条请求后如果额定时间内收到了多个应答报文,则考虑是否遭受到了DNS欺骗。
2. 主动试探检测法
另一种针对 DNS 欺骗攻击的检测手段是主动试探检测法。DNS 服务器主动发送一个已知不可能收到回复的检测数据包,如果收到了回复,说明收到的大概率是攻击 者伪造的欺骗报文,系统正在遭受欺骗攻击。
3. 交叉检查查询法
此种方法依赖于 DNS 的反向查询功能,即通过 IP 查找对应域名,如与查询的对象一致,则确定安全 。采用此种检测方式的 DNS 服务器在收到DNS响应报文后需用 反向查询功能进行验证后才对结果予以采信。