当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 滥用和保护组托管服务帐户

作者:精品下载站 日期:2024-12-14 06:01:11 浏览:14 分类:玩电脑

滥用和保护组托管服务帐户


组托管服务帐户概述

使用常规用户帐户作为服务帐户的传统做法给用户带来了密码管理的负担。因此,帐户密码通常多年保持不变,这使得它们极易受到暴力攻击和滥用。组托管服务帐户 (gMSA) 提供了一种更安全的方式来运行自动化任务、服务和应用程序。

gMSA 是在 Windows Server 2016 中引入的,可以在 Windows Server 2012 及更高版本上使用。 gMSA 密码完全由 Windows 处理:它们是随机生成并自动轮换的。此外,任何用户都不必知道密码,因为服务帐户本身“安装”在运行时从 Active Directory 查询密码信息的服务器上。因此,与用作服务帐户的用户帐户相比,gMSA 更不容易被滥用和泄露。

组托管服务帐户安全

gMSA 是 Active Directory 中的特定对象类型:msDS-GroupManagedServiceAccount。这些对象具有与其密码及其轮换相关的特殊属性。与 LAPS 类似,您需要确保 gMSA 属性仅锁定到需要访问它们的 Active Directory 对象。

gMSA 属性和权限

gMSA 具有以下属性:

  • msDS-ManagedPassword - 包含 gMSA 密码的 BLOB
  • msDS-ManagedPasswordID - 用于生成当前 gMSA 密码的密钥 ID
  • msDS-ManagedPasswordPreviousID - 用于生成以前的 gMSA 密码的密钥 ID
  • msDS-GroupMSAMembership - 有权查询 gMSA 密码的对象列表
  • msDS-ManagedPasswordInterval - 密码轮换的时间间隔(天)

由于密码信息存储在 msDS-ManagedPassword 属性中,因此您肯定想知道您的环境中的谁能够查询密码。该信息在 msDS-GroupMSAmbership 属性中设置。

然而,由于 Active Directory 权限发挥作用,它比该属性稍微复杂一些。如果出于某种原因,用户或对象被配置为有权通过 msDS-GroupMSAmbership 帐户查询密码,他们仍然需要拥有 gMSA 的 msDS-ManagedPassword 属性的“读取”权限。

这意味着有两种方法可以保护 gMSA 密码:

  • 确保只有必要的对象才有查询密码的权限,并且它们存在于 msDS-GroupMSAmbership 中
  • 确保只有需要访问权限的管理用户和安装 gMSA 的计算机帐户才有权读取该属性。另外,请确保只有管理员才有权修改 gMSA 及其属性,这样任何人都无法将自己添加到 msDS-GroupMSAmbership 属性中。

理想情况下,您可以通过这两种途径锁定 gMSA,以阻止攻击者选择利用上述任一场景。下面我们将展示 gMSA 上的权限或配置管理不善如何导致帐户受损以及权限升级或横向移动。

滥用 gMSA 密码

滥用 gMSA 从概念上来说相对简单。首先,使用 Mimikatz 等工具获取密码,或者由于 Active Directory 中的配置不安全而直接查询密码。由于 gMSA 是服务帐户,因此它们通常具有相对特权,因此您通常能够横向移动或升级。

让我们来看一个示例场景。

1. 首先,我们通过网络钓鱼等技术入侵普通 Windows 用户帐户“notadmin”。该帐户在 Active Directory 中拥有最低权限,但在我们登陆的计算机上是本地管理员。

2.接下来,我们将尝试找出是否存在gMSA。如果您有权访问 Windows PowerShell cmdlet,那么实现这一点非常简单,运行一个简单的脚本即可获取 Active Directory 中的所有托管服务帐户:

Get-ADServiceAccount -Filter *

[玩转系统] 滥用和保护组托管服务帐户

3. 通过对脚本进行一些轻微修改,我们可以识别谁有权查询 gMSA 密码:

Get-ADServiceAccount -Filter * -Properties PrincipalsAllowedToRetrieveManagedPassword

我们可以看到,只有 Kevin Joyce 帐户才能查询这些服务帐户的密码:

[玩转系统] 滥用和保护组托管服务帐户

4. 我们可以通过检查这些服务帐户是否是任何特权组的成员来缩小我们想要的目标范围,然后我们可以更深入地了解在其中一个对象上设置的权限:

