链接:https://rastamouse.me/2019/01/gpo-abuse-part-1/

摘要

我很早就萌生出了写一篇关于组策略对象(GroupPolicyObjects,GPO)的文章的想法,我现在很开心终于把这个想法写了出来。
如果你对GPO还不太熟悉,我强烈建议您去阅读 Andy Robbins写的 A Red Teamer’s Guide to GPOs and OUs。他概述了GPO的工作原理以及如何使用BloodHound查找基于GPO控制的攻击路径,并解释了执行这些攻击的几种方法。
在利用GPO进行攻击方面,Will Schroeder取得了一些进展,他发表了一篇Abusing GPO Permissions 文章并并在Powerview中实现New-GPO ImmediateTask,然而,这个功能后来随着以下措施而变得不可用
|inconsistent and better done manually
这一系列博客文章的目的是展示如何将滥用GPO的方式一一枚举出来; 并将其用于权限提升和持久性目的。

枚举

我们可能需要关注一些特别的权限。首先在我脑海中浮现的是:
谁可以在域中创建新GPO。
谁可以将GPO链接到哪些OU。
谁可以修改现有GPO(当前可能存在链接也可能不存在链接)。
我之所以能想到这些是因为每个权限都是被单独委派的。
委派创建GPOs的权限并不会委派将它们链接到OU的权限。
用户可能可以修改现有的GPO,但它可能是未链接的,他们自己也不能链接它。
或者用户可能无法修改GPO,但可以将其链接到另一个OU。
因此,您所拥有的权限组合将取决于您如何实现这种滥用。

创建GPO

在组策略管理控制台(GPMC)中,在域中创建GPO的委派权限如下所示:

可以通过以下方法轻松枚举PowerView:

PS > Get-DomainObjectAcl -SearchBase "CN=Policies,CN=System,DC=testlab,DC=local" -ResolveGUIDs | Where-Object { $_.ObjectAceType -eq "Group-Policy-Container" }

AceQualifier           : AccessAllowed
ObjectDN               : CN=Policies,CN=System,DC=testlab,DC=local
ActiveDirectoryRights  : CreateChild                                       <--- CreateChild just means "Create GPO" in this context
ObjectAceType          : Group-Policy-Container
ObjectSID              :
InheritanceFlags       : None
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1106     <--- SID of the user/group
AccessMask             : 1
AuditFlags             : None
IsInherited            : False
AceFlags               : None
InheritedObjectAceType : All
OpaqueLength           : 0
PS > Convert-SidToName S-1-5-21-407754292-3742881058-3910138598-1106
LAB\Desktop Admins

GP-链接

Get-DomainOU显示AD中的所有Organizational Units。在这里,我们只有默认域控制器(Domain Controllers)OU和自定义工作站(Workstations)OU。

PS > Get-DomainOU

