ActiveDirectory安全攻防(五)

admin 2026-07-13 05:35:58 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文解析ActiveDirectory中Schema默认权限机制,指出对象创建时从Schema读取默认安全描述符(SDDL格式)作为初始权限模板。详细介绍了SDDL语法结构、ACE条目格式、常见权限代码和安全主体代码,并以user类为例实战解析其默认权限:DomainAdmins、System、AccountOperators拥有完全控制,用户自身仅有读取和更改密码权限。理解此机制对安全审计与攻防研究至关重要。 综合评分: 87 文章分类: 渗透测试,红队,内网渗透,安全建设,技术标准


cover_image

Active Directory安全攻防(五)

原创

寰宇秘阁 寰宇秘阁

寰宇密阁

2026年7月11日 10:00 安徽

在小说阅读器读本章

去阅读

在前几篇文章中,我们深入探讨了 Active Directory 的访问控制列表(ACL)机制、SDProp 安全描述符传播器以及 AdminSDHolder 容器的保护原理。我们了解到,AD 中对象的权限来源是多层次的——既有通过组织单位(OU)委派的权限,也有 SDProp 机制为高权限账户强制设定的权限。

然而,还有一个常被忽视但同样重要的权限来源:Schema(架构)中定义的默认权限

每当 Active Directory 创建一个新对象(如用户、计算机、组等),系统并不是从零开始构建其安全描述符的。相反,AD 会从 Schema 中读取该对象类预定义的默认安全描述符,作为新对象的初始权限模板。这些默认权限使用一种名为 SDDL(Security Descriptor Definition Language,安全描述符定义语言) 的专用字符串格式进行定义。

理解 Schema 默认权限和 SDDL 语法,对于安全审计、权限分析以及攻防研究都至关重要。本文将详细解析这一机制。


在深入 Schema 默认权限之前,让我们先回顾一下 Active Directory 中对象权限的完整来源体系:

| 权限来源 | 描述 | 适用范围 | | — | — | — | | Schema 默认权限 | 在对象创建时,从 Schema 中该对象类的 defaultSecurityDescriptor 属性读取并应用 | 所有新创建的 AD 对象 | | OU 级别的委派权限 | 通过在组织单位上配置 ACL 实现权限继承,子对象继承父容器的权限 | OU 内的对象(通过继承) | | SDProp 强制权限 | AdminSDHolder 容器上的 ACL 模板,由 SDProp 进程周期性地强制覆盖到受保护账户 | 受保护安全组的成员(adminCount=1) |

这三层权限共同构成了 AD 对象最终的有效权限。其中,Schema 默认权限是最基础的一层——它决定了对象”出生”时的权限状态。


二、Schema 中的默认安全描述符

2.1 什么是 Schema?

Active Directory Schema(架构)定义了目录数据库中可以存储的所有对象类型(类)和属性。可以将 Schema 理解为 AD 的”数据字典”或”蓝图”——它规定了:

  • 类(Class)

    :可以创建哪些类型的对象(如 usercomputergrouporganizationalUnit 等)

  • 属性(Attribute)

    :每种对象可以拥有哪些属性(如 sAMAccountNamemailmemberOf 等)

  • 默认安全描述符

    :每种对象在创建时应具有的初始权限

2.2 查看 Schema 中的默认权限

要查看某个对象类的默认安全描述符,可以通过以下两种方式:

方式一:使用 Schema 管理单元(Schema Snap-in)

  1. 运行 regsvr32 schmmgmt.dll 注册 Schema 管理单元
  2. 打开 MMC 控制台,添加”Active Directory 架构”管理单元
  3. 展开”类”节点,找到目标类(如 user
  4. 右键点击 → 属性 → 切换到 “默认安全性(Default Security)” 选项卡

在这个选项卡中,你可以看到以图形化方式展示的默认权限配置。

方式二:使用 ADSI 编辑器(adsiedit.msc)

  1. 打开 ADSI 编辑器
  2. 连接到 Schema 命名上下文
  3. 找到目标类对象(如 CN=User,CN=Schema,CN=Configuration,DC=...
  4. 查看其 defaultSecurityDescriptor 属性

该属性的值是一个 SDDL 格式的字符串,这就是我们接下来要重点解析的内容。

2.3 defaultSecurityDescriptor 属性

defaultSecurityDescriptor 是 Schema 中每个类对象上的一个属性,它以 SDDL 字符串的形式存储了该类对象的默认权限模板。

例如,user 类的 defaultSecurityDescriptor 可能类似如下:

D:(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;AO)(A;;RPLCLORC;;;PS)(OA;;CR;ab721a53-1e2f-11d0-9819-00aa0040529b;;PS)...

这段看起来像”天书”的字符串,实际上是一种高度结构化的权限描述语言。让我们来逐步解析它。


三、SDDL 安全描述符定义语言详解

3.1 SDDL 概述

SDDL(Security Descriptor Definition Language) 是 Microsoft 定义的一种文本格式,用于描述安全描述符。它将复杂的二进制安全描述符转换为人类可读(虽然不太友好)的字符串表示。

SDDL 字符串的基本结构如下:

O:<所有者SID>G:<主组SID>D:<DACL>S:<SACL>

| 组成部分 | 含义 | | — | — | | O: | Owner(所有者)——对象的所有者 SID | | G: | Group(主组)——对象的主组 SID | | D: | DACL(自主访问控制列表)——定义谁可以访问对象 | | S: | SACL(系统访问控制列表)——定义审计规则 |

在 Schema 的 defaultSecurityDescriptor 中,最常见的是 D: 部分(DACL),它定义了对象的默认访问权限。

3.2 ACE 条目的格式

DACL 部分由一系列 ACE(访问控制条目) 组成,每个 ACE 用括号包裹,格式如下:

(ACE_Type;ACE_Flags;Rights;Object_GUID;Inherit_Object_GUID;Account_SID)

各字段的含义:

| 字段 | 含义 | 示例 | | — | — | — | | ACE_Type | ACE 类型 | A = 允许(Access Allowed),D = 拒绝(Access Denied),OA = 对象特定的允许 | | ACE_Flags | 继承标志 | CI = 容器继承,OI = 对象继承 | | Rights | 权限代码 | RP = 读取属性,WP = 写入属性,CC = 创建子对象等 | | Object_GUID | 对象 GUID(仅对象特定 ACE) | 控制权限适用于哪个属性或扩展权限 | | Inherit_Object_GUID | 继承对象 GUID | 控制继承适用于哪种子对象类型 | | Account_SID | 安全主体 | DA = Domain Admins,SY = System 等 |

3.3 权限代码详解

SDDL 中的权限使用两字母缩写表示,以下是常见的权限代码:

| 代码 | 全称 | 含义 | | — | — | — | | RP | Read Property | 读取属性 | | WP | Write Property | 写入属性 | | CR | Control Access / Extended Right | 控制访问权 / 扩展权限 | | CC | Create Child | 创建子对象 | | DC | Delete Child | 删除子对象 | | LC | List Children | 列出子对象 | | LO | List Object | 列出对象 | | RC | Read Control | 读取安全描述符(DACL) | | WO | Write Owner | 修改所有者 | | WD | Write DACL | 修改 DACL | | SD | Standard Delete | 标准删除 | | DT | Delete Tree | 删除子树 | | SW | Self Write | 自写(如将自己添加到组中) | | GA | Generic All | 完全控制 | | GR | Generic Read | 通用读取 | | GW | Generic Write | 通用写入 | | GX | Generic Execute | 通用执行 |

3.4 安全主体代码

SDDL 使用简短的代码来表示常见的安全主体,避免使用冗长的 SID 字符串:

| 代码 | 安全主体 | 说明 | | — | — | — | | DA | Domain Admins | 域管理员组 | | SY | System | 本地系统账户 | | AO | Account Operators | 账户操作员组 | | PS | Personal Self(Self) | 对象自身(用户可以修改自己的某些属性) | | RS | RAS and IAS Servers | RAS 和 IAS 服务器组 | | AU | Authenticated Users | 已认证用户 | | WD | Everyone | 所有人 | | CA | Certificate Publishers | 证书发布者 | | BA | Built-in Administrators | 内置管理员组 | | EA | Enterprise Admins | 企业管理员组 | | SA | Schema Admins | 架构管理员组 | | CO | Creator Owner | 创建者/所有者 |

此外,对于没有预定义代码的安全主体,SDDL 直接使用完整的 SID 字符串表示:

| SID | 安全主体 | | — | — | | S-1-5-32-560 | Windows Authorization Access Group(Windows 授权访问组) | | S-1-5-32-561 | Terminal Server License Servers(终端服务器许可证服务器) |


四、实战解析 SDDL 字符串

4.1 逐条解析示例

让我们以 user 类的默认安全描述符为例,逐条解析其中的 ACE:

第一条 ACE:

(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)

拆解:

| 字段 | 值 | 含义 | | — | — | — | | ACE_Type | A | Access Allowed(允许访问) | | ACE_Flags | (空) | 无继承标志 | | Rights | RPWPCRCCDCLCLORCWOWDSDDTSW | 多项权限的组合 | | Object_GUID | (空) | 适用于所有属性 | | Inherit_Object_GUID | (空) | 无继承限制 | | Account_SID | DA | Domain Admins(域管理员) |

权限代码展开:

| 代码 | 权限 | | — | — | | RP | 读取属性 | | WP | 写入属性 | | CR | 控制访问权 | | CC | 创建子对象 | | DC | 删除子对象 | | LC | 列出子对象 | | LO | 列出对象 | | RC | 读取安全描述符 | | WO | 修改所有者 | | WD | 修改 DACL | | SD | 标准删除 | | DT | 删除子树 | | SW | 自写 |

解读:Domain Admins 对该对象拥有几乎所有权限,相当于完全控制

第二条 ACE:

(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)

与第一条结构完全相同,只是安全主体变为 SY(System)。这意味着本地系统账户也拥有完全控制权限。

第三条 ACE:

(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;AO)

安全主体为 AO(Account Operators),同样拥有完全控制权限。这就是为什么 Account Operators 组默认可以管理域中的用户和组对象。

第四条 ACE:

(A;;RPLCLORC;;;PS)

| 字段 | 值 | 含义 | | — | — | — | | ACE_Type | A | 允许访问 | | Rights | RPLCLORC | RP(读取属性)+ LC(列出子对象)+ LO(列出对象)+ RC(读取安全描述符) | | Account_SID | PS | Personal Self(对象自身) |

解读:用户对自己的对象拥有基本的读取权限——可以读取自己的属性、列出子对象、列出对象以及读取安全描述符。这是一组只读权限,确保用户至少能够查看自己的基本信息。

第五条 ACE:

(OA;;CR;ab721a53-1e2f-11d0-9819-00aa0040529b;;PS)

| 字段 | 值 | 含义 | | — | — | — | | ACE_Type | OA | Object-specific Access Allowed(对象特定的允许访问) | | ACE_Flags | (空) | 无继承标志 | | Rights | CR | Control Access / Extended Right(扩展权限) | | Object_GUID | ab721a53-1e2f-11d0-9819-00aa0040529b | 对应 Change Password(更改密码)扩展权限 | | Inherit_Object_GUID | (空) | 无继承限制 | | Account_SID | PS | Personal Self(对象自身) |

解读:用户拥有更改自己密码的扩展权限。注意这里使用了 OA 类型而非普通的 A,因为这是一个对象特定的 ACE——它通过 Object_GUID 精确指定了权限适用于哪个扩展权限(Change Password)。

知识点OA 类型的 ACE 是 Active Directory 特有的,它允许将权限精确绑定到特定的属性、属性集或扩展权限。Object_GUID 字段引用的是 Schema 中定义的 rightsGuid 或 schemaIDGUID

4.2 常见扩展权限 GUID 对照表

在解析 SDDL 时,经常会遇到 Object_GUID 字段中的 GUID 值。以下是一些常见的扩展权限及其 GUID:

| GUID | 扩展权限名称 | 说明 | | — | — | — | | ab721a53-1e2f-11d0-9819-00aa0040529b | Change Password | 更改密码 | | 00299570-246d-11d0-a768-00aa006e0529 | Reset Password | 重置密码 | | ab721a54-1e2f-11d0-9819-00aa0040529b | Send As | 代理发送 | | ab721a56-1e2f-11d0-9819-00aa0040529b | Receive As | 代理接收 | | 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 | DS-Replication-Get-Changes | 目录复制获取变更 | | 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2 | DS-Replication-Get-Changes-All | 目录复制获取所有变更 | | 89e95b76-444d-4c62-991a-0facbeda640c | DS-Replication-Get-Changes-In-Filtered-Set | 目录复制获取过滤集变更 |

安全提示DS-Replication-Get-Changes 和 DS-Replication-Get-Changes-All 这两个扩展权限是执行 DCSync 攻击的关键前提。如果攻击者能够获得这两个权限,就可以模拟域控制器进行目录复制,从而提取域内所有用户的密码哈希。

4.3 完整 SDDL 解析流程

为了帮助读者建立系统化的 SDDL 解析能力,我们总结一个标准的解析流程:

步骤一:识别整体结构

O:<所有者>G:<主组>D:<DACL标志>(ACE1)(ACE2)...S:<SACL标志>(ACE1)...

首先确定字符串中包含哪些部分(O、G、D、S),然后分别处理。

步骤二:分离 ACE 条目

在 D: 或 S: 部分中,每对括号 () 包含一个独立的 ACE。将它们逐一提取出来。

步骤三:解析每个 ACE 的六个字段

按照分号 ; 分隔,依次解析:

  1. ACE 类型(A/D/OA/OD 等)
  2. ACE 标志(继承选项)
  3. 权限代码
  4. 对象 GUID
  5. 继承对象 GUID
  6. 安全主体

步骤四:翻译权限代码和安全主体

参照前文的对照表,将两字母代码翻译为可读的权限名称和安全主体名称。

步骤五:查找 GUID 对应的含义

对于 OA 或 OD 类型的 ACE,需要查找 Object_GUID 对应的属性、属性集或扩展权限名称。可以通过以下方式查询:

# 查找扩展权限
Get-ADObject-SearchBase&nbsp;"CN=Extended-Rights,CN=Configuration,DC=yourdomain,DC=com"&nbsp;`
-Filter{rightsGuid&nbsp;-eq"ab721a53-1e2f-11d0-9819-00aa0040529b"}&nbsp;`
-Properties displayName,rightsGuid

五、不同对象类的默认权限对比

不同类型的 AD 对象在 Schema 中定义了不同的默认权限。了解这些差异有助于理解 AD 的安全设计理念。

5.1 User 类的默认权限特点

  • Domain Admins、System、Account Operators

    拥有完全控制权限

  • 用户自身(PS)

    拥有基本读取权限和更改密码权限

  • Authenticated Users

    通常拥有读取大部分属性的权限

  • 某些敏感属性(如 userPassword)有额外的保护

5.2 Computer 类的默认权限特点

Computer 类的默认权限与 User 类相似(因为 computer 类继承自 user 类),但有一些针对计算机对象的特殊权限:

  • 计算机对象自身通常拥有写入某些 DNS 相关属性的权限
  • Domain Admins 和 System 拥有完全控制

5.3 Group 类的默认权限特点

  • Domain Admins 和 System

    拥有完全控制

  • Account Operators

    拥有管理权限

  • Authenticated Users

    拥有读取权限

  • 组成员的修改权限(member 属性的写入权限)是一个关键的安全控制点

5.4 OrganizationalUnit 类的默认权限特点

OU 的默认权限相对简单,但由于 OU 是权限委派的基本单位,其 ACL 通常会在创建后被管理员大量修改。


六、Schema 默认权限的安全影响

6.1 默认权限与实际权限的关系

需要特别强调的是,Schema 中定义的默认权限只是对象创建时的初始权限。对象创建后,其实际权限可能因以下因素而发生变化:

  1. 继承

    :父容器(如 OU)上的 ACL 会通过继承传递给子对象

  2. 显式修改

    :管理员可能直接修改对象的 ACL

  3. SDProp 覆盖

    :对于受保护安全组的成员,SDProp 会周期性地用 AdminSDHolder 的 ACL 覆盖对象的权限

  4. 组策略

    :某些组策略设置可能影响权限

因此,要了解一个对象的实际有效权限,不能仅看 Schema 默认权限,还需要综合考虑所有权限来源。

6.2 修改 Schema 默认权限的风险

Schema 的默认安全描述符是可以修改的(需要 Schema Admins 权限),但这样做需要极其谨慎:

  • 影响范围广

    :修改后,所有新创建的该类对象都会使用新的默认权限

  • 不影响已有对象

    :修改 Schema 默认权限不会自动更新已存在对象的权限

  • 难以回滚

    :Schema 修改通常是不可逆的

  • 可能破坏功能

    :不当的权限修改可能导致应用程序或管理工具无法正常工作

攻防视角:如果攻击者获得了 Schema Admins 权限,他们可以修改 Schema 中的默认安全描述符,为未来创建的所有对象植入后门权限。这是一种极其隐蔽的持久化手段,因为:

  • 修改发生在 Schema 层面,不容易被常规审计发现
  • 只影响新创建的对象,不会触发现有对象的权限变更告警
  • 即使管理员清理了已知的恶意权限,新创建的对象仍会携带后门权限

6.3 安全审计建议

针对 Schema 默认权限,建议采取以下安全措施:

1. 定期审计 Schema 默认安全描述符

# 导出所有类的默认安全描述符
Get-ADObject-SearchBase&nbsp;"CN=Schema,CN=Configuration,DC=yourdomain,DC=com"&nbsp;`
-Filter{objectClass&nbsp;-eq"classSchema"}&nbsp;`
-Properties name,defaultSecurityDescriptor&nbsp;|
Select-Object&nbsp;name,defaultSecurityDescriptor&nbsp;|
Export-Csv-Path&nbsp;"SchemaDefaultSecurity.csv"-NoTypeInformation

将导出结果与已知的基线进行对比,检测是否有未授权的修改。

2. 监控 Schema 变更

启用对 Schema 分区的审计,监控 defaultSecurityDescriptor 属性的修改事件。关键的事件 ID 包括:

| 事件 ID | 描述 | | — | — | | 5136 | 目录服务对象被修改 | | 5137 | 目录服务对象被创建 |

3. 保护 Schema Admins 组

  • 保持 Schema Admins 组为空(仅在需要修改 Schema 时临时添加成员)
  • 对 Schema Admins 组的成员变更启用告警
  • 确保 Schema Admins 组受 SDProp 保护(默认情况下已受保护)

4. 使用 SDDL 解析工具

手动解析 SDDL 字符串容易出错,建议使用工具辅助:

# 使用 PowerShell 将 SDDL 转换为可读格式
$sddl&nbsp;=&nbsp;"D:(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;RPLCLORC;;;PS)"
$sd&nbsp;=&nbsp;New-Object&nbsp;System.Security.AccessControl.RawSecurityDescriptor($sddl)
$sd.DiscretionaryAcl&nbsp;|ForEach-Object{
[PSCustomObject]@{
&nbsp; &nbsp; &nbsp; &nbsp; AceType &nbsp; &nbsp; &nbsp; =&nbsp;$_.AceType
&nbsp; &nbsp; &nbsp; &nbsp; SecurityIdentifier =&nbsp;$_.SecurityIdentifier.Translate([System.Security.Principal.NTAccount])
&nbsp; &nbsp; &nbsp; &nbsp; AccessMask &nbsp; &nbsp;=&nbsp;$_.AccessMask
&nbsp; &nbsp; &nbsp; &nbsp; IsInherited &nbsp; =&nbsp;$_.IsInherited
}
}

七、SDDL 在其他场景中的应用

SDDL 不仅用于 Active Directory 的 Schema 默认权限,它在 Windows 安全体系中有广泛的应用:

| 应用场景 | 说明 | | — | — | | 文件系统 ACL | NTFS 文件和文件夹的安全描述符可以用 SDDL 表示 | | 注册表权限 | 注册表键的安全描述符使用 SDDL 格式 | | 服务安全描述符 | Windows 服务的访问控制使用 SDDL 定义 | | WMI 命名空间安全 | WMI 命名空间的权限使用 SDDL 配置 | | 组策略安全设置 | 某些组策略设置中使用 SDDL 定义权限 | | Windows 防火墙规则 | 防火墙规则的安全描述符使用 SDDL |

掌握 SDDL 语法,不仅有助于理解 AD 安全,还能在 Windows 安全的多个领域发挥作用。


八、总结

本文深入解析了 Active Directory Schema 中的默认安全描述符机制以及 SDDL 安全描述符定义语言。关键要点总结如下:

  1. Schema 默认权限是 AD 对象权限的基础层,它决定了对象创建时的初始安全状态,与 OU 继承权限和 SDProp 强制权限共同构成完整的权限体系。
  2. SDDL 是一种结构化的权限描述语言,虽然看起来晦涩难懂,但遵循固定的语法规则。掌握其 ACE 格式(类型、标志、权限、GUID、安全主体)是解读权限的关键。
  3. 不同对象类有不同的默认权限,这些差异反映了 AD 的安全设计理念——例如,Domain Admins 和 System 通常拥有完全控制,而普通用户只有有限的自管理权。

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:寰宇密阁 寰宇秘阁 寰宇秘阁《Active Directory安全攻防(五)》

未签名的X.509证书 网络安全文章

未签名的X.509证书

文章总结: RFC9925定义了未签名X.509证书的配置文件,使用占位符签名算法id-alg-unsigned替代自签名,以解决后量子签名过大和密钥重用问题。
评论:0   参与:  0