Get-ADServiceAccount -Filter * -Properties memberof

查看此处的结果,我们可以看到 gMSA 服务帐户是域管理员的成员,因此这将是我们将尝试利用的帐户。

[玩转系统] 滥用和保护组托管服务帐户

5. 通过修改 Microsoft LAPS 上的帖子中提供的脚本,我们能够获取对托管服务帐户拥有权限的所有对象的列表,其中包括特定 gMSA 属性的完全控制、写入所有属性或写入属性。输出如下,脚本链接在底部。

[玩转系统] 滥用和保护组托管服务帐户

6. 如您所见,notadmin 帐户对 gMSA 帐户具有完全控制权。这使我们能够修改 msDS-GroupMSAmbership 属性,这将使我们能够检索托管服务帐户的密码:

Set-ADServiceAccount -Identity gmsa -PrincipalsAllowedToRetrieveManagedPassword notadmin

[玩转系统] 滥用和保护组托管服务帐户

7. 现在我们实际上可以查询密码了,让我们看看我们能用它做什么:

Get-ADServiceAccount -Identity gmsa -properties msds-ManagedPassword

[玩转系统] 滥用和保护组托管服务帐户

$pwd = Get-ADServiceAccount -identity gMSA -Properties msds-ManagedPassword

8. 属性中存储的值是一个 BLOB,其中包含密码数据,而不是密码本身,因此我们必须使用 DSInternals 等工具来解码密码:

$pw = ConvertFrom-ADManagedPasswordBlob $pwd.’msds-managedpassword’
ConvertTo-NTHash $pw.securecurrentpassword

这为我们提供了 SecureCurrentPassword 和 CurrentPassword。 CurrentPassword 看起来没什么用处,但那是因为所有字符都是 UTF-16。 SecureCurrentPassword 可以转换为 NTLM 哈希,并在 mimikatz 的传递哈希攻击中使用,以提升我们的权限。

[玩转系统] 滥用和保护组托管服务帐户

9. 要传递哈希值,我们只需运行 mimikatz 并使用以下命令:

sekurlsa::pth /user:gmsa /domain:sbpmlab.net /ntlm:a99afa608b79a3c539a969212c505ea9

[玩转系统] 滥用和保护组托管服务帐户

10. 现在我们有了一个作为 gMSA 服务帐户运行的 shell(该帐户是域管理员的成员),我们可以做任何我们喜欢的事情来破坏 Active Directory。最快但可能最吵闹的方法之一是执行 DCSync 攻击并窃取 krbtgt 帐户的哈希值:

lsadump::dcsync /user:krbtgt /domain:sbpmlab.net

[玩转系统] 滥用和保护组托管服务帐户

gMSA 保护和监控

您可以使用一些策略来防止和检测 gMSA 滥用。

权限

您可以采取的最明显且可以说是最重要的保护是确保在组托管服务帐户上设置适当的权限。了解谁对这些对象具有写访问权限有助于保护它们;理论上,能够将自己添加到控制谁可以查询密码的属性的人已经有权接管该帐户并滥用其特权。

接下来的事情是了解谁有能力查询这些帐户的密码以及到底谁需要此类访问权限。实际上,唯一能够获取 gMSA 密码的帐户是安装 gMSA 的计算机帐户。

事件日志

您可以在本机事件日志中查找一个事件,该事件将帮助您识别谁在查询 gMSA 帐户的密码。如果您为域启用“审核目录服务访问”策略并在要监视的 gMSA 上配置 SACL,则可以在人们查询 msDS-ManagedPassword 属性时生成事件日志:

[玩转系统] 滥用和保护组托管服务帐户

打开此设置并创建新的 SACL 将生成事件 ID 为 4662 的事件日志;它看起来像这样:

[玩转系统] 滥用和保护组托管服务帐户

如您所见,这已记录“notadmin”帐户读取 gMSA 帐户上的属性。读取的属性是存储在 Active Directory 架构中的 GUID,但使用 ADSI 编辑,我们可以看到突出显示的 GUID 解析为 msDS-ManagedPasssword 属性。

[玩转系统] 滥用和保护组托管服务帐户

假设您可能有某种类型的事件日志转发或 SIEM 解决方案,这些日志对于确定谁正在访问这些属性将非常宝贵。

