浅析gMSA

最近bloodhound更新了3.0版本,其中有一个重要攻击路径,对gMSA(组托管服务账户)进行路线分析。默认情况下,任何经过域身份验证的用户都具有相关性,通过工具可以获取gMSA的hash进行横向移动,找到之前看不见的DA(到达domain admin)路径。

0x01 静态密码

在一般的环境中,管理人员通常会使用一些计划任务、服务等去完成服务器或功能的正常运转。但是如果任务需要跨机器工作,那就需要有一个用户账户。

密码使用场景

比如在使用计划任务时,需要选择账户

或者在服务中也可以以某个账户启动

静态密码产生的问题

在域环境中,一般会使用密码策略对用户进行定期更新,但是会出现一个问题,如果计算机过多、管理人员混乱、配置混乱的时候就会导致管理用户的时候无法做到及时对密码进行更新。一个简单的例子:在账户、服务过多的情况下,管理人员通常不会对它的密码进行更新,因为管理员不清楚该账户、服务是否重要,对其用户更新的时候会不会对其他服务产生连锁反应,导致功能不可用。

因此,现实情况下当计算机管理混乱的时候,会有一些废弃的账户、计算机、服务。这极大得帮助了我们进行红队行动。废弃的用户、计算机往往能够产生许多不可知(管理员不知道)的攻击路径。

0x02 gMSA简介

通过了解以上静态密码的弱点,微软提出了gMSA(组管理服务账户)解决多个用户密码的问题。在windows server 2012之后,通过gMSA可以使服务或服务管理员无需管理服务实例之间的密码同步。gMSA的密码由域控制器管理,每30天自动更改一次(默认情况下),并且由128个字符组成(无法猜测)。这完美解决了冗余账户的问题,似乎一切都很棒,但是却引出了其他问题,大家请往下看。

0x03 使用gMSA

要使用gMSA,必须要满足Windows官方要求:

Operating system requirements

Element Requirement Operating system
Client Application host RFC compliant Kerberos client At least Windows XP
User account’s domain DCs RFC compliant KDC At least Windows Server 2003
Shared service member hosts Windows Server 2012
Member host’s domain DCs RFC compliant KDC At least Windows Server 2003
gMSA account’s domain DCs Windows Server 2012 DCs available for host to retrieve the password Domain with Windows Server 2012 which can have some systems earlier than Windows Server 2012
Backend service host RFC compliant Kerberos application server At least Windows Server 2003
Backend service account’s domain DCs RFC compliant KDC At least Windows Server 2003
Windows PowerShell for Active Directory Windows PowerShell for Active Directory installed locally on a computer supporting a 64-bit architecture or on your remote management computer (for example, using the Remote Server Administration Toolkit) Windows Server 2012

Active Directory Domain Service requirements

  • The Active Directory schema in the gMSA domain’s forest needs to be updated to Windows Server 2012 to create a gMSA.

    You can update the schema by installing a domain controller that runs Windows Server 2012 or by running the version of adprep.exe from a computer running Windows Server 2012 . The object-version attribute value for the object CN=Schema,CN=Configuration,DC=Contoso,DC=Com must be 52.

  • New gMSA account provisioned

  • If you are managing the service host permission to use gMSA by group, then new or existing security group

  • If managing service access control by group, then new or existing security group

  • If the first master root key for Active Directory is not deployed in the domain or has not been created, then create it. The result of its creation can be verified in the KdsSvc Operational log, Event ID 4004.

当一切准备就绪的时候,gMSA就可以工作:

  1. 创建gMSA时,DC会分配一个复杂的密码。
  2. 如果在授权使用该gMSA的服务器上使用了gMSA,则该服务器将使用SecureChannel向DC请求当前密码并保存。
  3. DC监视所有gMSA的密码使用期限。如果密码从gMSA过期,则DC将对其进行更改。
  4. 如果使用的gMSA的TGT(票证授予票证)在服务器上失去其有效性,则服务器将续签其注册。他通过SecureChannel与DC联系,并学习新密码。

一台或多台AD计算机可以使用gMSA。一台AD计算机也可以使用一个或多个gMSA。

新建gMSA

需要kds-rootkey,在powershell中执行Get-KdsRootKey可以查询,如果没有返回空。

为Active Directory中的Microsoft组KdsSvc生成新的根密钥

比如:

1
Add-KdsRootKey

此命令为Active Directory中的Microsoft组KdsSvc生成新的根密钥。

1
Add-KdsRootKey -EffectiveImmediately

此命令立即生成一个新的根密钥,并将其添加到Microsoft Group KdsSvc。默认有10个小时的限制。

1
Add-KdsRootKey -EffectiveTime 03/06/2013

