
在域内获取DNS记录分为两种情况:一种是拥有了域管理员权限进行后渗透时,获取DNS记录便于下一步寻找目标;另一种是进入内网后,因为权限较低,需要获取DNS记录以寻找下一步的渗透方向进行权限提升。可以利用LDAP查询+DNS解析的方式,也可以利用ADIDNS获取DNS记录。
列出DNS区域中当前节点的资源记录,执行dnscmd /EnumZones命令,如图1-1所示

列举指定域所有DNS记录,执行 dnscmd /zonepront [domain]命令,如图1-2所示

再次列举指定域所有DNS记录,输入dnscmd /EnumRecords [domain] .命令,如图1-3所示

dnscmd是用来管理DNS服务器的命令行程序,默认在Server版本系统安装,如果想在非Server版系统使用dnscmd管理DNS,需要安装Remote Server Administration Tools(RSAT)。但在实战环境中,我们不能在目标主机中安装RAST。直接在个人版系统运行dnscmd会提示失败,通过测试发现缺少文件dnscmd.exe.mui,可将dnscmd.exe.mui复制到C:\Windows\System32\en-US下,将dnscmd复制到C:\Windows\System32下。
因为dnscmd没有提供输入用户名、密码选项,需要使用如mimikatz的Overpass-the-hash,本地模拟身份信息,如果获得了某个域用户的明文密码,可以将明文转换为NTLM哈希在进行使用。
首先执行privilege::debug sekurlsa::pth /user:Administrator /domain:[domain] /ntlm:[ntlm hash]命令对本地进行哈希传递攻击(PTH),需要使用具有本地管理员权限并通过UAC验证,如图1-4所示

然后执行dnscmd dc01.klion.local /EnumZones命令获取Dns记录,此时远程主机名应使用FQDN或计算机名,如图1-5所示

ADIDNS全名为Active Directory集成DNS。在进入内网找到域控制器位置后,我们需要进一步渗透以获取目标信息。一般来说,通过扫描Web,会发现大量的Apache/Nginx/IIS默认页面或者403页面。因为配置文件在大多数情况下会被配置为只允许域名访问,我们需要用到DNS枚举获取整个域内存在什么域名,并大致判断某台主机运行什么业务。
1) 利用SharpAdidnsdump获取DNS记录。因为普通域用户就可以访问LDAP,所以可以首先通过LDAP查询所以有计算机对象名称,然后利用DNS查询对应主机的IP地址。执行SharpAdidnsdump.exe [domain]命令,如图1-6所示。

2) 利用LDAP通过普通域用户获取域内DNS信息。首先通过LDAP查询获得DNS记录,对二进制的DNS记录进行解码,获得实际内容。随后执行powershell -ep bypass -f dns-dump.ps1 -zone [domain]命令获取DNS记录,下载地址:https://github.com/3gstudent/Homework-of-Powershell/blob/master/dns-dump.ps1,在cmd中执行,如图1-7所示

3) 在Linux环境使用adidnsdump获取DNS记录。默认情况下,任何经过身份验证的普通域用户都可以对ADI DNS记录进行转储,当我们在LDAP中查询DNS记录时,选择该类的所有对象,这些对象的dnsNode代表DNS区域中的条目。当使用过滤器进行查询(object-Class = dnsNode)时,返回结果非常有限。对于多个对象,objectClass不可见,这是因为计算机DNS记录的默认权限不是通过ADI DNS的GUI创建的,不允许所有用户查看内容,由于IP地址实际上是该对象的一个属性,因此也无法查看这些记录的IP地址。但就像默认情况下任何用户都可以创建新的DNS记录一样,任何用户也可以默认列出DNS区域的子对象。所以我们知道那里有记录,只是不能使用LDAP查询它,一旦通过LDAP枚举知道记录存在,我们就可以直接使用DNS查询它。可以利用工具adidnsdump进行转储,这样就可以解析区域中的所有记录。
4) 连接LDAP,使用过滤器&(objectClass = DnsZone)(!(DC=*arpa))(!(DC=RootDNS-Servers))列出DomainDnsZone中可用的区域。对于每个区域,可以使用过滤器&(!(object-Class = DnsZone))(!(DC=@))(!(DC=*arpa))(!(DC=*DNSZones))列出所有主机对象。
5)执行git clone https://github.com/dirkjanm/adidnsdump && cd adidnsdump && pip install .命令来安装adidnsdump。
6)使用adidnsdump -u [domain]\\[username] -p [password] [dc] -r 命令或者直接通过python调用对应的adidnsdump.py进行信息收集,通过Linux跨Windows域获取DNS信息,如图1-8所示

注意如果通过Socks5连接,配置本地Kali的proxychains即可。
域信息收集一般可以通过net(MS-SAMR)、LDAP、RSAT等方法实现,这里重点说一下RSAT。Windows Server 2008 R2(以及更新版本)提供了多个AD PowerShell cmdlet,这极大简化了使用ADSI(Active Directory Service Interface,活动目录服务接口)代码的繁琐过程。使用AD PowerShell cmdlet前,需要在Windows客户端上安装RSAT,并确保已安装Active Directory PowerShell模块。但是默认情况下,安装RSAT需要管理员权限,可以通过未安装RSAT的计算机上的PowerShell直接导入Microsoft.ActiveDirectory.Management.dll实现功能。

2)在PowerShell中执行Import-Module .\Microsoft.ActiveDirectory.Management.dll命令,导入ActiveDirectory.Management模块,如图1-10所示

注意,Microsoft.ActiveDirectory.Management.dll需要在已安装RSAT的计算机上获取。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。