Windows内网协议学习LDAP篇之域权限下

 

作者:daiker@360RedTeam

0x00 前言

这两篇文章主要是讲windows 域内的权限访问控制,这是下篇,主要有SeEnableDelegationPrivilege特权,一些高危ACL以及AdminSDHolder的介绍,可用于域内的ACL路径攻击以及留作后门。

 

0x01 特权

在上一篇windows 访问控制模型的时候,有讲到过,A访问B,首先判断安全对象B是不是需要特权才能访问,如果需要特权,则查看A的Access Token看有没有那个特权。。

如果我们需要赋予域用户特权一般都是通过组策略下发。比如说默认情况底下的Default Domain Controllers Policy(GUID={6AC1786C-016F-11D2-945F-00C04FB984F9})这条组策略会把SeEnableDelegationPrivilege这个特权赋予Administrators

而查询一个用户具备的特权,可以用whoami /priv来查看

然后这里着重介绍一个特权SeEnableDelegationPrivilege,其实特权这个东西不止是域,在整个windows安全体系里面都很重要,有兴趣可以深入研究下。

1. SeEnableDelegationPrivilege

在之前的文章里面,我们有详细介绍了下非约束委派以及约束委派。在之前的文章里面的利用思路一般都是找到域内的非约束委派用户或者约束委派用户,然后加以利用,因为,默认情况底下,在域内只有SeEnableDelegationPrivilege权限的用户才能设置委派。而这个权限默认域内的Administrators组的用户才能拥有,所以我们一般都是使用SeEnableDelegationPrivilege这个权限来留后门。

我们赋予kangkang SeEnableDelegationPrivilege特权(这一步需要通过组策略来实现,而且需要域管权限)

可以通过图形化的组策略管理编辑器进行编辑

这一步会同步到C:\Windows\SYSVOL\sysvol\test.local\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit的GptTmpl.inf里面去,所以这里我们也可以直接编辑GptTmpl.inf,将kangkang的sid 添加进去。

kangkang这个用户就拥有SeEnableDelegationPrivilege特权了(这一步有个地方要注意,由于是通过组策略的方法,不会立刻更新,可以通过gpupdate /force 手动更新)。

接下来我们使用kangkang这个用户来设置约束委派。

前提条件是

   kangkang拥有SeEnableDelegationPrivilege特权

   以及kangkang 对自己有GenericAll / GenericWrite权限(这个默认是没有的)

开始利用

   给kangkang 设置spn,因为只有拥有spn的用户才能设置委派(所以在一些地方,包括我之前的文章会表述为只有服务用户和机器用户才能设置委派)

   修改kangkang的userAccountControl,加上TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION

   修改kangkang的msDS-AllowedToDelegateTo

这样就配置了从kangkang 到dc2016.test.local的约束(cifs)委派

然后发起s4u2self 和s4u2proxy,模拟administrator 访问dc2016.test.local

 

0x02 ACL

1. 一些比较有攻击价值的ACL权限介绍

下面介绍一些比较有实战价值的权限,可以用以在域渗透的时候寻找攻击路径或者用于充当后门。

(1) 对某些属性的WriteProperty ,有以下属性

   member(bf9679c0-0de6-11d0-a285-00aa003049e2)

   servicePrincipalName(28630EBB-41D5-11D1-A9C1-0000F80367C1)

   GPC-File-Sys-Path(f30e3bc1-9ff0-11d1-b603-0000f80367c1)

(2) 扩展权限有

   User-Force-Change-Password(0299570-246d-11d0-a768-00aa006e0529)

可以在不知道当前目标用户的密码的情况下更改目标用户的密码

   DS-Replication-Get-Changes(1131f6aa-9c07-11d1-f79f-00c04fc2dcd2) 和 DS-Replication-Get-Changes-All(1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)

对域对象具有这两个扩展权限的用户具备dcsync 权限

(3) 通用权限有

   WriteDacl

   AllExtendedRights

   WriteOwner

   GenericWrite

   GenericAll

   Full Control

下面逐个演示利用方式

(1) AddMembers

可以将任意用户,组或计算机添加到目标组。

如果一个用户对一个组有AddMembers权限,那么这个用户可以讲任何用户加入这个组,从而具备这个组的权限。

比如说kangkang这个用户具备对Domain Admin这个组的AddMembers权限,其实也就是对member(bf9679c0-0de6-11d0-a285-00aa003049e2) 这个属性的写权限。

通过admod 将任意用户(这里是kangkang)加进Domain Admin。

adfind -users -rb CN=kangkang -dsq|admod -users -rb CN="Domain Admins" -stdinadd member

