分析 Active Directory ACL 滥用
概述
Active Directory 访问控制列表 (ACL) 通过包含访问控制条目 (ACE) 的自由访问控制列表 (DACL) 来定义对 AD 对象的权限。配置错误的 ACE 可能会向非特权用户授予危险的权限,例如 GenericAll(完全控制)、WriteDACL(修改权限)、WriteOwner(获取所有权)和 GenericWrite(修改属性),这些权限作用于敏感对象(如域管理员组、域控制器或 GPO)。
本技能使用 ldap3 Python 库连接到域控制器,查询对象及其 nTSecurityDescriptor 属性,将二进制安全描述符解析为 SDDL(安全描述符定义语言)格式,并识别出向非管理主体授予危险权限的 ACE。这些配置错误是 BloodHound 等工具发现的基于 ACL 的攻击路径的基础。
使用时机
- 调查涉及Active Directory ACL滥用的安全事件时
- 为此领域构建检测规则或威胁猎取查询时
- 当SOC分析师需要此分析类型的结构化流程时
- 验证相关攻击技术的安全监控覆盖范围时
前提条件
- Python 3.9 或更高版本,并安装 ldap3 库 (
pip install ldap3) - 具有对 AD 对象读取权限的域用户凭据
- 能够通过网络连接到域控制器的端口 389 (LDAP) 或 636 (LDAPS)
- 了解 Active Directory 安全模型和 SDDL 格式
步骤
-
连接到域控制器:使用 ldap3 通过 NTLM 或简单身份验证建立 LDAP 连接。在生产环境中,使用 LDAPS(端口 636)进行加密连接。
-
查询目标对象:在目标 OU 或整个域中搜索对象,包括用户、组、计算机和 OU。请求
nTSecurityDescriptor、distinguishedName、objectClass和sAMAccountName属性。 -
解析安全描述符:将二进制 nTSecurityDescriptor 转换为其 SDDL 字符串表示形式。解析 DACL 中的每个 ACE,提取受托者 SID、访问掩码和 ACE 类型(允许/拒绝)。
-
将 SID 解析为受托者:使用针对域的 LDAP 查询,将安全标识符 (SID) 映射为人类可读的帐户名称。识别内置组的熟知 SID。
-
检查危险权限:将每个 ACE 的访问掩码与危险权限位掩码进行比较:GenericAll (0x10000000)、WriteDACL (0x00040000)、WriteOwner (0x00080000)、GenericWrite (0x40000000),以及针对特定扩展权限的 WriteProperty。
-
过滤非管理员受托者:排除预期的管理受托者(域管理员、企业管理员、SYSTEM、管理员),标记非特权用户或组持有危险权限的 ACE。
-
映射攻击路径:针对每个发现,记录潜在的攻击链(例如,对用户的 GenericAll 允许重置密码,对组的 WriteDACL 允许将自身添加到组中)。
-
生成修复报告:输出一个 JSON 报告,包含所有危险的 ACE、受影响的 AD 对象、非管理员受托者以及推荐的修复步骤。
预期输出
{
"domain": "corp.example.com",
"objects_scanned": 1247,
"dangerous_aces_found": 8,
"findings": [
{
"severity": "critical",
"target_object": "CN=Domain Admins,CN=Users,DC=corp,DC=example,DC=com",
"target_type": "group",
"trustee": "CORP\\helpdesk-team",
"permission": "GenericAll",
"access_mask": "0x10000000",
"ace_type": "ACCESS_ALLOWED",
"attack_path": "对 Domain Admins 组的 GenericAll 权限允许添加任意成员",
"remediation": "移除 helpdesk-team 对 Domain Admins 组的 GenericAll ACE"
}
]
}