每隔一段时间,就会发现一个新的域名系统(DNS)漏洞,使全球数十亿台设备面临风险,DNS漏洞往往很关键.想象一下,您正在浏览您的银行帐户网站,但您的DNS解析器没有返回您银行网站的IP地址,而是将您重定向到攻击者网站的地址。而且那个网站和银行的网站长得一模一样,不仅如此,即使你看地址栏,你也不会发现任何错误,因为你的浏览器实际上认为这是你的银行网站,上面是DNS缓存攻击的一个例子.在本文中,我解释了什么是DNS,并回顾了DNS缓存攻击漏洞的历史,从过去的漏洞到近年来发现的更高级的漏洞。我选择的这些漏洞几乎涵盖了过去20年出现的所有DNS缓存攻击。什么是域名系统?域名系统是一种分层和分散的命名系统,适用于连接到Internet(或专用网络)的计算机、服务或其他资源。它将各种信息与分配给每个参与对象的域名相关联。简而言之,DNS是一种主要用于将名称转换为IP地址的协议。当人们浏览http://www.example.com时,www.example.com域名被翻译成一个实际的IP地址,比如93.184.216.34。什么是DNS服务器?DNS服务器,通常称为名称服务器,是提供DNS解析的设备或程序。大多数桌面和移动操作系统中内置的DNS客户端与DNS服务器交互以将名称转换为IP地址。重要的是要记住最终只有两种类型的服务器:权威名称服务器和递归名称服务器。权威名称服务器是负责域名的名称服务器-链中的最后一个。不是权威名称服务器的一切都是递归的。例如,路由器的DNS服务器、ISP的DNS服务器、Kubernetes集群的DNS服务器都是递归的名称服务器。所有这些递归服务器的行为都相同。最后,在一些递归之后,他们联系所需域的权威名称服务器,一些服务器同时作为权威和递归名称服务器,我不会在本文中介绍。它是如何工作的?DNS协议的工作原理DNS解析器是DNS层次结构中的最低节点,例如,在Kubernetes集群中。DNS工作原理的基本思想是,当请求DNS解析器不知道的域时,首先询问DNS根服务器。根服务器是层次结构中的最高节点,其地址在解析器中被硬编码。根服务器提供负责相关DNS区域(.com、.net等)的相关顶级域(TLD)DNS服务器的地址列表。TLD服务器回答下一个较低级别服务器的地址,依此类推,直到它到达权威服务器。云中的DNS近年来,云计算迅速普及。在某些情况下,云产品实现DNS的方式可能并不直观。云中的虚拟机很简单,DNS解析器由虚拟机的操作系统决定。如果使用Windows,Windows有自己的内置DNS解析器。如果使用Linux,则取决于发行版。但是Kubernetes等其他云产品呢?与简单的虚拟机不同,Kubernetes在其节点上使用没有内置DNS解析器的自定义虚拟机。每个Kubernetes集群还包含一个特殊的容器化DNS解析器,集群中的所有应用程序将它们的DNS请求转发到这个容器化的DNS解析器,由它处理这些请求。以前,在Kubernetes1.10版本之前,曾经是kube-dns这个处理、缓存、转发DNS请求的应用包。kube-dns中的核心应用是dnsmasq。dnsmasq是一个轻量级、易于配置的DNS转发器,旨在为小型网络提供DNS服务。从那以后,Kubernetes转向了CoreDNS,一个用Go编写的开源DNS服务器,CoreDNS是一个快速灵活的DNS服务器。高速缓存高速缓存是存储数据的硬件或软件组件,以便可以更快地满足未来对该数据的请求。这是DNS服务器中的一个非常重要的功能,它使用缓存来存储以前翻译的名称。例如,如果客户端C尝试访问www.example.com,并且名称服务器将www.example.com解析为93.184.216.34,它将在任意时间内保留www.example.com的IP地址,因此下一个为尝试解析此名称而联系的DNS客户端将立即从缓存中获得答案。什么是DNS缓存攻击?DNS缓存攻击是对DNS服务器的攻击,其最终结果是服务器将攻击者的控制IP地址保存到非攻击者的控制域中。例如,攻击者设法诱使DNS服务器将www.example.com的IP地址保存为13.37.13.37,这是攻击者控制的恶意IP地址,而不是实际的真实IP地址。在缓存的IP地址超时之前,所有尝试解析www.example.com的DNS客户端都将被“重定向”到攻击者的网站。过去的DNS漏洞在过去的20年中发现了许多DNS攻击,DNS缓存攻击,也称为DNS欺骗,是最广为人知的DNS攻击。那么DNS缓存攻击是如何工作的呢?如上所述,解析器需要一些时间来解析域的IP地址。在获得权威服务器之前,通常需要联系多个服务器,攻击者可以滥用这段时间向解析器发送虚假地址。这种攻击可能在以下情况下发生,所有这些情况都会导致攻击者能够将数据包发送到解析器:解析器使其侦听端口对Internet开放;设法控制内部网络端点的攻击者;一个内部网络的客户端,浏览一个攻击者控制的网站;例如,假设攻击者已经破坏了内部网络上的一个端点,现在正试图攻击本地解析器的缓存。值得注意的是,这种攻击可以在更关键的解析器(例如ISP)上以完全相同的方式实施。当客户端访问www.example.com时,解析器缓存中缺少域,因此它会启动上述过程来解析域的地址。同时,攻击者向解析器发送一个带有假IP地址的响应包,伪造DNS服务器的响应。这是攻击的基本思路,但也有一些缓解措施,包括事务ID和源端口随机化。DNS使用称为事务ID(TXID)的名称来将每个响应与正确的请求相匹配。攻击者必须提供具有正确事务ID的响应,否则DNS服务器将丢弃数据包。这种机制是多年前发明的,但它并不是一种安全功能,只是一种将响应与请求相匹配的方式。在发现DNS漏洞之前,DNS对事务ID使用升序索引。但是,攻击者很容易猜到这个数字。DNS缓存攻击攻击者必须购买域并配置自己控制的DNS服务器。接下来,攻击者向本地网络中的解析器询问有关其域的信息。本地解析器会将请求向上转发到分层DNS阶梯,直到它到达知道攻击者控制的DNS服务器的DNS服务器。此时,原始DNS请求(来自攻击者的内部网络)将到达攻击者控制的DNS服务器,向攻击者泄露交易ID。使用攻击者先前发现的交易ID,他们可以很好地了解接受虚假响应所需的交易ID。在这种情况下,攻击者可以发送多个带有多个事务ID的虚假响应,以确保其中一个是正确的。然后,攻击者所能做的就是向不在本地DNS解析器缓存中的域发出DNS请求,并立即发送带有该域事务ID的虚假响应。本地解析器将获得带有正确交易ID的响应,删除其他交易并缓存地址。从现在开始,在任何时间范围内,将访问该域的所有本地客户端都将被定向到攻击者的网站。本文翻译自:https://unit42.paloaltonetworks.com/dns-vulnerabilities/
