攻击Active Directory组托管服务账户(GMSA)
2020年5月,我在Trimarc网络研讨会"保护Active Directory:解决常见问题"中介绍了AD组托管服务账户(GMSA)的安全问题。本文是研讨会内容的扩展版本。
组托管服务账户(GMSA)概述
传统用作服务账户的用户账户很少更改密码。GMSA(自Windows 2012引入)由AD自动管理密码变更。但关键点在于:
- AD管理GMSA密码
- 托管计算机从AD请求当前密码启动服务
- 需明确配置允许访问密码的计算机账户
- 若攻击者控制托管计算机或有权账户,GMSA即告失陷
GMSA关键属性
GMSA具有特定对象类和属性:
msDS-GroupMSAMembership
:存储可访问密码的安全主体msds-ManagedPassword
:包含密码信息的BLOBmsDS-ManagedPasswordId
:当前密码数据的密钥标识符msDS-ManagedPasswordInterval
:密码自动变更间隔天数
攻击技术详解
方法一:入侵托管服务器
- 通过SPN定位托管服务器(如LCNSQL01)
- 获取服务器管理员权限后:
- 使用Mimikatz执行
sekurlsa::logonpasswords
获取服务账户凭证 - 发现GMSA密码显示异常(如"SA{GUID}“格式)
- 改用
sekurlsa::ekeys
获取正确的Kerberos票据和NT哈希 - 实施哈希传递(PTH)攻击
- 使用Mimikatz执行
方法二:入侵有权账户
- 枚举
msDS-GroupMSAMembership
属性中的授权组(如"SVC-LAB-GMSA1 Group”) - 通过组成员关系分析发现:
- 11个用户账户(其中9个为普通用户)具有密码访问权
- 入侵任一授权账户后:
- 使用
Get-ADServiceAccount
获取明文密码BLOB - 通过DSInternals的
ConvertTo-NTHash
转换为NT哈希
- 使用
- 若入侵计算机账户:
- 需以SYSTEM权限执行上述操作
- 使用PSEXEC获取SYSTEM上下文
验证与防御
验证技术:
- 使用DSInternals的
Get-ADReplAccount
确认AD中的密码哈希与获取值一致
防御措施:
- 实施最小权限原则
- 避免将GMSA加入AD特权组(除非用于域控制器)
- 严格限制GMSA访问权限和使用范围
特别感谢DSInternals的Michael Grafnetter和Mimikatz开发者Benjamin Delpy的技术支持。