DNS解析是互联网中一项非常重要的功能,是用户访问网站的关键环节,我们日常工作生活使用网络都伴随着大量的DNS服务做支撑。DNS将用户容易记忆输入的域名指向可由计算机直接识别的IP地址,是确保用户通过域名访问网站,维持网络空间正常秩序的导航系统。
但DNS在设计之初只注重实用性和便捷性,而忽视了安全性,DNS查询过程通常是基于无连接不可靠的UDP协议,这就导致DNS查询过程中验证机制的缺失,黑客很容易利用该漏洞进行攻击。DNS服务器可能面临如下DNS攻击风险:
(1)黑客伪造客户端源IP地址发送大量的DNS请求报文,造成DNS request flood攻击。
(2)黑客伪造成授权服务器发送大量的DNS回应报文,造成DNS reply flood攻击。
(3)黑客篡改某些网站的域名和IP地址对应关系,导致用户访问被导向至其他网站。
(4)黑客向DNS服务器发送大量错误格式的DNS异常报文,或者发送大量超长DNS报文,导致DNS服务器处理这些报文时出现异常,拒绝正常服务。
接下来我们重点介绍常见的一些DNS攻击以及相应的防御措施。
DNS request flood攻击原理非常简单,就是黑客通过控制僵尸网络向DNS服务器发送大量域名的解析请求,导致DNS服务器因大量解析请求而过载,无法响应正常用户的DNS请求。
在DNS request flood攻击过程中,攻击目标可能是权威服务器,也可能是递归服务器,攻击目标不同,所采用的防御手段也不同。对于递归服务器,向它发送DNS请求的是终端用户,所以防御过程中,需要判定这个DNS请求是否是由真实的浏览器客户端发出;而对于权威服务器,向它发送DNS请求的可能就是递归服务器,所以认证方式也应有所不同。
1.针对虚假源攻击
授权服务器源认证(即ns重定向方式),可以有效防御DNS Request Flood虚假源攻击。重定向只针对访问受攻击域名的源IP地址实施,以减少误判和避免对正常业务的访问延时。
基于目的地址对DNS Request报文的速率进行统计,当DNS request报文的速率超过阈值时,启动重定向。
(1)返回给请求源一个别名地址,如果请求源是虚假源,则不会回应重定向报文,认证不通过报文丢弃。
(2)如果请求源是真实源,则重新请求发送的重定向地址。认证通过将此真实源加入白名单。
(3)再次重定向正确的地址,请求源重新请求正确地址,报文命中白名单,直接放行到达授权服务器,完成报文交互。
2.针对真实源攻击
如果是真实源攻击,经过上述防御过程后,通过的DNS报文还很大,则可以继续采用以下方式进行防御。
(1)DNS请求报文限速:对于大流量的DNS request flood攻击是一种非常有效的防御方式。
(2)DNS request报文限速源IP行为控制,丢弃超出阈值的DNS request报文。
(3)另外还需要对异常DNS报文进行检查,将非标准格式的DNS报文直接丢弃。
DNS服务器收到DNS回应报文时,不管自己有没有发过解析请求,都会处理这些DNS回应报文。DNS reply flood攻击是黑客发送大量的DNS回应报文到DNS缓存服务器,导致缓存服务器因为处理这些DNS回应报文而耗尽资源,影响正常业务的过程。
DNS reply flood大多都是虚假源攻击,黑客控制僵尸主机发出的DNS reply报文的源IP地址通常都是伪造的,是不存在的,所以在防御的时候,就可以从回应源IP地址的真假性入手,判定这个源IP是否是真实源。
针对DNS reply flood攻击的应对方式主要有:
1.DNS reply报文限速
DNS reply报文限速对于大流量的DNS Reply flood攻击是一种非常有效的防御手段,主要分为对指定域名限速和对指定IP限速两种,分别将匹配了指定域名和指定IP的DNS reply报文进行限速,将超过阈值的DNS reply报文直接丢弃处理。
2.异常DNS报文的检查
除DNS reply报文限速外,还可以针对异常DNS报文进行检查,从而过滤掉恶意的DNS请求数据。
(1)DNS报文格式:对DNS报文格式进行检查,将非标准的DNS报文直接丢弃。
(2)DNS报文长度:通常情况下,基于UDP协议的DNS协议长度都不大于512字节,而很多DNS flood经常采用超大DNS报文以造成链路堵塞,因此可以将报文长度作为检测DNS报文是否正常的一个标准,当DNS报文长度超过阈值时,直接将DNS报文丢弃处理 。
(3)DNS报文的TTL值
将DNS报文的跳数限制在DNS报文允许跳数范围内,当DNS报文的跳数超出阈值时,直接丢弃该DNS请求报文。
此外,还有一种升级版的DNS reply flood攻击,它的破坏性更强,这就是DNS反射攻击。
黑客将自己的源IP地址伪造成被攻击目标的IP地址,然后向网络中开放的DNS服务器发送大量的查询请求。
由于DNS回应报文通常是请求报文的几倍甚至几十倍,这些放大后的DNS回应报文被引导至被攻击目标,导致网络拥塞,拒绝正常服务器,从而达到放大攻击的效果。
DNS反射攻击和前面介绍的传统DNS reply flood攻击有两点本质的不同。
(1)传统DNS reply flood攻击的攻击目标一般是DNS缓存服务器;而DNS反射攻击的攻击目标一般是客户端。
(2)传统DNS reply flood攻击大多是虚假源攻击,而在DNS反射攻击中,DNS请求报文都是真实的,DNS回应报文也都是真实的。
在实际的DNS解析过程中,当用户对某个域名发起请求时,递归服务器首先会查看自身的DNS缓存,如果缓存中恰好有该域名的记录,就会直接将结果返回给用户,用户对所得的IP地址发起访问。如果缓存中没有记录,才会发起全球解析查询。
这种查询机制,缩短了解析查询的时间,可以让用户获得更快的访问体验,但也存在一定的安全风险。如果攻击者通过控制用户的主机或者使用恶意软件攻击用户的DNS缓存,就可以对DNS缓存中的域名映射关系进行篡改,将域名解析结果指向一个虚假IP。
在这种情况下,用户对该网站发起请求时,通过DNS系统的解析会直接将虚假的映射关系返给用户,将用户引导至虚假站点之上,从而造成信息泄露,财产安全受到影响。
针对DNS缓存投毒,主要有以下几种应对措施:
1.使用可信的ISP或DNS服务器
由于用户的计算机通常会直接使用ISP所提供的DNS服务器。因此,尽量选择信誉良好且配备了全面安全措施的ISP,才能有效预防缓存投毒。如果不放心ISP提供的默认DNS服务器的话,也可以自行改用其他可信的DNS服务器,以减少受攻击的可能性。
2.刷新DNS缓存
为了获取最新的DNS解析记录,预防遭受DNS缓存投毒攻击,用户可以定期对自己的系统进行DNS缓存清理工作,操作方法:Win+R快捷键→输入:cmd→输入:ipconfig/flushdns→回车。
3.复查访问过的目标网站
虽然计算机会机械地认为,只要你输入的网站URL没错的话,它访问到的就是真实的IP地址。但是我们可以更谨慎地检查访问的网站是否是目标网站,检查网页的地址栏上是否有HTTPS加密,以及它的界面是否看起来可疑。一旦发现自己访问的是虚假网站,立即退出该网站,并执行病毒扫描和DNS缓存刷新。
4.重新启动路由器以清除其DNS缓存
我们常用的路由器也可能带有自己的DNS缓存功能,它们和上面提到的用户计算机以及DNS服务器一样,容易受到DNS投毒的攻击。因此,定期重启路由器,将有利于清除已有的DNS缓存,并重新获取新的映射记录。