借助Adidnsdump工具,用普通权限的域帐户即可获取域环境中的所有DNS解析记录

xiaohui Web安全 2019年5月14日发布
Favorite收藏

导语:本文,我会给你介绍了一个默认查询所有DNS记录的工具——Adidnsdump ,即使你是一个没有读取传送记录权限的用户,也可以使用以下方法获得域环境中的所有DNS解析记录。

在讲解本文之前,先介绍一下域账户和DNS的几个基本概念。

域账户

域账户是域是网络对象的分组。例如:用户、组和计算机。域中所有的对象都存储在 Active Directory (AD)下。Active Directory 可以常驻在某个域中的一个或多个域控制器下。

什么是DNS?

DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将服务器名和域名转换为IP地址的工作,DNS就是这样的一位“翻译官”。

为什么需要DNS解析域名为IP地址?

网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。

DNS域传送(DNS zone transfer)

DNS域传送漏洞是黑客常用的一种漏洞攻击手段,黑客可以用该漏洞快速的判定出某个特定zone的所有服务器,收集域信息,选择攻击目标,找出未使用的IP地址,黑客可以绕过基于网络的访问控制。

DNS域传送漏洞原理

DNS域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库。

DNS服务器分为:主服务器、备份服务器和缓存服务器。在主服务器和备份服务器之间同步数据库,需要使用“DNS域传送”。域传送是指后备服务器从主服务器拷贝数据,并用得到的数据更新自身数据库。

一般来说,DNS域传送操作只在网络里真的有备用域名DNS服务器时才有必要用到,但许多DNS服务器却被错误地配置成只要有client发出请求,就会向对方提供一个zone数据库的详细信息,所以说允许不受信任的网络用户执行DNS域传送(zone transfer)操作是后果最为严重的错误配置之一。

综上所述,要实现域传送漏洞,就需要一个不安全配置的DNS服务器,然后网络上的任何用户都可以获取所有传送记录并收集有关网络中服务器的信息。然而,目前还很少有人知道,如果使用Active Directory集成DNS,任何用户都可以默认查询所有DNS记录。

本文,我会给你介绍了一个默认查询所有DNS记录的工具——Adidnsdump ,即使你是一个没有读取传送记录权限的用户,也可以使用以下方法获得域环境中的所有DNS解析记录。

具体获取过程

就我个人而言,每当我接手一个新的渗透测试任务时,我都会想法设法了解测试环境的网络布局,测试对象使用的软件以及有趣数据的位置。如果测试对象有非描述性服务器名称或描述,像BloodHound或ldapdomaindump这样的工具不会有太大帮助,因为SRV00001.company.local仍然没有告诉你在这台服务器上运行的是什么。在大量IP地址上运行EyeWitness等发现工具通常会返回大量默认的Apache / IIS页面,因为大多数站点都配置为侦听DNS名称而不是IP地址。此时你如果知道DNS记录,可能就会发现SRV00001.company.local和gitlab.company.local指向同一个IP,这个IP上可能存放着大量源码。

因此,我认为访问AD的DNS记录非常有价值。为此我编写了一个可以转储这些DNS记录的Adidnsdump。你既可以直接在网络中的主机运行它,也可以通过SOCKS隧道利用。

该工具的设计思路,是在我研究Active Directory DNS时开始的,主要受到Kevin Robertson在ADIDNS 上工作的启发。当我作为普通用户提取了ADSI Edit并突然看到了域中所有DNS记录时,我试图找出AD如何在LDAP中使用域来存储DNS记录。令我惊讶的是,早在2013年,就有人开发出可以提取DNS记录的PowerShell脚本,但它并没有完全符合我的要求,所以我决定用Python编写一个版本,并添加一些选项来枚举比默认情况下更多的记录。

DNS记录到底隐藏在哪了?

在LDAP中查询DNS记录的主要方法是选择dnsNode类的所有对象,然后执行查询操作,此时,你会看到DNS域中的所有记录。当我使用filter (objectClass=dnsNode)执行查询时,返回的结果非常有限。即使我手动浏览DNS域,都可以获取更多的记录。

1.png

如上图所示,很多记录的objectClass都处于隐藏状态,我想是因为计算机DNS记录的默认权限所导致的。这让我联想到了,不是通过活动目录DNS页面创建的其他记录,也是不会允许所有用户查看其内容的。再加上IP地址实际作为这些对象的属性来存储,因此无法查看这些记录中的IP地址。

但是,默认情况下,任何用户都可以创建新的DNS记录,任何用户也可以默认列出DNS域的子对象。至此,我们就知道DNS解析记录藏在哪儿了,只是无法使用LDAP查询它们而已。

2.png

通过使用LDAP枚举知道记录所在的位置之后,我们就可以直接使用DNS查询它,因为执行常规DNS查询不需要什么特别权限,这样我们就可以解析域中的所有记录。

使用adidnsdump查询所有DNS解析记录

点此GitHub,下载adidnsdump,它可以枚举DNS域中的所有解析记录。首先,使用参数–print-zones显示当前域中的所有区域。注意,并非所有的区域都有实际意义,例如转发(forward )、缓存和存根域并不包含该域的所有记录。如果找到这些域,最好查询它们实际所属的域。在我构建的测试域中,使用参数–print-zones只会输出默认域。

3.jpg

如果我们为adidnsdump指定域或者将默认域设置为空,我们将获得一个包含所有解析记录的列表。可以列出但不能读取的记录(即上述所谓的“隐藏”DNS记录)只会显示一个问号,因为不知道其中会存在哪种类型的记录以及它们指向何处。另外,这些记录会全部被保存到名为records.csv的文件中。

4.png

要解析这些未知记录,可使用参数-r,该标志将对所有未知记录执行A查询(如果你在IPv6网络中,则可以在代码中轻松将其更改为AAAA),之前的?都会显示出具体的记录内容。

5.png

如果你没有直接连接但通过代理工作,则可以通过socks代理该工具,并使用–dns-tcp标志通过TCP执行DNS查询。

缓解措施

为了安全起见,我建议你首先要对DNS记录的安全性持有客观的认知态度。如果你确实要隐藏DNS记录,就请删除“Everyone”和“Pre-Windows 2000 Compatible Access”的“列出内容”权限,以阻止普通用户查询DNS记录。但这可能会产生负面影响,所以我不建议那样做。

所以最好的办法是及时检测DNS查询活动的出现,通过监控大量DNS查询或启用对DNS区域列表的审计可能是一种更好的缓解措施。

adidnsdump可以通过GitHub 和PyPI(pip install adidnsdump)安装使用,现在,该工具仅将获取的记录转储到CSV文件。不过,你可以自己把文件转换为其他格式。

本文翻译自:https://dirkjanm.io/getting-in-the-zone-dumping-active-directory-dns-with-adidnsdump/如若转载,请注明原文地址: https://www.4hou.com/web/17955.html
点赞 5
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论