Az - Cuentas de Automatización

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

Información Básica

Las Cuentas de Automatización de Azure son servicios basados en la nube en Microsoft Azure que ayudan a automatizar tareas como la gestión de recursos, la configuración y las actualizaciones en entornos de Azure y locales. Proporcionan Runbooks (scripts para automatización que se ejecutan), programaciones y grupos de trabajadores híbridos para ejecutar trabajos de automatización, habilitando infraestructura como código (IaC) y automatización de procesos para mejorar la eficiencia y la consistencia en la gestión de recursos en la nube.

Configuraciones

  • Credenciales: La contraseña solo es accesible dentro de un runbook dentro de la cuenta de automatización, se utilizan para almacenar nombres de usuario y contraseñas de forma segura.
  • Variables: Se utilizan para almacenar datos de configuración que pueden ser utilizados en runbooks. Esto también podría incluir información sensible como claves API. Si la variable está almacenada encriptada, solo está disponible dentro de un runbook dentro de la cuenta de automatización.
  • Certificados: Se utilizan para almacenar certificados que pueden ser utilizados en runbooks.
  • Conexiones: Se utilizan para almacenar información de conexión a servicios externos. Esto podría contener información sensible.
  • Acceso a la Red: Se puede establecer como público o privado.

Runbooks y Trabajos

Un Runbook en Azure Automation es un script que realiza tareas automáticamente dentro de tu entorno en la nube. Los runbooks pueden ser escritos en PowerShell, Python o editores gráficos. Ayudan a automatizar tareas administrativas como la gestión de VM, parches o verificaciones de cumplimiento.

En el código ubicado dentro de Runbooks podría contener información sensible (como credenciales).

Un Trabajo es una instancia de ejecución de un Runbook. Cuando ejecutas un Runbook, se crea un Trabajo para rastrear esa ejecución. Cada trabajo incluye:

  • Estado: En cola, En ejecución, Completado, Fallido, Suspendido.
  • Salida: El resultado de la ejecución del Runbook.
  • Hora de Inicio y Fin: Cuándo comenzó y se completó el trabajo.

Un trabajo contiene la salida de la ejecución del Runbook. Si puedes leer los trabajos, hazlo ya que contienen la salida de la ejecución (potencial información sensible).

Programaciones y Webhooks

Hay 3 formas principales de ejecutar un Runbook:

  • Programaciones: Se utilizan para activar Runbooks en un momento específico o intervalo.
  • Webhooks: Son puntos finales HTTP que pueden ser utilizados para activar Runbooks desde servicios externos. Ten en cuenta que la URL del webhook no es visible después de la creación.
  • Activación Manual: Puedes activar manualmente un Runbook desde el Portal de Azure y desde la CLI.

Control de Versiones

Permite importar Runbooks desde Github, Azure Devops (Git) y Azure Devops (TFVC). Es posible indicar que publique los Runbooks del repositorio en la cuenta de Automatización de Azure y también es posible indicar que sincronice los cambios del repositorio a la cuenta de Automatización de Azure.

Cuando la sincronización está habilitada, en el repositorio de Github se crea un webhook para activar la sincronización cada vez que ocurre un evento de push. Ejemplo de una URL de webhook: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d

Ten en cuenta que estos webhooks no serán visibles al listar webhooks en los runbooks asociados al repositorio de Github. También ten en cuenta que no es posible cambiar la URL del repositorio de un control de versiones una vez creado.

Para que el control de versiones configurado funcione, la Cuenta de Automatización de Azure necesita tener una identidad administrada (sistema o usuario) con el rol de Contributor. Además, para asignar una identidad administrada de usuario a la Cuenta de Automatización, es necesario indicar el ID del cliente de la MI de usuario en la variable AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.

Entornos de Ejecución

Al crear un Runbook, es posible seleccionar el entorno de ejecución. Por defecto, los siguientes entornos de ejecución están disponibles:

  • Powershell 5.1
  • Powershell 7.1
  • PowerShell 7.2
  • Python 3.10
  • Python 3.8
  • Python 2.7

Sin embargo, también es posible crear tus propios entornos, utilizando uno de estos como base. En el caso de Python, es posible subir paquetes .whl al entorno que se utilizará. En el caso de PowerShell, es posible subir paquetes .zip con los módulos que se tendrán en la ejecución.

Grupos de Trabajadores Híbridos

En Azure Automation, el entorno de ejecución predeterminado para los runbooks es el Azure Sandbox, una plataforma basada en la nube gestionada por Azure, adecuada para tareas que involucran recursos de Azure. Sin embargo, este sandbox tiene limitaciones, como el acceso restringido a recursos locales y restricciones en el tiempo de ejecución y el uso de recursos. Para superar estas limitaciones, se emplean Grupos de Trabajadores Híbridos. Un Grupo de Trabajadores Híbridos consiste en uno o más Trabajadores de Runbook Híbridos instalados en tus propias máquinas, ya sea en local, en otros entornos de nube o en VMs de Azure. Esta configuración permite que los runbooks se ejecuten directamente en estas máquinas, proporcionando acceso directo a recursos locales, la capacidad de ejecutar tareas más largas y que consumen más recursos, y la flexibilidad para interactuar con entornos más allá del alcance inmediato de Azure.

Cuando se crea un grupo de trabajadores híbridos, es necesario indicar las credenciales a utilizar. Hay 2 opciones:

  • Credenciales predeterminadas: No necesitas proporcionar las credenciales y los runbooks se ejecutarán dentro de las VMs como Sistema.
  • Credenciales específicas: Necesitas proporcionar el nombre del objeto de credenciales dentro de la cuenta de automatización, que se utilizará para ejecutar los runbooks dentro de las VMs. Por lo tanto, en este caso, podría ser posible robar credenciales válidas para las VMs.

