深入解析组托管服务账户(GMSA):AD安全核心与实践

本文详细探讨了Active Directory中的组托管服务账户(GMSA)技术,包括其工作原理、关键属性、安全配置以及潜在的攻击风险。通过PowerShell脚本演示如何识别和分析GMSA,并强调了不当配置可能导致的域管理员权限泄露等重大安全问题。

组托管服务账户(GMSAs)

在Windows Server 2012时代引入的组托管服务账户(GMSAs),为传统服务账户提供了一种更优的管理方式。传统服务账户的密码很少更改,而GMSA则由Active Directory管理并自动轮换密码。这意味着,必须明确委派安全主体才能访问GMSA的明文密码。与LAPS等其他需要委派控制的领域类似,确定谁应被委派访问权限需要仔细考量。

组托管服务账户(GMSAs)的关键要点

  • GMSA的密码由AD管理。
  • 托管GMSA服务账户的计算机会从Active Directory请求当前密码以启动相关服务。
  • 需将GMSA配置为允许计算机账户访问其密码。
  • 如果攻击者攻陷了任何使用该GMSA托管服务的计算机,则该GMSA即被攻陷。
  • 如果攻击者攻陷了有权请求GMSA密码的账户,则该GMSA即被攻陷。

组托管服务账户的对象类别为“msDS-GroupManagedServiceAccount”,并具有与GMSA相关的特定属性。这些属性包括:

  • msDS-GroupMSAMembership (PrincipalsAllowedToRetrieveManagedPassword) – 存储可以访问GMSA密码的安全主体。
  • msds-ManagedPassword – 此属性包含一个BLOB,其中存储了组托管服务账户的密码信息。
  • msDS-ManagedPasswordId – 此构造属性包含组MSA当前托管密码数据的密钥标识符。
  • msDS-ManagedPasswordInterval – 此属性用于获取组MSA自动更改托管密码前的天数。

实验示例

为了识别Active Directory域中的GMSA,我们可以使用Active Directory PowerShell cmdlet Get-ADServiceAccount

1
get-adserviceaccount -filter * -prop * | Select Name,DNSHostName,MemberOf,Created,LastLogonDate,PasswordLastSet,msDS-ManagedPasswordInterval,PrincipalsallowedtoDelegateToAccount,PrincipalsAllowedtoRetrieveManagedPassword,msDS-ManagedPassword,ServicePrincipalName | Sort Name

在我的实验环境(模拟真实世界AD环境)中,我们注意到域管理员组中存在一个GMSA。我们来深入了解一下。

该Citrix GMSA被配置为允许“Citrix04”组获取GMSA的密码(属性PrincipalsAllowedToRetrieveManagedPassword)。现在,让我们查看该组的成员。

该组中有一个用户账户,这意味着如果该用户账户(AdminJackson)被攻陷,将导致Citrix GMSA的密码泄露,进而可能攻陷Active Directory,因为该GMSA是域管理员组的成员。为了更便捷地获取此类信息,我编写了一个名为Get-GMSADetail的PowerShell脚本,该脚本使用Active Directory PowerShell模块捕获这些信息。它添加了一个名为PasswordAccessPrincipalString的新属性,列出了有权拉取密码的主体。

结论

作为本次实验的一部分,我们了解到,如果GMSA是特权组(如域管理员)的成员,那么攻陷一个有权拉取GMSA明文密码(属性PrincipalsAllowedToRetrieveManagedPassword)的账户,就可以利用GMSA的权限(例如攻陷Active Directory)。此外,如果我们能攻陷一个有权拉取GMSA密码的计算机账户,那么我们就可以从该计算机转储密码。

有关攻击GMSAs的更多信息,请阅读ADSecurity文章《攻击Active Directory组托管服务账户(GMSAs)》。

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