金源娱乐滥用 GPO 攻击活动目录—Part 1_HUC惠仲娱乐

金源娱乐

链接: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


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