Active Directory访问检查技术详解
概述
Active Directory与其他Windows技术一样,使用安全描述符和访问检查流程来确定用户对目录各部分的访问权限。目录中的每个对象都包含一个nTSecurityDescriptor属性,用于存储安全描述符的二进制表示形式。当用户通过LDAP访问对象时,系统会使用远程用户的令牌与安全描述符进行匹配,以判断其是否具有执行所请求操作的权限。
薄弱的安全描述符是常见配置错误,可能导致整个域被入侵。因此管理员需要能够发现并修复安全弱点。遗憾的是微软未提供默认的AD安全审核工具,第三方工具如Bloodhound虽能离线分析,但往往未使用真实的访问检查API,可能遗漏某些配置错误。
技术实现细节
对象ACE结构
AD扩展了ACL格式引入对象ACE。例如ACCESS_ALLOWED_OBJECT_ACE结构在标准ACCESS_ALLOWED_ACE基础上添加两个GUID:
- ObjectType:指定ACE适用的对象类型(如属性模式ID)
- InheritedObjectType:仅用于ACL继承,表示允许继承此ACE的对象类模式ID
访问检查API
需使用AccessCheckByType等支持对象ACE检查的API。调用时传入要检查的对象类型GUID列表。处理DACL时:
- 若ACE的ObjectType GUID不在传入列表中则被忽略
- 对象ACE按正常访问检查规则处理
- 非对象ACE也会被处理
访问权限类型
访问检查结果可能包含以下特定权限(括号内为PowerShell模块使用的简化名称):
- ACTRL_DS_CREATE_CHILD (CreateChild) - 创建子对象
- ACTRL_DS_DELETE_CHILD (DeleteChild) - 删除子对象
- ACTRL_DS_READ_PROP (ReadProp) - 读取属性
- ACTRL_DS_WRITE_PROP (WriteProp) - 写入属性
- 同时可能授予标准权限如READ_CONTROL、WRITE_DAC等
完整访问检查流程
为实现准确的最大权限检查,需要以下步骤:
- 从AD枚举用户在DC上的组列表
- 使用组列表构建Authz安全上下文
- 读取目录对象的安全描述符
- 获取对象模式类并构建检查列表:
- 类及其超类、辅助类中的所有属性
- 所有允许的子对象类
- 可分配的控件、验证写入和属性集扩展权限
- 将模式信息转换为访问检查的对象类型列表
- 运行访问检查并处理结果
- 对每个要检查的对象重复步骤3-6
PowerShell模块实战
基本使用
|
|
首次运行需收集域和用户信息,可能耗时较长。输出包含五列:
- 对象通用名
- 模式类
- 被检查用户
- 是否授予可修改权限
- 是否授予可控权限
高级检查示例
|
|
关键输出属性
- GrantedAccess:仅指定对象模式类时的授予访问权限
- WritableAttributes:用户可修改的属性列表
- GrantedControl:授予用户的控制扩展权限列表
- CreateableClasses:可创建的子对象类列表
- SecurityDescriptor:用于检查的安全描述符
注意事项
- 需使用域账户直接访问AD,不支持离线检查
- 未在复杂域层次结构或RODC环境中测试
- 低权限用户可能无法枚举所有AD对象
- 建议使用域/企业管理员获取完整结果
- 即使显示授予访问权限,LDAP服务器可能进行额外检查
技术局限性
虽然该工具能发现真实的访问权限,但可能存在以下情况:
- 检查结果并非100%准确
- 可能遗漏某些访问权限
- 某些操作可能被LDAP服务器显式阻止(如在Computer对象中创建组托管服务账户)
通过合理使用此工具,管理员能够有效识别AD环境中的安全配置问题,提升域安全防护能力。