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

本文详细解析了Active Directory组托管服务账户(GMSA)的安全漏洞,包括如何通过Mimikatz获取密码哈希、利用权限提升攻击域管理员权限,以及相应的防御措施。文章涵盖了GMSA的工作原理、攻击方法和实际案例。

攻击Active Directory组托管服务账户(GMSA)

在2020年5月的Trimarc网络研讨会"保护Active Directory:解决常见问题"中,我介绍了一些关于AD组托管服务账户(GMSA)安全性的信息。本文扩展了我在研讨会中讨论的攻击和防御GMSA的内容。

组托管服务账户(GMSA)概述

组托管服务账户(GMSA)从Windows 2012开始提供了一种更好的服务账户管理方式。密码由AD管理并自动更改,这意味着必须明确委派安全主体才能访问明文密码。

GMSA关键点:

  • GMSA密码由AD管理
  • 托管GMSA服务账户的计算机会从AD请求当前密码来启动服务
  • 配置GMSA以允许计算机账户访问密码
  • 如果攻击者入侵使用GMSA的计算机,GMSA就会被入侵
  • 如果攻击者入侵有权请求GMSA密码的账户,GMSA就会被入侵

GMSA属性

组托管服务账户具有对象类"msDS-GroupManagedServiceAccount"和特定于GMSA的属性:

  • msDS-GroupMSAMembership (PrincipalsAllowedToRetrieveManagedPassword) - 存储可以访问GMSA密码的安全主体
  • msds-ManagedPassword - 包含组托管服务账户密码信息的BLOB
  • msDS-ManagedPasswordId - 包含组MSA当前托管密码数据的密钥标识符
  • msDS-ManagedPasswordInterval - 用于检索组MSA自动更改托管密码前的天数

攻击方法

1. 访问运行GMSA服务的服务器

一旦获得运行GMSA服务的服务器访问权限,我们可以:

  • 识别注册在GMSA上的服务主体名称(SPN)
  • 如果能够入侵对服务器OU有权限的账户,可以获得LCN服务器的管理员权限

使用Mimikatz的sekurlsa::logonpasswords转储LSASS,但发现GMSA密码显示异常。需要使用Sekurlsa::ekeys命令获取正确的NT密码哈希,然后进行哈希传递(PTH)攻击。

2. 入侵具有GMSA密码访问权限的账户

通过枚举msDS-GroupMSAMembership属性中的组成员,可以发现有权获取GMSA明文密码的所有账户。入侵这些账户中的任何一个都会导致GMSA账户被入侵。

使用PowerShell cmdlet Get-ADServiceAccount获取GMSA的明文密码数据,然后使用DSInternals模块的ConvertTo-NTHash将明文密码BLOB转换为NT哈希。

3. 通过计算机账户获取密码

如果入侵的是计算机账户,需要在计算机上以SYSTEM身份运行命令。使用PSEXEC生成在本地SYSTEM账户上下文下运行的命令shell,然后执行相同的操作。

验证和确认

使用DSInternals命令Get-ADReplAccount获取AD密码哈希,确认从GMSA提取的密码哈希与从AD收集的哈希匹配。

缓解措施

  • 确定实际需要的权限,确保只有必需的有限权限应用于GMSA
  • 除非GMSA使用的服务器仅限于第0层(域控制器),否则不要添加到AD特权组
  • 限制GMSA访问和位置(特别是在有特权的情况下)

致谢

特别感谢DSInternals的Michael Grafnetter提供的博客文章信息,以及Benjamin Delpy帮助我测试Mimikatz最新版本对抗包含GMSA凭据的LSASS数据。

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