从DNSAdmins到域管理员:DNSAdmins权限滥用与Active Directory安全风险

本文详细分析了DNSAdmins组权限在Active Directory环境中的安全风险,介绍了通过RPC协议加载恶意DLL实现域控制器系统级权限提升的技术细节,包括利用dnscmd工具修改注册表键值、Mimikatz DLL定制等方法,并提供了相应的缓解措施。

从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已经实现了这个选项:

1
dnscmd.exe /config /serverlevelplugindll \\path\to\dll

当以DNSAdmins组成员身份执行此dnscmd.exe命令时,会填充以下注册表键:

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\ServerLevelPluginDll

重新启动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

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计