Netwrix 隐形防御

另一种选择是像 Netwrix StealthDEFEND 这样的工具。 Netwrix StealthDEFEND 不依赖本机事件日志,它可以立即检测 gMSA 密码访问和高风险权限分配。例如,当“notadmin”帐户查询密码时,上面所示的场景将生成以下威胁:

[玩转系统] 滥用和保护组托管服务帐户

此外,借助 Netwrix StealthDEFEND,您可以轻松构建一个剧本,以便在检测到 gMSA 滥用时执行。该剧本可能涉及多个步骤,例如要求犯罪者用户帐户响应 MFA 请求、禁用帐户或创建 ServiceNow 事件。

附录

gMSA 权限代码:

<#
Author: Kevin Joyce
Requirements: Active Directory PowerShell module, Domain Administrator privileges (to ensure the capability to get attribute GUIDs and view all permissions on all gMSA objects)
Description: Looks up permissions within Active Directory on a gMSA to determine access to modify the gMSA attribute (ms-ds-GroupMSAMembership).
Usage: populate the $target variable with the samaccountname of a gMSA.
To output the results to a text file run the following .gMSA_Permissions_Collection.ps1 > output.txt
#>
Import-Module ActiveDirectory
##Get the GUID of the extended attribute ms-ds-GroupMSAMembership from Schema
$schemaIDGUID = @{}
Get-ADObject -SearchBase (Get-ADRootDSE).schemaNamingContext -LDAPFilter '(name=ms-ds-GroupMSAMembership)' -Properties name, schemaIDGUID |
ForEach-Object {$schemaIDGUID.add([System.GUID]$_.schemaIDGUID,$_.name)}

<# **REPLACE DN VARIABLE BELOW**
Declare the samaccountname of the gMSA to search for#>
$target = 'gmsa'

##Get distinguished name of all gMSAs objects from the OU
$gMSAs = Get-ADServiceAccount -identity $target


<#Get objects that have specific permissions on the target(s): 
Full Control(GenericAll) 
Write all Properties (WriteProperty where ObjectType = 00000000-0000-0000-0000-000000000000 
#>
Set-Location ad:
foreach ($gmsa in $gMSAs){
(Get-Acl $gmsa.distinguishedname).access | 
Where-Object { (($_.AccessControlType -eq 'Allow') -and ($_.activedirectoryrights -in ('GenericAll') -and $_.inheritancetype -in ('All', 'None')) -or (($_.activedirectoryrights -like '*WriteProperty*') -and ($_.objecttype -eq '00000000-0000-0000-0000-000000000000')))} |
ft ([string]$gmsa.name),identityreference, activedirectoryrights, objecttype, isinherited -autosize 
}
<#Get objects that have specific permissions on the target(s) and specifically the gMSA attribute:
WriteProperty 
#>
Set-Location ad:
foreach ($gmsa in $gMSAs){
(Get-Acl $gmsa.distinguishedname).access | 
Where-Object {(($_.AccessControlType -eq 'Allow') -and (($_.activedirectoryrights -like '*WriteProperty*') -and ($_.objecttype -in $schemaIDGUID.Keys)))} |
ft ([string]$gmsa.name),identityreference, activedirectoryrights, objecttype, isinherited -AutoSize
}

查看原始数据gMSA_Permissions_Collection.ps1GitHub 托管

常问问题

什么是 gMSA?

与托管服务帐户 (MSA) 类似,组托管服务帐户 (gMSA) 是托管域帐户,用于帮助保护服务和访问管理。 gMSA 功能提供域控制器 (DC) 的自动密码管理、简化的服务主体名称 (SPN) 管理以及将管理委托给其他管理员的能力,从而提高 Active Directory 安全性并最大程度地减少具有特权访问权限的帐户。

MSA 和 gMSA 有什么区别?

与 MSA 不同,gMSA 可以与多台计算机关联。

如何查找群组托管服务帐户?

要获取域控制器上的 gMSA 列表,请打开服务器管理器 > 工具 > Active Directory 用户和计算机 > 托管服务帐户。

gMSA 可以成为域管理员吗?

是的,gMSA 帐户可以是域管理员的成员,但这种做法对于信息安全可能存在危险。

如何创建 gMSA?

组托管服务帐户是使用 New-ADServiceAccount cmdlet 创建的。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