在讲解本文之前我们先来介绍一下域账户和DNS的一些基本概念。
域帐户
域帐户是网络对象的分组。例如:用户、组和计算机。域中的所有对象都存储在 (AD) 下。它们可以驻留在域中的一个或多个域控制器下。
什么是 DNS?
DNS(Name)是“域名系统”的缩写,是一种按域层次组织起来的计算机和网络服务命名系统,用于 TCP/IP 网络。它提供的服务是将服务器名称和域名转换为 IP 地址。DNS 就是这样一个“翻译器”。
为什么需要DNS将域名解析为IP地址?
大多数网络通讯都是基于 TCP/IP,而 TCP/IP 又是基于 IP 地址的。因此,计算机在互联网上通讯时,只能识别“202.96.134.133”这样的 IP 地址,无法识别域名。我们无法记住超过 10 个 IP 地址的网站,因此我们访问网站时,一般都是在浏览器地址栏中输入域名,才能看到需要的页面。这是因为一台叫做“DNS 服务器”的计算机会自动将我们的域名“翻译”成对应的 IP 地址,然后调出 IP 地址对应的网页。
DNS 区域传输
DNS域名转移漏洞是黑客常用的一种漏洞攻击手段,黑客可以利用此漏洞快速确定特定区域内的所有服务器,收集域名信息,选择攻击目标,查找未使用的IP地址,绕过基于网络的访问控制。
DNS域名转移漏洞原理
DNS 区域传输是指备份服务器使用主服务器的数据刷新其区域数据库。
DNS服务器分为:主服务器、备份服务器和缓存服务器。若要同步主服务器和备份服务器之间的数据库,需要使用“DNS域名转移”。域名转移是指备份服务器从主服务器复制数据,并使用获取的数据更新自己的数据库。
一般来说,只有当网络上有备份域名DNS服务器时,DNS区域传输操作才是必要的,但很多DNS服务器被错误地配置为只要对方提出请求,就会向对方提供区域数据库的详细信息。因此,允许不受信任的网络用户执行DNS区域传输操作是最严重的配置错误之一。
综上所述,要实现域名转移漏洞,需要一台配置不安全的 DNS 服务器,然后网络上的任何用户都可以获取所有转移记录,并收集有关网络中服务器的信息。然而,目前还鲜为人知的是,如果使用集成 DNS,默认情况下任何用户都可以查询所有 DNS 记录。
在本文中,我将向大家介绍一个默认查询所有DNS记录的工具——,即使你是一个没有读取和转移记录权限的用户,你也可以通过下面的方法获取域环境中所有的DNS解析记录。
具体获取流程
就我个人而言,每当我进行新的渗透测试时,我都会尝试了解测试环境的网络布局、测试目标使用的软件以及有趣数据的位置。如果测试目标的服务器名称或描述不具描述性,像 或 这样的工具不会有太大帮助,因为 pany.local 仍然不会告诉您此服务器上正在运行什么。在大量 IP 地址上运行发现工具(例如)通常会返回大量默认/IIS 页面,因为大多数站点都配置为侦听 DNS 名称而不是 IP 地址。此时,如果您知道 DNS 记录,您可能会发现 pany.local 和 pany.local 指向同一个 IP,这可能是大量源代码的位置。
因此,我认为能够访问 AD 的 DNS 记录将非常有价值。为此,我编写了一个可以转储这些 DNS 记录的实用程序。您可以直接在网络中的主机上运行它,也可以通过 SOCKS 隧道使用它。
这个工具的想法始于我研究 DNS 时,主要受到 Kevin 在这方面的工作的启发。当我以普通用户身份打开 ADSI Edit 并突然看到域中的所有 DNS 记录时,我试图找出 AD 如何使用 LDAP 中的域来存储 DNS 记录。令我惊讶的是,早在 2013 年,有人开发了一个可以提取 DNS 记录的脚本,但它并没有完全满足我的要求,所以我决定用它编写一个版本并添加一些选项来枚举比默认值更多的记录。
DNS 记录隐藏在哪里?
在 LDAP 中查询 DNS 记录的主要方式是选择类的所有对象,然后执行查询操作。此时,您将看到 DNS 域中的所有记录。当我使用 (=) 执行查询时,返回的结果非常有限。即使我手动浏览 DNS 域,也可以获得更多记录。
如上图所示,很多记录都是隐藏的,我认为这是由于计算机 DNS 记录的默认权限所致。这让我想起其他未通过 DNS 页面创建的记录将不允许所有用户查看其内容。此外,IP 地址实际上是作为这些对象的属性存储的,因此这些记录中的 IP 地址无法查看。
但是,默认情况下,任何用户都可以创建新的 DNS 记录,并且任何用户都可以默认列出 DNS 域的子对象。此时,我们知道 DNS 解析记录隐藏在哪里,但我们无法使用 LDAP 查询它们。
一旦我们通过使用 LDAP 枚举记录知道记录的位置,我们就可以直接使用 DNS 进行查询。由于执行常规 DNS 查询不需要特殊权限,因此我们可以解析域中的所有记录。
用于查询所有DNS解析记录
点击此处下载,它可以枚举DNS域中的所有解析记录。首先使用参数--print-zones显示当前域中的所有区域。注意并不是所有的区域都有实际意义,例如()、cache、stub域并不包含该域的所有记录。如果发现这些域,最好查询它们实际所属的域。在我搭建的测试域中,使用参数--print-zones只会输出默认域。
如果我们指定一个域或将默认域留空,我们将获得所有解析记录的列表。可以列出但不能读取的记录(上面提到的所谓的“隐藏”DNS记录)只会显示一个问号,因为不知道会存在什么类型的记录以及它们指向哪里。此外,这些记录都将保存到名为.csv 的文件中。
要解析这些未知记录,请使用 -r 标志。此标志将对所有未知记录执行 A 查询(如果您在 IPv6 网络中,您可以在代码中轻松将其更改为 AAAA)。前面的 ? 将显示具体的记录内容。
如果您不是直接连接而是通过代理工作,则可以通过 socks 代理该工具并使用 --dns-tcp 标志通过 TCP 执行 DNS 查询。
减轻
为了安全起见,我建议你首先对 DNS 记录的安全性有一个客观的认识。如果你真的想隐藏 DNS 记录,请删除“”和“Pre-2000”的“列出内容”权限,以防止普通用户查询 DNS 记录。但这可能带来负面影响,因此我不建议这样做。
因此,最好的方法是及时检测 DNS 查询活动的发生。监控大量 DNS 查询或启用 DNS 区域列表审计可能是更好的缓解措施。
它可以通过 PyPI(pip)安装。目前,该工具仅将获取的记录转储到 CSV 文件中。但是,您可以自行将文件转换为其他格式。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。