Por lo tanto, si puedes elegir ejecutar un Runbook en un Trabajador Híbrido, ejecutarás comandos arbitrarios dentro de una máquina externa como Sistema (una buena técnica de pivot).

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.

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).

Configuración de Estado (SC)

Warning

Como se indica en la documentación, la Configuración de Estado de Automatización de Azure será retirada el 30 de septiembre de 2027 y reemplazada por Configuración de Máquina de Azure.

Las Cuentas de Automatización también admiten Configuración de Estado (SC), que es una característica que ayuda a configurar y mantener el estado de tus VMs. Es posible crear y aplicar configuraciones DSC a máquinas Windows y Linux.

Desde la perspectiva de un atacante, esto era interesante porque permitía ejecutar código PS arbitrario en todas las VMs configuradas, permitiendo escalar privilegios a las identidades administradas de estas VMs, potencialmente pivotando a nuevas redes… Además, las configuraciones podrían contener información sensible.

Enumeración

# List Automation Accounts
az automation account list --output table

# Get Automation Account details
# Check the network access in `privateEndpointConnections` and `publicNetworkAccess`
# Check the managed identities in `identity`
az automation account show --name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get keys of automation account
## These are used for the DSC
az automation account list-keys --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get schedules of automation account
az automation schedule list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get connections of automation account
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/connections?api-version=2023-11-01"

# Get connection details
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/connections/<connection-name>?api-version=2023-11-01"

# Get credentials of automation account
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/credentials?api-version=2023-11-01"

# Get credential details
## Note that you will only be able to access the password from inside a Runbook
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/credentials/<credential-name>?api-version=2023-11-01"

# Get certificates of automation account
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/certificates?api-version=2023-11-01"

# Get certificate details
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/certificates/<certificate-name>?api-version=2023-11-01"

# Get variables of automation account
## It's possible to get the value of unencrypted variables but not the encrypted ones
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables?api-version=2023-11-01"

# Get variable details
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables/<variable-name>?api-version=2023-11-01"

# Get runbooks of an automation account
az automation runbook list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get runbook details
az automation runbook show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <RUNBOOK-NAME>

# Get runbook content
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/runbooks/<runbook-name>/content?api-version=2023-11-01"

# Get jobs of an automation account
az automation job list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get job details
az automation job show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <JOB-NAME>

# Get job output
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"

# Get the Runbook content when the job was executed
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>/runbookContent?api-version=2023-11-01"

# Get webhooks inside an automation account
## It's possible to see to which runbook it belongs in the given data
## For security reasons it's not possible to see the URL of the webhook after creating it, here is a URL example: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=dOdnxk6z7ugAxiuyUMKgPuDMav2Jw5EJediMdiN4jLo%3d
## Generating a webhook can be useful from a persistence perspective
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/webhooks?api-version=2018-06-30"

# Get the source control setting of an automation account (if any)
## inside the output it's possible to see if the autoSync is enabled, if the publishRunbook is enabled and the repo URL
az automation source-control list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get custom runtime environments
## Check in defaultPackages for custom ones, by default Python envs won't have anything here and PS1 envs will have "az" and "azure cli"
az automation runtime-environment list \
--resource-group <res-group>> \
--automation-account-name <account-name> \
--query "[?!(starts_with(description, 'System-generated'))]"

# Get State Configurations (SC) of an automation account
az automation dsc configuration list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get State Configuration details
az automation dsc configuration show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <DSC-CONFIG-NAME>

# Get State Configuration content
az automation dsc configuration show-content --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <DSC-CONFIG-NAME>

# Get hybrid worker groups for an automation account
az automation hrwg list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get hybrid worker group details
az automation hrwg show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <HYBRID-WORKER-GROUP>

# Get more details about a hybrid worker group (like VMs inside it)
az rest --method GET --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/hybridRunbookWorkerGroups/<hybrid-worker-group-name>/hybridRunbookWorkers?&api-version=2021-06-22"
# Check user right for automation
az extension add --upgrade -n automation
az automation account list # if it doesn't return anything the user is not a part of an Automation group

# Gets Azure Automation accounts in a resource group
Get-AzAutomationAccount

# List & get DSC configs
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration | where {$_.name -match '<name>'} | Export-AzAutomationDscConfiguration -OutputFolder . -Debug
## Automation Accounts named SecurityBaselineConfigurationWS... are there by default (not interesting)

# List & get Run books code
Get-AzAutomationAccount | Get-AzAutomationRunbook
Get-AzAutomationAccount | Get-AzAutomationRunbook | Export-AzAutomationRunbook -OutputFolder /tmp

# List credentials & variables & others
Get-AzAutomationAccount | Get-AzAutomationCredential
Get-AzAutomationAccount | Get-AzAutomationVariable
Get-AzAutomationAccount | Get-AzAutomationConnection
Get-AzAutomationAccount | Get-AzAutomationCertificate
Get-AzAutomationAccount | Get-AzAutomationSchedule
Get-AzAutomationAccount | Get-AzAutomationModule
Get-AzAutomationAccount | Get-AzAutomationPython3Package
## Exfiltrate credentials & variables and the other info loading them in a Runbook and printing them

# List hybrid workers
Get-AzAutomationHybridWorkerGroup -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME>

Escalación de Privilegios y Post Explotación

Az - Automation Accounts Privesc

Persistencia

Az - Automation Accounts Persistence

Referencias

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