从DNSAdmins到域管理员:DNSAdmins不仅仅是DNS管理
Shay Ber在一年半前发布的Medium文章解释了如何以SYSTEM权限在域控制器上执行DLL,只要账户是DNSAdmins组的成员。我最终在这里发布,因为许多与我交流的人并不知道这个问题。
Shay将这个问题描述如下(粗体文本由我添加):
除了实现自己的DNS服务器外,Microsoft还为其实现了自己的管理协议,以便于管理和与Active Directory域集成。默认情况下,域控制器也是DNS服务器;DNS服务器需要被几乎所有域用户访问和使用。这反过来在域控制器上暴露了相当大的攻击面——一方面是DNS协议本身,另一方面是基于RPC的管理协议。
我们将浅显地探讨协议的实现,并详细说明一个巧妙的功能(肯定不是漏洞!),在某些情况下,它允许我们在域控制器上以SYSTEM权限运行代码,而无需成为域管理员。虽然这确实不是一个安全漏洞(因此无需恐慌),正如与Microsoft确认的那样,它仍然是一个巧妙的技巧,在红队 engagements 中可以作为AD权限提升的有用手段。
那么,这是如何可能的呢?
我将总结Shay对这个问题的优秀技术回顾(这假设DNS运行在域控制器上,这是最常见的配置)。
问题摘要
DNS管理通过RPC(UUID为50ABC2A4–574D-40B3–9D66-EE4FD5FBA076)执行,传输机制是命名管道\PIPE\DNSSERVER。
根据Microsoft协议规范,“ServerLevelPluginDll”操作使我们能够加载我们选择的dll(不验证dll路径)。
dnscmd.exe已经实现了这个选项:
|
|
当以DNSAdmins组成员身份执行此dnscmd.exe命令时,会填充以下注册表键:
|
|
重新启动DNS服务将加载此路径中的DLL;但是,DLL需要包含“DnsPluginInitialize、DnsPluginCleanup或DnsPluginQuery导出之一”。
因此,Shay描述了如何修改DLL以便正确加载并允许DNS服务成功启动。
DLL只需要在域控制器计算机账户可以访问的网络共享上可用。
请注意,Mimikatz包含一个可以定制的DLL(因为GitHub上有源代码),因此可以更新Mimikatz DLL,在DNS服务启动时加载,并监视和转储凭据到攻击者可以访问的位置。
此外,Shay指出,DNSAdmins组成员身份不是必需的。如果账户对DNS服务器对象具有写访问权限,则可以成功执行这些步骤。
Shay指出,这已向Microsoft报告: Microsoft的MSRC已就此问题联系,并表示将通过基本上只允许DC管理员更改ServerLevelPluginDll注册表键来修复此问题,并且在未来版本中可能关闭此功能。
缓解措施
确保只有管理员账户是DNSAdmins组的成员,并确保他们仅从管理员系统管理DNS。将DNSAdmins纳入成员资格仔细审查的组列表。
定期审查DNS服务器对象权限,查看任何不应具有特权访问的组/账户。
限制到DC的RPC通信仅限管理员子网。
参考
https://medium.com/@esnesenon/feature-not-bug-dnsadmin-to-dc-compromise-in-one-line-a0f779b8dc83 http://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html