(2) servicePrincipalName(28630EBB-41D5-11D1-A9C1-0000F80367C1)

如果对一个对象有写入spn的权限,那么就可以对这个对象进行kerberosting了,如果密码强度不强的话,有机会获取到密码。

有权限,可以设置spn

查看spn

kerberoasting

(3) GPC-File-Sys-Path(f30e3bc1-9ff0-11d1-b603-0000f80367c1)

这个是一个跟组策略有关的属性,关于组策略。这里我们关心的是GPC-File-Sys-Path这个属性,这个属性讲GPO与GPT链接起来,GPT是组策略具体的策略配置信息,其位于域控制器的SYSVOL共享目录下,也就是说,如果我们能够控制GPC-File-Sys-Path的话,可以将ad活动目录里面的gpo指向我们自定义的GPT,而GPT里面包含的是组策略具体的策略配置信息,也就是说我们可以修改组策略配置信息的内容。

关于GPO,GPT的相关细节,将在下一篇文章里面详细讲。因此我们将漏洞利用留到下一篇文章,这个往往能用来充当后门。

(4) User-Force-Change-Password(0299570-246d-11d0-a768-00aa006e0529)

可以在不知道当前目标用户的密码的情况下更改目标用户的密码。

我们可以通过admod 进行强制更改密码

admod  -b CN=Administrator,CN=Users,DC=test,DC=local unicodepwd::123!@#qazwsx -optenc

(5) Dcsync

之前我们已经提过,对域对象只需要具备一下这两个权限,就有dcsync的权限。

'DS-Replication-Get-Changes'     = 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
'DS-Replication-Get-Changes-All' = 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2

(6) WriteDACL

将新ACE写入目标对象的DACL的功能。例如,攻击者可以向目标对象DACL写入新的ACE,从而使攻击者可以“完全控制”目标对象。

这里我们使用ADExplorer,给kangkang钩上复制目录更改,复制目录更改所有项 两个权限。

再来查一下

此时kangkang 就具备了dcync的权限了。

(7) AllExtendedRights

顾名思义,所有扩展权限。比如,User-Force-Change-Password权限。

(8) WriteOwner

这个权限这个修改Owner为自己。

而Owner 默认拥有WriteDacl 和 RIGHT_READ_CONTROL权限。因此我们就可以利用WriteDacl的利用方式。

\

Kankang 称为所有者之后,其实也就具备了WriteDacl的权限了。这里我给kangkang 自己增加了修改密码的权限,其实利用思路的可以自己扩展。

(9) GenericWrite

可以修改所有参数,因此包括对某些属性的WriteProperty,比如member。

(10) GenericAll

这包括riteDacl和WriteOwner,WRITE_PROPERTY等权限。随便找一个利用就行了。

(11) Full Control

这个权限就具备以上所有的权限,随便挑一个特殊权限的攻击方式进行攻击就行了。

2. AdminSDHolder

AdminSDHolder是位于Active Directory中的系统分区(CN=AdminSDHolder,CN=System,DC=test,DC=loca)中的一个对象。

这个的作用就是,他会作为域内某些特权组的安全模版。所谓安全模版,就是说有一个进程(SDProp),每隔60分钟运行一次,将这个对象的ACL复制到某些特权组成员的对象的ACL里面去。 这些特权组和用户默认有 · Account Operators · Administrator · Administrators · Backup Operators · Domain Admins · Domain Controllers · Enterprise Admins · Krbtgt · Print Operators · Read-only Domain Controllers · Replicator · Schema Admins · Server Operators

属性adminCount在Active Directory中标记特权组和用户,对于特权组和用户,该属性将设置为1。通过查看adminCount设置为1的所有对象,可以找到所有的特权组和用户。 但值得注意的是。一旦用户从特权组中删除,他们仍将adminCount值保持为1,但Active Directory不再将其视为受保护的对象。因此通过admincount=1匹配到的所有对象,不一定都是特权组

因为AdminSDHolder对象的这个作用,因此我们常常用AdminSDHolder来做后门。

我们给AdminSDHolder对象新增一条ACE。kangkang的完全控制。

由于这个ACL过个60分钟会同步到特权组和用户,这个特权组和用户包括域管,所以其实kangkang对域管已经有完全控制的权限了,达到了后门的目的。

最后还有一点,默认这个时间是60分钟是可以更改的,通过更改注册表项

HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\AdminSDProtectFrequency

这个项目默认是没有的,也就是取默认值为60分钟。没有的话,我们可以新增,这里我们设置为1分钟(在生产环境中,不宜太频繁)。

 

0x03 引用

(完)