usncreated             : 6031
systemflags            : -1946157056
iscriticalsystemobject : True
gplink                 : [LDAP://CN={6AC1786C-016F-11D2-945F-00C04fB984F9},CN=Policies,CN=System,DC=testlab,DC=local;0]     <--- GUID(s) of GPO(s) already linked to the OU
whenchanged            : 06/01/2019 13:14:24
objectclass            : {top, organizationalUnit}
showinadvancedviewonly : False
usnchanged             : 6031
dscorepropagationdata  : {06/01/2019 13:15:24, 01/01/1601 00:00:01}
name                   : Domain Controllers
description            : Default container for domain controllers
distinguishedname      : OU=Domain Controllers,DC=testlab,DC=local
ou                     : Domain Controllers
whencreated            : 06/01/2019 13:14:24
instancetype           : 4
objectguid             : d312c411-7c7c-4fb7-b4f9-cbf0637b551f
objectcategory         : CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=testlab,DC=local

usncreated            : 12790
name                  : Workstations
gplink                : [LDAP://cn={7DD7A136-334C-47C1-8890-D9766D449EFA},cn=policies,cn=system,DC=testlab,DC=local;0]     <--- GUID(s) of GPO(s) already linked to the OU
whenchanged           : 07/01/2019 07:18:51
objectclass           : {top, organizationalUnit}
usnchanged            : 13118
dscorepropagationdata : {07/01/2019 07:18:51, 07/01/2019 07:17:22, 07/01/2019 07:14:37, 06/01/2019 13:52:27...}
distinguishedname     : OU=Workstations,DC=testlab,DC=local
ou                    : Workstations
whencreated           : 06/01/2019 13:28:56
instancetype          : 4
objectguid            : 4f733ab3-1809-4a31-b299-e07a3b7b4669
objectcategory        : CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=testlab,DC=local

Active Directory用户和计算机中的控制委派向导(ADUC)具有用于“管理组策略链接”的预定义模板。这对于将不同类型的特权委托给特定对象的主体非常有用。
在此示例中,我们将此委托给lab\Desktop Admins组。


这也很容易在Powerview中通过管道Get-DomainOu到Get-DomainObjectAcl并查找GP-Link ACE来进行枚举。

PS > Get-DomainOU | Get-DomainObjectAcl -ResolveGUIDs | Where-Object { $_.ObjectAceType -eq "GP-Link" }

AceQualifier           : AccessAllowed
ObjectDN               : OU=Workstations,DC=testlab,DC=local               <--- The OU Distinguished Name
ActiveDirectoryRights  : ReadProperty, WriteProperty                       <--- WriteProperty (GP-Link is a property on the OU object that you can see in the Attribute Editor of ADUC)
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : ContainerInherit                                  <--- This will be interesting later
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1106     <--- SID of the user/group
AccessMask             : 48
AuditFlags             : None
IsInherited            : False
AceFlags               : ContainerInherit
InheritedObjectAceType : All
OpaqueLength           : 0

修改GPO

我们还可以将get-DomainGPO管道插入get-DomainObjectAcl,以确定哪些主体可以对其进行修改。在这里,我们查找与WriteProperty、WriteDacl或WriteOwner匹配的ActiveDirectoryRights。(在大多数情况下,我们只希望找到WriteProperty,但是拥有WriteDacl或WriteOwner将允许我们将WriteProperty授予自己并修改GPO)。
我们为SecurityIdentifier添加了一个match,因此我们只列出RID>1000,以避免在每个GPO中看到Domain Admins和Enterprise Admins。

PS > Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs | Where-Object { $_.ActiveDirectoryRights -match "WriteProperty|WriteDacl|WriteOwner" -and $_.SecurityIdentifier -match "S-1-5-21-407754292-3742881058-3910138598-[\d]{4,10}" }

AceType               : AccessAllowed
ObjectDN              : CN={7DD7A136-334C-47C1-8890-D9766D449EFA},CN=Policies,CN=System,DC=testlab,DC=local
ActiveDirectoryRights : CreateChild, DeleteChild, Self, WriteProperty, DeleteTree, Delete, GenericRead, WriteDacl, WriteOwner
OpaqueLength          : 0
ObjectSID             :
InheritanceFlags      : None
BinaryLength          : 36
IsInherited           : False
IsCallback            : False
PropagationFlags      : None
SecurityIdentifier    : S-1-5-21-407754292-3742881058-3910138598-1105     <--- SID of the user/group
AccessMask            : 983295
AuditFlags            : None
AceFlags              : None
AceQualifier          : AccessAllowed

AceType               : AccessAllowed
ObjectDN              : CN={7DD7A136-334C-47C1-8890-D9766D449EFA},CN=Policies,CN=System,DC=testlab,DC=local
ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, GenericExecute
OpaqueLength          : 0
ObjectSID             :
InheritanceFlags      : ContainerInherit
BinaryLength          : 36
IsInherited           : False
IsCallback            : False
PropagationFlags      : None
SecurityIdentifier    : S-1-5-21-407754292-3742881058-3910138598-1109     <--- SID of the user/group
AccessMask            : 131127
AuditFlags            : None
AceFlags              : ContainerInherit
AceQualifier          : AccessAllowed
PS > Get-DomainGPO | Where-Object { $_.DistinguishedName -eq "CN={7DD7A136-334C-47C1-8890-D9766D449EFA},CN=Policies,CN=System,DC=testlab,DC=local" } | Select-Object DisplayName

displayname
-----------
Workstation Policy

如GPMC的Details选项卡中所示,lab\bwall ace是此名为Workstation Policy的GPO的owner。


GPO的创建者会自动获得Edit settings, delete, modify security权限,具体包括CreateChild、DeleteChild、Self、WriteProperty、DeleteTree、Delete、GenericRead、WriteDacl、WriteOwner。


在此示例中,lab\tlockhart获得了Edit settings权限,即CreateChild、DeleteChild、ReadProperty、WriteProperty、GenericExecute。

映射GPO和OU

这可以从几个不同的角度进行。您可能有一个有趣的GPO,并想知道单个GPO适用于哪些OU和/或计算机;您可能希望列出应用于特定OU的每个GPO;或者您可能希望列出适用于特定计算机的每个GPO。

By computer

在这里,我们列出了应用于ws-1.testlab.local的每个GPO-仅显示名称和GUID名称。

PS > Get-DomainGPO -ComputerIdentity ws-1 -Properties Name, DisplayName

displayname           name
-----------           ----
Demo GPO              {ECB75201-82D7-49F3-A0E0-86788EE7DC36}
Workstation Policy    {7DD7A136-334C-47C1-8890-D9766D449EFA}
Default Domain Policy {31B2F340-016D-11D2-945F-00C04FB984F9}

GPO有点滑稽,因为它们有一个显示名称、GUID名称和一个对象GUID。后两者特别容易混淆。

By GPO

在这里,我们列出Demo GPO适用的每个OU 。我们在GPLink搜索过滤器中使用GUID名称。

PS > Get-DomainOU -GPLink "{ECB75201-82D7-49F3-A0E0-86788EE7DC36}" -Properties DistinguishedName

distinguishedname
-----------------
OU=Domain Controllers,DC=testlab,DC=local
OU=Workstations,DC=testlab,DC=local

如果您随后需要知道这些OU中有哪些计算机,您可以使用执行此操作:

PS > Get-DomainComputer -SearchBase "LDAP://OU=Workstations,DC=testlab,DC=local" -Properties DistinguishedName

distinguishedname
-----------------
CN=WS-1,OU=Workstations,DC=testlab,DC=local
CN=WS-2,OU=Workstations,DC=testlab,DC=local
CN=WS-3,OU=Workstations,DC=testlab,DC=local

By OU

如果我们获得Workstation OU的GPLink属性(它告诉我们链接到它的每个GPO),结果将作为一个文本字符串返回,这意味着我们不能直接将其插入Get-DomainGPO并找到它们对应的显示名称。

PS > Get-DomainOU -Identity "Workstations" -Properties GPLink

gplink
------
[LDAP://cn={ECB75201-82D7-49F3-A0E0-86788EE7DC36},cn=policies,cn=system,DC=testlab,DC=local;0][LDAP://cn={7DD7A136-334C-47C1-8890-D9766D449EFA},cn=policies,cn=system,DC=test...

相反,我们可以这样做:

PS > $GPLink = (Get-DomainOU -Identity "Workstations" -Properties GPLink).gplink
PS > [Regex]::Matches($GPLink, '(?<={)(.*?)(?=})') | Select-Object -ExpandProperty Value | ForEach-Object { Get-DomainGPO -Identity "{$_}" -Properties DisplayName }

displayname
-----------
Demo GPO
Workstation Policy


您可能会注意到,在这些示例中,有些通过继承返回包含的GPOs(例如默认域策略),而有些则不返回。

继承

我发现继承非常有趣,特别是涉及到控件向导的委托时。认情况下,它将启用此对象和所有降序对象(This object and all descending objects)的继承。

PS > Get-DomainOU | Get-DomainObjectAcl -ResolveGUIDs | Where-Object { $_.ObjectAceType -eq "GP-Link" }

AceQualifier           : AccessAllowed
ObjectDN               : OU=Workstations,DC=testlab,DC=local
ActiveDirectoryRights  : ReadProperty, WriteProperty
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : ContainerInherit     <---
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1106
AccessMask             : 48
AuditFlags             : None
IsInherited            : False                <--- This OU *is not* inheriting from elsewhere
AceFlags               : ContainerInherit     <---
InheritedObjectAceType : All
OpaqueLength           : 0

如果我们随后在此OU中创建了一个新的OU,Lab\Desktop管理员将继承该OU上相同的GP-Link权限。

AceQualifier           : AccessAllowed
ObjectDN               : OU=DAs,OU=Workstations,DC=testlab,DC=local     <--- DA OU is a child of Workstation OU
ActiveDirectoryRights  : ReadProperty, WriteProperty
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : ContainerInherit                <---
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1106
AccessMask             : 48
AuditFlags             : None
IsInherited            : True                            <--- This OU *is* inheriting
AceFlags               : ContainerInherit, Inherited     <---
InheritedObjectAceType : All
OpaqueLength           : 0

如果我们将WorkstationsOU 上的继承手动修改为This object only,新ACL将如下所示:

AceQualifier           : AccessAllowed
ObjectDN               : OU=Workstations,DC=testlab,DC=local
ActiveDirectoryRights  : ReadProperty, WriteProperty
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : None    <---
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1106
AccessMask             : 48
AuditFlags             : None
IsInherited            : False    <---
AceFlags               : None     <---
InheritedObjectAceType : All
OpaqueLength           : 0


最后,如果您有这样的嵌套子对象:

DA OU将从Workstations和 Admins继承。因此,我们在Workstations上为Lab\Desktop Admins委派了一个权限,在管Admins上为Lab\Team 2委派了一个权限-DA OU将继承这两个权限。

AceQualifier           : AccessAllowed
ObjectDN               : OU=Workstations,DC=testlab,DC=local
ActiveDirectoryRights  : ReadProperty, WriteProperty
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : ContainerInherit
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1106
AccessMask             : 48
AuditFlags             : None
IsInherited            : False
AceFlags               : ContainerInherit
InheritedObjectAceType : All
OpaqueLength           : 0

AceQualifier           : AccessAllowed
ObjectDN               : OU=Admins,OU=Workstations,DC=testlab,DC=local
ActiveDirectoryRights  : ReadProperty, WriteProperty
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : ContainerInherit
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1110
AccessMask             : 48
AuditFlags             : None
IsInherited            : False
AceFlags               : ContainerInherit
InheritedObjectAceType : All
OpaqueLength           : 0

AceQualifier           : AccessAllowed
ObjectDN               : OU=Admins,OU=Workstations,DC=testlab,DC=local
ActiveDirectoryRights  : ReadProperty, WriteProperty
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : ContainerInherit
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1106
AccessMask             : 48
AuditFlags             : None
IsInherited            : True
AceFlags               : ContainerInherit, Inherited
InheritedObjectAceType : All
OpaqueLength           : 0

AceQualifier           : AccessAllowed
ObjectDN               : OU=DAs,OU=Admins,OU=Workstations,DC=testlab,DC=local
ActiveDirectoryRights  : ReadProperty, WriteProperty
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : ContainerInherit
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1110
AccessMask             : 48
AuditFlags             : None
IsInherited            : True
AceFlags               : ContainerInherit, Inherited
InheritedObjectAceType : All
OpaqueLength           : 0

AceQualifier           : AccessAllowed
ObjectDN               : OU=DAs,OU=Admins,OU=Workstations,DC=testlab,DC=local
ActiveDirectoryRights  : ReadProperty, WriteProperty
ObjectAceType          : GP-Link
ObjectSID              :
InheritanceFlags       : ContainerInherit
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-407754292-3742881058-3910138598-1106
AccessMask             : 48
AuditFlags             : None
IsInherited            : True
AceFlags               : ContainerInherit, Inherited
InheritedObjectAceType : All
OpaqueLength           : 0


我想现在已经够多的了!在下一部分中,我们将从一些滥用行为开始。

源链接

Hacking more

...