攻击Active Directory组托管服务账户(GMSA)的技术解析

本文深入剖析了Active Directory组托管服务账户(GMSA)的安全机制,详细演示了如何通过Mimikatz、DSInternals等工具获取GMSA凭证,并提供了针对性的防御建议,包括权限最小化和访问控制等最佳实践。

攻击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:包含密码信息的BLOB
  • msDS-ManagedPasswordId:当前密码数据的密钥标识符
  • msDS-ManagedPasswordInterval:密码自动变更间隔天数

攻击技术详解

方法一:入侵托管服务器

  1. 通过SPN定位托管服务器(如LCNSQL01)
  2. 获取服务器管理员权限后:
    • 使用Mimikatz执行sekurlsa::logonpasswords获取服务账户凭证
    • 发现GMSA密码显示异常(如"SA{GUID}“格式)
    • 改用sekurlsa::ekeys获取正确的Kerberos票据和NT哈希
    • 实施哈希传递(PTH)攻击

方法二:入侵有权账户

  1. 枚举msDS-GroupMSAMembership属性中的授权组(如"SVC-LAB-GMSA1 Group”)
  2. 通过组成员关系分析发现:
    • 11个用户账户(其中9个为普通用户)具有密码访问权
  3. 入侵任一授权账户后:
    • 使用Get-ADServiceAccount获取明文密码BLOB
    • 通过DSInternals的ConvertTo-NTHash转换为NT哈希
  4. 若入侵计算机账户:
    • 需以SYSTEM权限执行上述操作
    • 使用PSEXEC获取SYSTEM上下文

验证与防御

验证技术

  • 使用DSInternals的Get-ADReplAccount确认AD中的密码哈希与获取值一致

防御措施

  1. 实施最小权限原则
  2. 避免将GMSA加入AD特权组(除非用于域控制器)
  3. 严格限制GMSA访问权限和使用范围

特别感谢DSInternals的Michael Grafnetter和Mimikatz开发者Benjamin Delpy的技术支持。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计