理解什么是Windows 活动目录域
为了了解为什么我们要截获这些流量,我们就必须来快速学习一下什么是Windows 域的活动目录和DDNS(动态DNS)
Windows域的结构和网络域的结构大体上是一样的。当创建一个Windows域的时候,你首先要定义一个DNS后缀。这个DNS后缀可以比作是一个基本域(父域),这个父域是有所有的二级域组成,二级域可以是子域或者一个简单的主机名。例如,假如我们有一个Windows域thehackerblog.com ,在这个父域下需要两个Windows 活动目录:east and west。在这个结构下,我们需要在这个父域下建立两个域: east.thehackerblog.com 和west.thehackerblog.com.假设我们有一个专门的 WEB 服务器来放置 east 部门的所有文档,它的主机名就有可能类似于 documentation.east.thehackerblog.com 用这个方法,我们可以建立起一个域的树,和网络的 DNS 很像下面就是我们网络的树:
类似于documentation.east.thehackerblog.com的主机名允许计算机和人们在这个网络中轻松地找到对方。 这个网络的 DNS 服务器将会将可读的主机名转换成指定机器的 IP 地址。这样你们电脑就可以知道去哪可以找到你寻找的信息。 例如,当你在你的浏览器中输入内部网站的 URL : documentation.east.thehackerblog.com 你的电脑为了找到这个主机和路由信息到这个主机。它将向 DNS 服务器请求这个主机的 IP 地址。
给出这个结构,就有一个问题产生了。既然机器的IP地址在网络中可以经常改变。当这个documentation.east.thehackerblog.com 下的服务器突然改变IP地址 ( 假设是由于新的 DHCP 租期 , 等等 ) 将会发生什么呢? 网络的 DNS 服务器将如何指出这个主机新的 IP 地址 ?
了解Windows动态更新(DDNS)
Window的活动目录网络通过使用一个叫做动态更新的技术来解决这个问题。 这个动态更新的核心是非常简单的。 为了保持类似: documentation.east.thehackerblog.com 这种域名的 IP 地址总是新的而且正确的,这些服务器会不定期的连接到网络中的 DNS 服务器,更新它们特定的 DNS 记录。 例如,如果 documentation.east.thehackerblog.com 的 IP 地址突然改变,这个服务器就会连接到该域名的 DNS 服务器,告诉它 —Hey !我的 IP 地址已经改变了,请你更新 documentation.east.thehackerblog.com 这个域名的记录,使它能正确指向我新的 IP 地址,好让人们知道我在哪! 在现实生活中类似于一个人搬家,他就要通过邮件的方式告诉他朋友、公司和在线购物店这个新的地址。 这个进程,如下所示(引用自: “ Understanding Dynamic Update ”):
1、 DNS客户端服务器会使用这个电脑的DNS域名发送一个SOA类型的请求指令
2、客户端电脑使用当前这个电脑配置好的完全合格域名( FQDN )(例如: newhost.tailspintoys.com )作为在这个请求中已经定义好的名称
对于标准的主要区域,在SOA查询响应中返回的主服务器或拥有者是固定的和静态的。主服务器名称始终与对应的DNS名称相匹配,因为该名称会存储在区域中,并显示在SOA资源记录中。然而,如果正在更新的区域是目录集成区域,则任何加载此区域的DNS服务器都可以响应此SOA查询,并在SOA查询响应中动态插入它自己的名称作为此区域的主服务器。为了有一个标准的主区域,在SOA请求回应中的主服务器(拥有者)是确定的,静态的。主服务器名称始终与准确的DNS名称相匹配,因为该名称会存储在区域中,并显示在SOA资源记录中。
3、这个DNS客户端服务器就开始尝试和主DNS服务器连接
客户端会对它名称的SOA查询响应进行处理,以确认DNS服务器中的IP地址,以及接受它名称的主服务器的DNS服务器是被授权的。 然后,它将根据需要执行下列步骤,以联接并动态更新主服务器。
如果这个更新成功,就到此为止了。
更新请求的内容包括指示添加“newhost.tailspintoys.com”的 A(以及可能的PTR)资源记录,并删除“oldhost.tailspintoys.com”的这些相同类型的记录,因为该名称先前已经注册过。
服务器也会确认一下是否是按照客户端请求允许的更新。在标准的主区域中,动态更新并不安全;因为任何的更新尝试都会成功。而对于活动目录集成区域,更新是安全的,因为是使用基于目录下的安全设定来执行的。
以上的进程有点啰嗦,其实可以大大精简,所以我在重要部分加粗。根据客户端的响应总结出以下几点:
Windows 域名命名协议&实践指导
在我们明白Guatemalan DNS 异常之前,我们需要理解最后一段信息,即接下来Windows 域的要求:
“在默认状态,DNS客户机不会动态更新顶级域名(TLD)区域。任何单标签区域都会被认为是TLD区域。例如,com, edu, blank, my-company.为了可以让DNS客户机语序动态更新TLD区域,你可以使用Update Top Level Domain Zones策略设置或者你可以修改注册表 ”
因此,在默认状态下,你无法获取一个类似 company domain的Windows域。例如:.com, .net, 或者.gt.因为这些单标签区域会被Windows认为是顶级域名(TLD)虽然这些设置在每个单独的DNS客户机中是可以禁止的(参考:every computer in your network),这个是很简单的,仅需要一个companydomain.com 的域虽然不是所有的公司都会按照这个方式,但强烈建议这样做! 因为使一个单标签域名会引起一些矛盾。如果你在内部网路域名结尾被注册成DNS root 区域中的顶级域名 (一个著名的问题被称为是域名冲突,这个是近来,而且也是未来在互联网会议中热门讨论的话题)
现在我们拥有所需的信息,情况就会变得越清晰了, Guatemala 可能有许多 Windows 网络,在这些网络中有内部的 Windows 域,他们采用了“ .gt ”顶级域名的子域名。 例如,假设微软在 Guatemala 有自己的办公室,他们内部网络的域名可能会类似: microsoftinternal.com.gt. 这些机器会定期地更新动态 DNS 到他们网络的 DNS 服务器,来确保网络中所有的主机名称都是最新的,而且能正确路由 由于种种原因,例如防止域名与外部公司的子域名冲突,这就好比许多子网使用内部网络域名,但这些域名并不在外网中是不存在的。 例如在这个例子中,微软就可能使用一个内部的活动目录域名,例如 microsoftinternal.com.gt 。因为在这个域下的主机不会与外网的子网 microsoft.com.gt 发生冲突
但问题是,一些敏感的DNS配置错误会引起DNS把本该是发送到内网域名的DNS服务器的请求,却发往顶级域名(TLD)的服务器。
这个问题被称为是域名冲突,是一个被详细记录的问题,有时候称为是DNS询问“泄露”。
如果一个设备使用的DNS解析器,并不清楚内部网路的DNS设置,或者错误配置而允许这些请求发往外网的DNS服务器,然后这些请求就会被泄露到.gt 顶级域名服务器。因为他们是整个顶级域名空间的授权名称服务器。 域名冲突这个问题是非常普遍的,这就是为什么新的 TLD 经常要做大量的审查来确保他们不是普同内部网络的域名,比如 .local , .localhost , .localdomain , 等等。
当这个泄露问题在“.gt” 拓展的内网中发生,设备发送DNS 更新询问来更新内网的DNS记录,却意外地被发往“.gt ”顶级域名服务器上 例如,在 microsoftinternal.com.gt internal 域中的一个主机,却发送这个主机的 DNS 更新询问到 com.gt 顶级域名服务器中。下面的这个例子是执行此查询,使用 nsupdate DNS 命令行工具执行的 (在大部分的 OSX 和 Linux 系统中都是可以用的)
我们可以看到询问导致出现NXDOMAIN故障,但是不管怎么说收到一个包含maestro.gt 作为主名称服务器的SOA回应。因为这个正是主机想要找的(举例来说这是一个有效的SOA应答)它解析出了maestro.gt MNAME,所有主机会继续发送DNS更新询问到maestro.gt服务器,他的IP地址是52.15.155.128(这是我的服务器)。这个询问以失败结束,因为我已经把我的DNS服务器搭设置成拒绝而来自客户端任何的更新请求(因为我不想频繁地干涉这些设备/网络)。这就是为什么随机的设备会发送DNS更新请求到我的maestro.gt 服务器
我们面临的本质上是新的DNS漏洞,这是由于域名冲突而导致动态DNS更新会被发送到任何在顶级域名的SOA记录下的服务器。尽管不像常规的域名冲突,我们不需要注册一个完全新的顶级域名来研究这个问题,我们只需要注册一个在当前TLD的SOA记录中存在的域名。
自己动手—一个简易的实验
注意:如果你对亲自重复这些结果不感兴趣 ,可以随意跳过这个部分
如果你想在运行中看到这些动作,实际上重现真的很简单。我们将用VMware 虚拟机上安装Windows 7来作为我们实验操作系统,在系统内运行Wireshark抓包工具来抓取我们设备发送的所有DNS流量。
更改你电脑的DNS后缀,使得看起来像Guatemalan活动目录域,转到:开始> 我的电脑 >系统属性> 更改设置> 更改 >其他,然后设置主DNS后缀成 “.gt ”顶级域下的任何域 ,如下图所示:
点击OK,生成新的设定,这时会提示你重启你的电脑。请保持Wireshark运行,你应该可以看到在启动的过程中,会产生一些动态更新的询问:
上面这张我的Wireshark输出截屏,可以看出Windows在启动的过程具体活动如下:
我们现在可以看到,这些Windows设备正在不断与maestro.gt 服务器通信。
因为 Guatemala 使用的 .gt 域名空间是相当小,相比于大的顶级域,例如 .com , .net , .org , .us , 等,因为这个问题,我们仅能看到来自全球大量 DNS 询问的小部分会收到影响。 在大一点规模的顶域名中,在网络中使用了顶级域名的活动目录域,并经常访问顶级目录域,可能会产生大量的流量。
幸运的是,虽然我没能找到任何关于早期关于动态更新 SOA 劫持的研究报告,但我们却有大量过去关于普通域名冲突的研究。 这很大可能是因为担心新发布的顶级域名会与内部网络域名发送冲突,而这些内网是允许全世界的电脑或网络访问。 为了更好概述这个问题,研究这个问题的普遍性,我推荐可以去阅读 Name Collision in the DNS ,这是一篇来自 ICANN 委员会的调查报告,是为了更好地理解域名冲突问题和这个问题在广域网中的影响。 这个报告包括许多现实世界中的数据,展现出域名冲突问题是多么大,这就让我们可以推断出这个特殊的 SOA 动态更新疯狂转化的普遍性。
也许收集和发表在这个文章中关于真实世界的数据中最震撼的是下面这个表格:
上面这个表格是来自顶级域名请求的排名目录,是按照根域名服务器的DNS请求的数量排序(以千为单位)
在源报告的目录中包含了头100TLD,但是上面的图片只截出了20个。这份表格揭示了泄露的DNS请求,并真实访问根域名服务器的原始数据,而这并不意味着到此为止。由此可见,很多无效的“.local”顶级域名请求比起对.org和. arpa 请求的数量总和还多,数据排在了第三位,下面的这份饼图更加深入地揭示了问题的大小:
上图说明了45%对根服务器的请求访问是来自顶级域名,而这些顶级域名根本不存在,这些有可能是DNS请求泄露的结果。更加令人吃惊的是,由于内部网络域可能会有一个有效的顶级域,但是没有一个有效的子域,所以这个数量会更多,例如前面提到的 microsoftinternal.com.gt.这些请求对根服务器来讲是有效的(因为 .gti在根分区里是一个有效的记录)
还有一个有趣的现象是:这份报告好像提到他们观察到了这个问题的数据流量,但并没有更进一步的调查,如下图:
看起来很熟悉?上面关于 SOA 记录的讨论,几乎可以确定就是这个记录产生的流量。
这个会在报告的接下来部分再次提到:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)