AD域里的ACL攻防

最近文章都写星球了,所以没怎么更新。昨天看到了安全客一篇说AD域里的ACL攻防
学习到了,写篇文章更新一下
原文地址:https://www.anquanke.com/post/id/212163#h3-19
注意:有些图和文字来自安全客

介绍

首先想要了解ACL首先需要了解Access Control Model(访问控制模型),根据官网(https://docs.microsoft.com/zh-cn/windows/win32/secauthz/access-control-model)给出的定义:
访问控制模型能够控制进程访问一些安全对象,或者是控制进程执行各种系统管理任务。原文:The access control model enables you to control the ability of a process to access securable objects or to perform various system administration tasks。
用通俗一点的话来说ACM就是一个判断你在一个档案馆(在这里可以理解为整个域)里是否有权限打开某个档案抽屉(用户对象、用户组对象、Computer对象),并且是否能在这个档案抽屉中取走、存放、修改档案(读、写、修改)的一个模型。

访问模型包含哪些部分:
1、Access Tokens(访问tokens)
2、Security Descriptors(安全描述符)
a、Discretionary Access Control List (DACL)
b、System Access Control List (SACL)
Access Control Lists(ACL)
Access Control Entries(ACE)
Access Rights and Access Masks(访问权限和访问掩码)

Access Token
当线程与安全对象交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户,访问令牌包括用户的SID、所在组的SID等等信息

Security Descriptors安全描述符
SID(Security Identifiers)即安全描述符。
安全描述符标识对象的所有者,并包含以下访问控制列表:
1、Discretionary Access Control List (DACL) 自由访问控制列表
2、System Access Control List (SACL) 系统访问控制列表

每一种控制列表中都存在若干条ACE(Access Control Entries)

一张图描述

DACL

高级安全设置中的权限就是DACL的列表

SACL

高级安全设置中的审核就是SACL的列表

其中红色圈出来的每一条都是一条ACE

ACE

ACE是针对特定用户或特定组的单个权限授予(或拒绝权利)的配置结构。ACE有许多不同类型,但是在Active Directory的权限中,只有四种不同的含义,两种分别用于授予和拒绝权限。

Access Mask

Access Mask在ACE中有Access Mask这个字段,它代表着此条ACE所对应的权限,比如完全控制(GenericAll)、修改密码(ResetPassword)、写入属性(WriteMembers)等等。

TrusteesTrustees

TrusteesTrustees的意思为受委托人,受托者是一个ACE所应用到的用户账户,组账户或者是登录会话。也就是说,谁是某一个ACE的受托者,那么这条ACE中的Access Mask所对应的权限(可能是拒绝可能是通过)就会赋予受托者。比如下面这一条的受委托人实际上就是zhangs账号。

AD域里常见可利用的ACl

  • GenericAll :拥有一个可以完全控制用户/组的权限
  • GenericWrite :此权限能够更新目标对象的属性值
  • Self-Membership :这条权限指的是某个账户能够把自身添加到某个组的权限(需要在某个组的高级权限中添加ACE,也就是说针对的是组对象)
  • WriteProperty :WriteProperty直译为写所有权。这个权限利用针对的对象为组对象,能够赋予账户对于某个组的可写权限
  • WriteOwner :WriteProperty on Group说的是对一个组具有WriteProperty权限的情况下,“写入全部属性”除了WriteProperty还包括了其他的权限
  • WriteDacl :WriteDacl允许委托人修改受影响对象的DACL。这意味着攻击者可以添加或删除特定的访问控制项,从而使他们可以授予自己对对象的完全访问权限。因此,WriteDacl是在链中启用其他权利的权利。

用到的工具

ADSI编辑器
powerview

GenericAll

GenericAll on User
使用powerview添加ACL或者手动

Add-DomainObjectAcl -TargetIdentity zhangs -PrincipalIdentity yayi -Rights All -Verbose

这个权限可以完全控制用户

给予了yayi对zhangs用户完全控制的权限,在查看zhangs的时候可以发现yayi的SID在查询里出现了

此时使用yayi的用户可以修改zhangs用户密码

GenericAll on Group
环境和上文相同,GenericAll on Group说的是对一个组有GenericAll权限,查看用户组domain admins:
(yayi是新增加的)

powerview将yayi用户添加到domain admins用户添加

Add-DomainObjectAcl  -TargetIdentity "domain admins" -PrincipalIdentity yayi -Rights  all -Verbose

添加yayi用户的ACL全部控制权限后查看

可以用yayi用户控制domain admins用户组

GenericWrite (写入全部属性)

GenericWrite也是在Access Mask中进行标识,此权限能够更新目标对象的属性值,可以使用PowerView中的Set-DomainObject方法设置目标属性的值。

如果您在计算机对象上具有这些特权,那么您可以拉出Kerberos基于资源的受限委托:计算机对象接管。
参考链接:https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution

修改别的属性

Set-DomainObject zhangs -Set @{'scriptPath'='雷电芽衣'} -Verbose

WriteDacl

WriteDacl允许委托人修改受影响对象的DACL。这意味着攻击者可以添加或删除特定的访问控制项,从而使他们可以授予自己对对象的完全访问权限。因此,WriteDacl是在链中启用其他权利的权利。

个人感觉WriteDacl和GenericWrite没什么区别

Set-DomainObject zhangs -Set @{'scriptPath'='雷电女王'} -Verbose

Self-Membership

这条权限指的是某个账户能够把自身添加到某个组的权限(需要在某个组的高级权限中添加ACE,也就是说针对的是组对象)
重点:主体、添加/删除自身作为成员

此时查看dnsadmins用户组可以看到test用户的sid在dnsadmins里看到了

WriteProperty (Self-Membership)

WriteProperty直译为写所有权。这个权限利用针对的对象为组对象,能够赋予账户对于某个组的可写权限,在Domain Admins组里设置zhangs账户的WriteProperty权限
WriteProperty和Self-Membership一样 (设置的地方一模一样或者直接设置权限为:添加/删除自身作为成员)
(也可以添加其他用户进控制的组)

WriteProperty on Group

WriteProperty on Group说的是对一个组具有WriteProperty权限的情况下,“写入全部属性”除了WriteProperty还包括了其他的权限:
CreateChild, DeleteChild, Self, WriteProperty, ExtendedRight, GenericRead, WriteDacl, WriteOwner
设置一个组的写入全部属性
(相当于获取了这个组的所有权限)

WriteOwner

WriteOwner权限允许委托人修改对象的安全描述符的所有者部分。也就是说,假如用户A对administrator用户有这个权限,那么A能利用这个权限给自己附加其他的权限。

将zhangs用户的所有者设置为test,并给予test用户完全的控制权限

Set-DomainObjectOwner -Identity S-1-5-21-447451162-2905414466-2158217208-1149 -OwnerIdentity "test" -Verbose
Add-DomainObjectAcl -TargetIdentity zhangs -PrincipalIdentity test -Rights All -Verbose

给一个用户添加DCSync权限

给予test用户:复制目录更改Replicating Directory Changes (DS-Replication-Get-Changes)、 复制目录更改所有Replicating Directory Changes All (DS-Replication-Get-Changes-All)(Exchange用的就是这个)权限

Add-DomainObjectAcl -TargetIdentity "DC=DOMAIN,DC=local" -PrincipalIdentity test -Rights DCSync

使用mimikatz导出krbtgt用户的hash

mimikatz.exe "lsadump::dcsync /user:DOMAIN\krbtgt" "exit"

Invoke-ACLPwn
运行时需要.NET 3.5环境,Windows Server 2012安装遇到报错,最后的解决方法(需要在网上下载SxS的安装包https://pan.baidu.com/share/init?surl=kDgdYerM0lVB32Q_IEqLUw提取码:gwzk):

dism.exe /online /enable-feature /all /featurename:NetFX3 /Source:F:\Sources\SxS\

GitHub地址:https://github.com/fox-it/Invoke-ACLPwn
背景信息在发布者博客上:https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/
环境需要:

.NET 3.5 + sharphound.exe + mimikatz.exe

用法示例:

.\Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -NoDCSync
.\Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe
.\Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe -userAccountToPwn 'Administrator'
.\Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe -LogToFile
.\Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe -NoSecCleanup
.\Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe -Username 'testuser' -Domain 'xenoflux.local' -Password 'Welcome01!'

使用第一条标识了-NoDCSync(不会做DCSync的动作,只判断是否能够存在能够DCSync的权限)的命令
administrator用户检测出来了其他用户报错

文章上的图

针对DACL的隐身方式

通过隐藏账户可以掩盖主体本身,阻止防御者轻易的发现谁实际上拥有ACE中指定的权限。这种方式主要应对的是对于高危的ACL进行扫描行为。
隐藏用户

1、将要隐藏的用户所有者改为攻击者或者攻击者控制的账户
2、设置一条拒绝完全控制的ACE
添加SELF用户和Everyone用户拒绝类型,将要修改的组/用户名的所有者改为攻击者控制的用户名

之后就会变成一片空白,powerview也查不到

Get-DomainObjectAcl -Identity user01 -domain DOMAIN.local -Resolve

各种ACL后门

* GPO ACL后门
* ACL Dcsync后门

具体参考文章

防御ACL修改

关注日志里的5136事件

参考链接

https://www.anquanke.com/post/id/212163#h3-19
https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:AD域里的ACL攻防

本文作者:九世

发布时间:2020-08-02, 16:39:09

最后更新:2020-08-02, 17:44:13

原始链接:http://422926799.github.io/posts/be9dae0a.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录