Translated ['', 'src/pentesting-cloud/azure-security/az-lateral-movement

This commit is contained in:
Translator
2025-08-25 21:26:02 +00:00
parent 746da769a1
commit 9562323fda

View File

@@ -2,63 +2,66 @@
{{#include ../../../banners/hacktricks-training.md}}
## 基本信息
## Basic Information
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sync-whatis) Microsoft Entra Connect 同步服务 (Microsoft Entra Connect Sync) 是 Microsoft Entra Connect 的主要组成部分。它负责处理与在本地环境 Microsoft Entra ID 之间同步身份数据相关的所有操作。
[From the docs:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sync-whatis) Microsoft Entra Connect synchronization services (Microsoft Entra Connect Sync) 是 Microsoft Entra Connect 的主要组。它负责处理与在本地环境 Microsoft Entra ID 之间同步身份数据相关的所有操作。
The sync service consists of two components, the on-premises **Microsoft Entra Connect Sync** component and the service side in Microsoft Entra ID called **Microsoft Entra Connect Sync service**.
为了使用它,需要在 AD 环境内的一台服务器上安装 **`Microsoft Entra Connect Sync`** agent。该 agent 将负责来自 AD 端的同步工作。
为了使用它,需要在您的 AD 环境中的服务器上安装 **`Microsoft Entra Connect Sync`** 代理。这个代理将负责从 AD 侧进行同步。
<figure><img src="../../../../images/image (173).png" alt=""><figcaption></figcaption></figure>
**Connect Sync** 基本上是将 **AD 中的用户同步到 Entra ID 的“旧” Azure 方法。** 推荐的方法是使用 **Entra Cloud Sync**
The **Connect Sync** is basically the "old" Azure way to **synchronize users from AD into Entra ID.** 推荐的新方式是使用 **Entra Cloud Sync**
{{#ref}}
az-cloud-sync.md
{{#endref}}
### 生成的主体
### Principals Generated
- 账户 **`MSOL_<installationID>`** 会在本地 AD 中自动创建。账户被**目录同步账户** 角色 (见 [文档](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)),这意味着它在本地 AD 中具有 **复制 (DCSync) 权限**
- 这意味着任何妥协此账户的人都将能够妥协本地域。
- 在本地 AD 中创建了一个管服务账户 **`ADSyncMSA<id>`**没有任何特殊的默认权限。
- 在 Entra ID 中,服务主体 **`ConnectSyncProvisioning_ConnectSync_<id>`** 会与证书一起创建
- The account **`MSOL_<installationID>`** 会在本地 AD 中自动创建。账户被**Directory Synchronization Accounts** role参见 [documentation](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions),这意味着它在本地 AD 中具有 **replication (DCSync) 权限**
- 这意味着任何能够入侵该账户的人都可以攻破本地域。
- 一个管服务账户 **`ADSyncMSA<id>`** 会在本地 AD 中创建,默认没有任何特殊权限。
- 在 Entra ID 中会创建名为 **`ConnectSyncProvisioning_ConnectSync_<id>`** 的 Service Principal并配有一个证书
## 同步密码
## Synchronize Passwords
### 密码哈希同步
### Password Hash Synchronization
此组件还可以用于 **将密码从 AD 同步到 Entra ID**以便用户能够使用其 AD 密码连接到 Entra ID。为此需要在安装在 AD 服务器上的 Microsoft Entra Connect Sync 代理中允许密码哈希同步
This component can be also used to **sychronize passwords from AD into Entra ID**使用户能够使用其 AD 密码连接到 Entra ID。为此需要在安装在 AD 服务器上的 Microsoft Entra Connect Sync agent 中启用 password hash synchronization
[来自文档:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **密码哈希同步** 是实现混合身份的一种登录方法。**Azure AD Connect** 将用户密码的哈希的哈希从本地 Active Directory 实例同步到基于云的 Azure AD 实例。
[From the docs:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **Password hash synchronization** 是实现混合身份的登录方法之一。**Azure AD Connect** 将用户密码的哈希的哈希a hash of the hash从本地 Active Directory 实例同步到云的 Azure AD 实例。
基本上,所有 **用户** **密码哈希的哈希** 从本地同步到 Azure AD。然而,**明文密码** 或 **原始** **哈希** 不会发送到 Azure AD。
基本上,所有 **用户** 及其 **密码哈希的哈希** 从本地同步到 Azure AD。**明文密码****原始哈希** 不会发送到 Azure AD。
**哈希同步** **2 分钟** 发生一次。然而,默认情况下,**密码过期** 和 **账户** **过期** Azure AD**不进行同步**。因此,**本地密码过期**(未更改)的用户可以继续使用旧密码 **访问 Azure 资源**
哈希同步每 **2 分钟** 发生一次。然而,默认情况下,**密码过期** 和 **账户过期** 不会同步到 Azure AD。因此,某个本地用户的 **密码过期**(未更改)时,仍可能使用旧密码继续 **访问 Azure 资源**
当本地用户想要访问 Azure 资源时,**身份验证发生在 Azure AD 上**。
当本地用户想要访问 Azure 资源时,**身份验证在 Azure AD 上进行**。
> [!NOTE]
> 默认情况下,已知特权组(如域管理员)中具有 **`adminCount` 为 1 的属性的用户不会与 Entra ID 同步,出于安全原因。然而,其他没有属性或直接分配高权限的特权组中的用户 **可被同步**。
> 默认情况下,带有属性 **`adminCount` 为 1** 的已知特权组(例如 Domain Admins的用户出于安全原因**不会与 Entra ID 同步**。然而,属于特权组但没有属性的其他用户,或直接分配高权限的用户**可能会被同步**。
### 密码回写
### Password Writeback
此配置允许在用户在 Entra ID 中更改其密码时 **将密码从 Entra ID 同步到 AD**。请注意,为了使密码回写正常工作,自动生成的 `MSOL_<id>` 用户需要被授予 [文档中指示的更多权限](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback),以便能够 **修改 AD 中任何用户的密码**
此配置允许在用户在 Entra ID 中更改其密码时将密码**写回synchronize passwords from Entra ID into AD**到 AD。注意为使 password writeback 生效AD 中自动生成的 `MSOL_<id>` 用户需要被授予[文档中指示的更多权限](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback),以便能够**修改 AD 中任何用户的密码**。
这对于从被妥协的 Entra ID 妥协 AD 特别有,因为您将能够修改“几乎”任何用户的密码。
这对于在已入侵的 Entra ID 环境中攻陷 AD 特别有意义,因为你可以修改“几乎”任何用户的密码。
如果组具有 **`adminCount` 属性为 1**,则域管理员和其他属于某些特权组的用户不会被复制。但是,其他在 AD 中被分配高权限不属于任何这些组的用户可以更改他们的密码。例如:
如果组具有 **`adminCount` 属性为 1**,则域管理员和属于某些特权组的其他用户不会被复制。但在 AD 中被直接赋予高权限不属于这些组的其他用户,其密码可能会被更改。例如:
- 直接分配高权限的用户。
- **`DNSAdmins`** 组的用户。
- 创建 GPO 并将其分配给 OU 的 **`Group Policy Creator Owners`** 组的用户将能够修改他们创建的 GPO。
- 可以向 Active Directory 发布证书的 **`Cert Publishers Group`** 的用户。
- 任何其他没有 **`adminCount` 属性为 1** 的高权限组的用户。
- 直接分配高权限的用户。
- 来自 **`DNSAdmins`** 组的用户。
- 来自 **`Group Policy Creator Owners`** 组并创建了 GPO 并将其分配到 OU 的用户将能够修改他们创建的 GPO。
- 来自 **`Cert Publishers`** 的用户,可以向 Active Directory 发布证书
- 任何其他具有高权限但没有 **`adminCount` 属性为 1** 的组的用户。
## AD --> Entra ID 的枢轴
## Pivoting AD --> Entra ID
### 枚举 Connect Sync
### Enumerating Connect Sync
检查用户:
Check for users:
```bash
# Check for the users created by the Connect Sync
Install-WindowsFeature RSAT-AD-PowerShell
@@ -76,25 +79,25 @@ $searcher.FindAll()
$searcher.Filter = "(samAccountName=Sync_*)"
$searcher.FindAll()
```
检查 **Connect Sync 配置**如果有的话):
检查 **Connect Sync 配置** (如果有):
```bash
az rest --url "https://graph.microsoft.com/v1.0/directory/onPremisesSynchronization"
# Check if password sychronization is enabled, if password and group writeback are enabled...
```
### 查找密码
**`MSOL_*`** 用户(以及如果创建 **Sync\_\*** 用户)的密码 **存储在 SQL 服务器** 上,该服务器上安装了 **Entra ID Connect。** 管理员可以以明文形式提取这些特权用户的密码。\
**`MSOL_*`** 用户的密码(以及如果创建 **Sync\_\*** 用户)存储在部署了 **Entra ID Connect** 的服务器上的 **SQL server** 中。管理员可以以明文形式提取这些特权用户的密码。\
数据库位于 `C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf`
可以从其中一个表中提取配置,其中一个是加密的:
可以从个表中提取配置,其中一个是加密的:
`SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;`
**加密配置** 使用 **DPAPI** 加密,包含 **`MSOL_*`** 用户在本地 AD 中的密码和 **Sync\_\*** 在 AzureAD 中的密码。因此,妥协这些密码可以提升到 AD 和 AzureAD 的权限
**encrypted configuration** 使用 **DPAPI** 加密,包含本地 AD 中 `MSOL_*` 用户的密码以及 AzureAD 中 **Sync\_\*** 的密码。因此,攻陷这些凭据后可以对本地 AD 和 AzureAD 进行 privesc
可以在 [此演讲中找到有关这些凭据如何存储和解密的完整概述](https://www.youtube.com/watch?v=JEIR5oGCwdg)。
可以在 [full overview of how these credentials are stored and decrypted in this talk](https://www.youtube.com/watch?v=JEIR5oGCwdg) 找到完整概述
### 滥用 MSOL\_*
### 滥用 MSOL\_\*
```bash
# Once the Azure AD connect server is compromised you can extract credentials with the AADInternals module
Install-Module -Name AADInternals -RequiredVersion 0.9.0 # Uninstall-Module AADInternals if you have a later version
@@ -112,34 +115,34 @@ runas /netonly /user:defeng.corp\MSOL_123123123123 cmd
Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.local /dc:dc.domain.local"'
```
> [!WARNING]
> 之前的攻击泄露了另一个密码,以便连接到名为 `Sync_*` 的 Entra ID 用户,然后危害了 Entra ID。然而,该用户不再存在。
> 之前的攻击窃取了另一个密码,以连接到名为 `Sync_*` 的 Entra ID 用户并进一步入侵 Entra ID。但该用户现在已不存在。
### Abusing ConnectSyncProvisioning_ConnectSync\_<id>
此应用程序创建时没有分配任何 Entra ID 或 Azure 管理角色。然而,它具有以下 API 权限:
### 滥用 ConnectSyncProvisioning_ConnectSync\_<id>
此应用创建时没有被分配任何 Entra ID 或 Azure 管理角色。但它具有以下 API 权限:
- Microsoft Entra AD Synchronization Service
- `ADSynchronization.ReadWrite.All`
- Microsoft 密码重置服务
- Microsoft password reset service
- `PasswordWriteback.OffboardClient.All`
- `PasswordWriteback.RefreshClient.All`
- `PasswordWriteback.RegisterClientVersion.All`
提到该应用程序的服务主体仍然可以使用未记录的 API 执行一些特权操作,但据我所知尚未找到 PoC。\
无论如何,考虑到这可能是可行的,进一步探索如何找到证书以作为此服务主体登录并尝试利用它将是有趣的。
据称,该应用的 SP 仍可通过未记录的 API 执行一些特权操作,但据我所知尚未找到 PoC。无论如何,考虑到这可能性,值得进一步探索如何找到用于以该 service principal 登录的证书并尝试滥用它。
这篇 [blog post](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) 在从使用 `Sync_*` 用户改为此服务主体之前不久发布,解释证书存储在服务器内部,并且可以找到它,生成其 PoP(拥有证明)和图形令牌,并通过此方式能够向服务主体添加新证书(因为 **服务主体** 始终可以为自己分配新证书),然后使用它保持作为 SP 持久性。
这篇 [blog post](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) 在从使用 `Sync_*` 用户改为使用该 service principal 后不久发布,解释证书存储在服务器内可以找到它,生成其 PoP (Proof of Possession) 和 graph token利用这些可以向该 service principal 添加新证书(因为一个 **service principal** 总是可以为自己分配新证书),然后用它作为 SP 维持持久性。
执行这些操作,发布了以下工具:[SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils)
为执行这些操作,发布了以下工具: [SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils).
根据我的经验,证书不再存储在之前工具查找的地方,因此该工具不再有效。因此,可能需要进一步研究
根据 [this question](https://github.com/hotnops/ECUtilities/issues/1#issuecomment-3220989919),要找到该证书,必须从已**窃取 `miiserver` 进程 token**的进程中运行该工具
### Abusing Sync\_\* [DEPRECATED]
### 滥用 Sync\_\* [已弃用]
> [!WARNING]
> 之前在 Entra ID 中创建一个名为 `Sync_*` 的用户,并分配了非常敏感的权限,允许执行特权操作,如修改任何用户密码或向服务主体添加新凭据。然而,从 2025 年 1 月起,该用户不再默认创建,因为现在使用的是应用程序/SP **`ConnectSyncProvisioning_ConnectSync_<id>`**。然而,它可能仍然存在于某些环境中,因此值得检查。
> 之前在 Entra ID 中创建一个名为 `Sync_*` 的用户,并赋予非常敏感的权限,允许执行修改任何用户密码或向 service principal 添加新凭证等特权操作。然而,从 2025 年 1 月起,默认不再创建该用户,改为使用 Application/SP **`ConnectSyncProvisioning_ConnectSync_<id>`**。但在某些环境中它仍可能存在,值得检查。
危害 **`Sync_*`** 户可以 **重置任何用户的密码**(包括全局管理员
攻陷 **`Sync_*`** 户可以 **重置任何用户的密码**(包括 Global Administrators
```bash
Install-Module -Name AADInternals -RequiredVersion 0.9.0 # Uninstall-Module AADInternals if you have a later version
Import-Module AADInternals
@@ -163,7 +166,7 @@ Set-AADIntUserPassword -SourceAnchor "3Uyg19ej4AHDe0+3Lkc37Y9=" -Password "JustA
# Now it's possible to access Azure AD with the new password and op-prem with the old one (password changes aren't sync)
```
也可以**仅修改云**用户的密码(即使这很意外
也可以**仅修改 cloud 用户的密码**(即使这有点出乎意料
```bash
# To reset the password of cloud only user, we need their CloudAnchor that can be calculated from their cloud objectID
# The CloudAnchor is of the format USER_ObjectID.
@@ -172,25 +175,25 @@ Get-AADIntUsers | ?{$_.DirSyncEnabled -ne "True"} | select UserPrincipalName,Obj
# Reset password
Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37" -Password "JustAPass12343.%" -Verbosewers
```
可以转储该用户的密码。
可以转储该用户的密码。
> [!CAUTION]
> 另一个选项是**为服务主体分配特权权限****Sync**用户有**权限**这样做,然后**访问该服务主体**作为特权提升的方法
> 另一种选择是 **assign privileged permissions to a service principal****Sync** 用户有执行此操作的 **permissions**,然后通过 **access that service principal** 来实现 privesc
### 无缝单点登录
### Seamless SSO
可以使用与PHS的无缝单点登录这对其他滥用是脆弱的。请查看
可以在配合 PHS 的情况下使用 Seamless SSO这可能会受到其他滥用的影响。详见
{{#ref}}
az-seamless-sso.md
{{#endref}}
## 旋转 Entra ID --> AD
## Pivoting Entra ID --> AD
- 如果启用了密码回写,您可以**修改与Entra ID同步的AD中任何用户的密码**
- 如果启用了组回写,您可以**将用户添加到与AD同步的Entra ID中的特权组**
- 如果启用了 password writeback你可以 **modify the password of any user in the AD**,这些用户与 Entra ID 同步。
- 如果启用了 groups writeback你可以在与 AD 同步的 Entra ID**add users to privileged groups**
## 参考
## 参考资料
- [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/whatis-phs](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/whatis-phs)
- [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/)