利用域名碰撞实现从任何地方发起中间人攻击

利用域名碰撞实现从任何地方发起中间人攻击

相比大家对中间人劫持的攻击相当了解,尤其是局域网中的中间人攻击。有很多的利用手段比如ARP投毒、DNS投毒、ICMP重定向等等,这类的文章在网上非常的多。但是今天要讨论的是一个全新的中间人攻击方式,这种方式在近几年的顶会论文中被研究。这种中间人攻击条件一旦具备,攻击者可以从任何地方对网络发起中间人劫持。

在这篇文章里我将总结和分析这类攻击的原理,并列举目前网络上存在这些漏洞的服务应用。最后讨论一下作为软件开发人员应该怎么去防范这类攻击。

背景知识

在很多私有网络环境里会使用许多私有的域名后缀比如.ntld等等。在ICANN(The Internet Corporation for Assigned Names and Numbers)互联网名称与数字地址分配机构 最初指定的顶级域名中有.com、.org等,这些后缀的域名可以被公共网络的用户注册和使用。但是几年前,该组织对gTLD(Generic top-level domain,通用顶级域)进行了扩充,将许多泄露的私有域名后缀列为了合法的通用顶级域。这个举措就导致了后面的攻击发生。

在介绍攻击之前,需要介绍本文涉及的一些知识点。

  • (1)WPAD协议
    全称:WebProxy Auto Discovery Protocol。WPAD 通过让浏览器自动发现代理服务器,使代理服务器对用户来说是透明的,进而轻松访问互联网。WPAD 可以借助 DNS 服务器或 DHCP 服务器来查询代理自动配置(PAC)文件的位置。
  • (2)PAC文件
    全称: Proxy auto-config。一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url,host)”。这个函数返回一个包含一个或多个访问规则的字符串。 用于控制用户访问网络资源的时候是否需要使用代理以及使用何种代理。一个典型的例子如下:
  • (3)基于DNS的服务发现协议
    英文名称:DNS-based Service Discovery。基于DNS的服务发现协议在RFC 6763文件中被定义,简称DNS-SD。比如想发现一个comp.ntld域下的svc服务所在的IP和端口,整个过程如下:

    • DNS PTR请求发送给DNS服务器得到所有的服务实例名称
    • 对于每一个服务实例名称,一条SRV请求会被处理得到服务的IP和端口
    • 上述PTR和SRV请求的格式都会是_svc._prot.comp.ntld这样的,这也是标准的格式。
  • (4)AS域
    自治系统:autonomous system。在互联网中,一个自治系统(AS)是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。

WPAD中间人攻击

在你的浏览器中开启自动切换代理就是开启了WPAD协议,我们设想一个这样的攻击场景(如图)。受害者启用WPAD协议,然后去DNS服务器上请求PAC文件所在的链接,之后DNS服务器返回受害者PAC资源路径,然后受害者电脑下载这个PAC文件并设置。

问题就在于如果DNS返回给用户的是恶意的PAC文件,这个文件将所有流量代理设置为攻击者的服务器,那么受害者之后所有的流量都会被传送攻击者,这就是中间人攻击的模型。

整个中间人攻击的核心就是图中红色的返回内容,但是过去的攻击基本都要依靠局域网的投毒或者从DNS投毒、缓存等角度去实现。这篇文章利用的是域名碰撞,接下来我们将详细分析。

利用域名碰撞实现任何地方发起的中间人攻击

如下图所示,在受害者的自治域(AS)内,有一条WPAD服务请求被泄露发送到公网的DNS服务器里,比如root根服务器,由于这个服务请求是请求company.ntld域下的WPAD服务,这是个私有域,公网的根服务器当然不知道这种域名的情况,因此会返回给请求的客户端NXD消息( Non-eXistent Domain )。泄露的原因多种多样,因为DNS服务器本身查询这种不存在域名的时候会向根服务器发送查询指令导致泄露,有可能是服务应用本身配置不当导致的泄露。

公网的根服务器或者数据收集机构可能会记录下这样的域名查询记录(wpad.company.ntld)。如果攻击者通过某种手段知道了这样的域名,并且在gTLD扩充之后.ntld后缀被允许注册,那么攻击者可以合法的注册一个公网的company.ntld域名,并且绑定到攻击者的服务器。

那么危害就来了,如果私有网络自治域内的应用向外网请求了wpad.company.ntld这样的一条请求,希望知道WPAD服务器的IP和端口,那么公网的DNS服务器会解析这个域名到攻击者的服务器上,之后攻击者可以可以任意控制自治域的受害者主机代理配置,劫持受害者的流量。如果这个请求来自受害者自治域的服务程序(为这个AS所有用户提供WPAD服务),那么攻击者甚至可以将整个AS域内的全部主机流量劫持,这种危害相当巨大。

这种中间人攻击,对于攻击者来说,只需要去公网注册这样的域名就可以造成巨大的危害,成本很低。而且现实中许多服务应用在对系统底层请求DNS解析的内容都是无条件信任的,攻击者只要利用这种域名碰撞就能轻松地实现对漏洞的利用。

服务应用漏洞的定义

不仅仅是提供WPAD服务的应用,上面只是用WPAD举例,但是从前面的攻击分析可以知道,只要服务应用满足以下二个条件就能被攻击者利用:

  1. 使用的域名后缀被通用顶级域名接受
  2. 使用了基于DNS服务发现的请求,并且这个请求被泄露到公网

只要攻击者知道了这个DNS服务发现的请求链接,并在公网注册这样的域名就能返回给这样的服务应用攻击者决定的内容,可以导致很多漏洞的发生,包括中间人攻击、恶意代码注入、程序流程劫持等等。

寻找存在漏洞的服务应用

如何获得这样的DNS服务发现请求链接呢(比如wpad.company.ntld)?

作为黑客,可以通过社工、窃密、其他漏洞等等得到一个AS自治域的一些私有域名信息。作为科研人员,我们可以直接DNS根服务器记录中去发现,比如DNS-OARC Day In The Life of the Internet (DITL) 数据集。

从根服务器的记录中,我们去寻找二类记录:

  • 一是gTLD扩充前的响应为NXD的DNS请求
  • 二是现在gTLD扩充的域名后缀

从这些记录中整理提取出泄露的DNS服务发现请求,对应这些链接和服务在网络上也可以找到对应的服务程序。这里列举去年研究人员总结的服务应用和漏测试的漏洞情况如下:

防范这类攻击主要从二种层面:

  • 网络管理层面:做好网络配置,避免自治域的私有请求发送到公网。在网络内也要检测是否被外网的服务劫持。
  • 软件层面:对请求返回的内容加以验证,比如IP地址是否是允许的范围内,对一些敏感操作需要严格的控制和验证,避免恶意代码注入。

本文转载自:先知社区