如果未指定时间,则默认日期设置为当前日期之后的10天

该命令为Microsoft Group KdsSvc生成一个新的根密钥,该根密钥将于2013年3月6日生效。使用mm / dd / yyyy格式。

1
Add-KdsRootKey -LocalTestOnly

此命令仅在本地主机上生成一个新的根密钥。

这里需要注意的是,为了能够马上使用你的kds-rootkey,需要加上参数adddays或者addhours,使其马上生效。

接下来可以创建gMSA,创建gMSA必须使用powershell:

1
2
New-ADServiceAccount -Name New-gMSA -DNSHostName AD.rootrain.local -PrincipalsAllowedToRetrieveManagedPassword AD$,DESKTOP-74D7I8L$
Install-ADServiceAccount -Identity New-gMSA

检查是否成功

1
Test-ADServiceAccount New-gMSA

打开dsa.msc我们可以看到新建的gMSA。

也可以更改密码更改的时间(默认情况下为30天):

1
Set-ADServiceAccount New-gMSA-ManagedPasswordIntervalInDays 60

使用gMSA配置服务

创建完gMSA后,我们可以打开service.msc对服务的账户进行配置。(这台是域用户主机,不是域控,实现了跨机器管理)

密码由KDC管理,留空就行,它会自动下发。服务需要重新启动。

使用gMSA配置计划任务

gMSA令人诟病的一点就是只能通过powershell进行配置计划任务。直接创建计划任务无法找到该用户。

1
2
3
4
$action = New-ScheduledTaskAction powershell.exe -Argument "-file c:\Scripts\Script.ps1" -WorkingDirectory "C:\WINDOWS\system32\WindowsPowerShell\v1.0"
$trigger = New-ScheduledTaskTrigger -At 00:21 -Daily
$principal = New-ScheduledTaskPrincipal -UserID rootrain.local\New-gMSA$ -LogonType Password -RunLevel highest
Register-ScheduledTask myAdminTask –Action $action –Trigger $trigger –Principal $principal

使用gMSA应用程序池标识

0x04 gMSA攻击面

gMSA也是一个用户,在C:\Users\下可以看到会有gMSA用户的文件夹。

由于gMSA是特殊用户,无法通过直接查看到此用户或者所在组。我们可以通过ldap查询MSA可以看到。

通过查看bloodhound 3.0的sharphound源码也能看到获取gmsa的方式。

或者在cobaltstrike中,查看进程也能查询到该用户。明显标识就是末尾会有一个$。

当我们识别到该用户的时候,我们可以直接滥用gMSA的hash(如果未打补丁)进行pth。

在mimikatz中我们也能够找到对应hash

使用bloodhound 3.0寻找攻击路径,由于我内网环境配的少或者其他原因,没有寻找到路径,但是查重gMSA用户也可以看到AD域与域用户之间的联系。

0x05 总结

  • gMSA是组托管服务账户
  • 静态密码容易遗忘或被攻击,gMSA可以解决这一缺陷(不可猜测)
  • 管理人员可通过gMSA批量管理机器,如服务、计划任务、数据库等
  • 测试Add-KdsRootKey -EffectiveTime 需要提前10天生效,方便测试
  • gMSA与一般用户一样可以被滥用(未打补丁),覆盖面更大,可到域控
  • Bloodhound 3.0 gMSA原理是通过ldap查询gMSA用户,从而列举出可用攻击路径

0x06 参考链接

https://posts.specterops.io/introducing-bloodhound-3-0-c00e77ff0aa6

https://www.ws-its.de/group-managed-service-accounts-und-mein-gmsa-admin/

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd378925(v=ws.10)?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/windows-server/security/group-managed-service-accounts/getting-started-with-group-managed-service-accounts

https://docs.microsoft.com/en-us/powershell/module/kds/add-kdsrootkey?view=win10-ps

https://blog.kloud.com.au/2016/10/21/avoiding-windows-service-accounts-with-static-passwords-using-gmsas/

http://woshub.com/group-managed-service-accounts-in-windows-server-2012/

https://medium.com/tech-jobs-academy/creating-and-associating-a-group-managed-service-account-19843050a6a6

https://pisquare.osisoft.com/groups/security/blog/2018/04/11/introduction-to-group-managed-service-accounts

http://www.rebeladmin.com/2018/02/step-step-guide-work-group-managed-service-accounts-gmsa-powershell-guide/

https://www.tutorialspoint.com/windows_server_2012/windows_server_2012_group_managed_service_accounts.htm

https://github.com/BloodHoundAD/SharpHound3

Author: rootrain
Link: https://rootrain.me/2020/02/29/浅析gMSA/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.