用普通权限的域帐户获得域环境中所有DNS解析记录
DNS区域传送对安全研究人员来说是一种非常经典的攻击角度。这意味着区域网络内有可能存在一个配置不安全的DNS服务器,任意匿名用户都可给它发送指令,获得区域网络内所有域名数据。但是,相信没有多少人知道如果内网网络使用了活动目录所集成的DNS,任何内网用户都有权限查询所有的DNS记录。
本文章将介绍基于上述情况的手动查询DNS记录的方法,以及一种可以自动执行该操作的工具。
背景
就个人而言,每当我要开始一个新的渗透任务时,通常会先了解整体网络布局、网络中涉及的软件、敏感数据的位置。但是,如果网络中的服务器名称不含功能描述,只是单纯的00001,00002,00003,那么我就很难理出头绪,不知从哪开始着手。
假设使用EyeWitness
之类的工具进行扫描,你就会在返回中看到大量默认的Apache/IIS页面,因为大多数站点都配置为监听DNS名称而不是IP地址。此时你如果知道DNS记录,可能就会发现SRV00001.company.local
和gitlab.company.local
指向同一个IP,这个IP上可能存放着大量源码。
综上所述,我认为活动目录中DNS记录是具有很高的价值的。为此我还编写了一个可以转储这些DNS记录的小工具。你既可以直接在网络中的主机运行它,也可以通过SOCKS隧道利用。
开端
我之所以研究域环境中的DNS记录,主要是受到Kevin Robertson关于ADIDNS研究的启发。当我使用ADSI Edit时,试图找出活动目录如何在LDAP中的区域(zone)存储DNS记录时,突然看到了域中有关DNS记录的概述。此时我感到非常惊讶,但Kevin向我指出,mubix早在2013年就写过这方面的文章了。因此,早在2013年,就有PowerShell脚本可以提取DNS记录,但它并没有完全符合我的要求,所以我决定编写一个Python脚本,再加入一些功能。
@3xocyte也用Python编写了一个类似的脚本。
“隐藏的”DNS记录
在LDAP中查询DNS记录的主要方法是选择dnsNode
类的所有对象执行查询操作,你会看到DNS区域中的所有实体。当我使用过滤器执行查询时(objectClass=dnsNode)
,只会返回非常有限的结果。要知道,即使我手动浏览DNS区域,都可以看到更多记录:
很多对象的objectClass
都不可见,这是因为计算机DNS记录的默认权限(我认为其他记录也不是通过活动目录DNS页面创建的)不会允许所有用户查看其内容。再加上IP地址实际作为这些对象的属性来存储,因此无法查看这些记录中的IP地址。
但是,在默认情况下,任何用户都可以创建新的DNS记录,任何用户也可以列出DNS区域的子对象。总而言之,我们知道哪里有记录,只是无法使用LDAP查询它。
不过,一旦我们通过枚举LDAP知道了一条记录,就可以直接使用DNS查询它(因为执行常规DNS查询不需要特权)。这样我们就可以解析区域中的所有记录。
adidnsdump
要使用adidnsdump,你可以从我的GitHub获取,它能枚举DNS区域中的所有记录。首先,使用参数--print-zones
显示当前域中的所有区域。注意,并非所有的区域都很意义,例如转发,缓存等区域不会包含域的所有记录。如果找到这种区域,最好查询一下它们实际所属的域。下面的命令显示我搭建的测试域中只有默认区域:
user@localhost:~/adidnsdump$ adidnsdump -u icorp\\testuser --print-zones icorp-dc.internal.corp
Password:
[-] Connecting to host...
[-] Binding to host
[+] Bind OK
[-] Found 2 domain DNS zones:
internal.corp
RootDNSServers
[-] Found 2 forest DNS zones:
..TrustAnchors
_msdcs.internal.corp
如果我们为工具指定区域,我们将获得所有记录。其中会显示哪些可以列出来,但不能读取的记录(即上述所谓的“隐藏”DNS记录),会表示为问号。这些记录会全部被保存到名为records.csv
的文件中。
要解析这些未知记录,可使用参数-r
,该标志将对所有未知记录执行A
查询。此时你会发现,之前的?
突然有了记录:
如果你是通过代理连接操作,你可以使用参数--dns-tcp
,通过TCP执行DNS查询。
防御措施
为了安全起见,你可以提高记录的查询权限,删除普通人的“List content”权限,但这可能会产生负面影响,所以我不建议那样做。通过某些软件监控DNS查询动作或启用DNS区域审计可能是解决这类问题的最好方法。
工具
adidnsdump可以通过GitHub和PyPI(pip install adidnsdump)安装使用。最后的结果会转储到CSV文件,你可以自己把文件转换为其他格式。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://dirkjanm.io/getting-in-the-zone-dumping-active-directory-dns-with-adidnsdump/
最新评论