提到DNS,很多人都会觉得这个概念既熟悉又有些陌生。之所以熟悉,是因为我们每天上网都会用到它;之所以陌生,是因为不少人并不清楚DNS解析背后的实际工作机制。IP地址本质上是一串数字,如果没有DNS,访问百度这样的站点,可能就需要直接输入220.181.38.148这类数字地址。DNS就像一位高效的“翻译官”,能够把人们更容易记住的域名转换为计算机能够识别的IP地址。
当然,DNS的作用并不只是域名解析这么简单。当网站服务器更换IP地址后,用户通常仍然可以继续通过原来的域名正常访问,这背后就离不开DNS记录与DNS缓存机制的支持。因此,理解DNS工作原理、DNS解析流程以及相关安全风险,对于网络安全从业人员来说,是非常基础也非常重要的知识。
域名系统(DNS)
DNS(Domain Name System,域名系统)本质上是一个分布式数据库,用来完成域名到IP地址的映射。它的解析过程其实并不难理解:当你访问www.baidu.com时,本地DNS服务器通常会优先查询自身缓存;如果缓存中没有结果,就会向根DNS服务器发起请求,再按照层级逐步查询,最终获得目标域名对应的IP地址。具体流程如下:

简单来说,本地DNS服务器会先向根服务器询问“.com域的服务器在哪里”,随后再向com域服务器查询“baidu.com的权威DNS服务器是谁”,最后再向授权服务器请求“www.baidu.com对应的IP地址是多少”。拿到查询结果后,本地DNS服务器会以应答包的形式返回给用户,并将该解析结果写入本地DNS缓存表,以便下次更快完成域名解析。Windows系统下查看和清空DNS缓存的常用命令为:
ipconfig /displaydns 和 ipconfig /flushdns。
DNS欺骗原理
虽然DNS在整个互联网架构中承担着极为关键的角色,但在早期协议设计阶段,安全性并没有被充分重视。这也导致DNS协议天生存在一些薄弱点,从而给DNS欺骗、DNS缓存投毒等攻击方式留下了可乘之机。
DNS欺骗的核心原理,就是利用DNS协议对应答包验证机制不足这一缺陷。攻击者通常会先通过ARP欺骗拦截目标主机发出的DNS请求数据包,从中分析请求ID与端口号等关键信息,然后快速伪造一个DNS应答包,抢在真实DNS服务器返回结果之前发送给目标主机。目标主机接收到该伪造响应后,如果发现其中的ID和端口号能够匹配,就可能误以为这是合法的DNS应答,并将伪造的域名与IP映射关系写入DNS缓存中。这样一来,后续真正的DNS响应即使到达,也往往会被系统丢弃。
举一个更直观的例子:假设攻击者嗅探到目标主机发出的DNS请求包内容如下:
- 源地址:192.168.1.57
- 目的地址:ns.baidu.com
- 源端口:1234
- 目的端口:53(DNS端口)
- 数据:www.baidu.com
那么攻击者就可以构造一个伪造的DNS应答包,内容如下:
- 源地址:ns.baidu.com
- 目的地址:192.168.1.57
- 源端口:53(DNS端口)
- 目的端口:1234
- 数据:www.baidu.com 192.168.1.59
当目标主机收到该应答包后,就会错误地认为www.baidu.com对应的IP地址是192.168.1.59,从而被引导访问攻击者控制的恶意服务器。这就是DNS欺骗攻击最基本的工作过程,也是DNS缓存污染常见的实现思路。
实战DNS欺骗
和ARP欺骗一样,DNS欺骗也常被称为DNS投毒或DNS毒化,属于典型的中间人攻击方式之一。下面通过虚拟机环境模拟一次DNS欺骗攻击,实验中使用的工具是Ettercap。
首先观察目标靶机,可以明显看到当前www.baidu.com解析到的IP地址是正常的:

接下来,使用Ettercap实施DNS欺骗。第一步是找到etter.dns配置文件并进行编辑:

然后添加一条A记录,把www.baidu.com指向攻击机的本地IP地址:

保存退出后,启动Ettercap并开始进行欺骗:

随后,在遭受攻击的目标主机上进行查看:

可以看到,目标主机对域名www.baidu.com的访问请求已经被错误解析到192.168.1.59。此时如果在浏览器中继续访问该域名,就会被引导到攻击者预先搭建好的WEB服务器页面:

至此,一次完整的DNS欺骗攻击就成功实现了。DNS欺骗带来的危害非常大,常见攻击场景包括网络钓鱼、恶意挂马、流量劫持、账号窃取等,其安全风险不容忽视。
DNS欺骗的防范
DNS欺骗在实际网络环境中并不容易被第一时间发现,很多情况下往往是在遭受攻击之后才暴露问题。为了尽可能降低DNS欺骗造成的安全风险,以下这些DNS安全防护措施值得重点关注:
- 由于DNS欺骗通常建立在ARP欺骗成功的基础之上,因此首先要加强对ARP欺骗攻击的检测与防御。
- 不要完全依赖DNS解析结果,虽然这样做在实际使用中会带来一定不便,但可以借助hosts文件实现固定域名与IP地址的绑定。Hosts文件位置:Windows XP/2003/Vista/2008/7系统在
c:\windows\system32\drivers\etc,使用记事本打开后即可修改。 - 安装并使用安全检测软件,定期检查系统与网络环境是否存在中间人攻击、DNS投毒等异常情况。
- 启用DNSSEC(域名系统安全扩展),从DNS协议层面提升应答验证能力,增强域名解析的安全性与可信度。
