Az - Contas de Automação

Reading time: 12 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Informações Básicas

As Contas de Automação do Azure são serviços baseados em nuvem na Microsoft Azure que ajudam a automatizar tarefas como gerenciamento de recursos, configuração e atualizações em ambientes Azure e locais. Elas fornecem Runbooks (scripts para automação que são executados), agendas e grupos de trabalhadores híbridos para executar trabalhos de automação, permitindo infraestrutura como código (IaC) e automação de processos para melhorar a eficiência e a consistência na gestão de recursos em nuvem.

Configurações

  • Credenciais: A senha é acessível apenas dentro de um runbook na conta de automação, sendo usada para armazenar nomes de usuário e senhas de forma segura.
  • Variáveis: Usadas para armazenar dados de configuração que podem ser utilizados em runbooks. Isso também pode incluir informações sensíveis, como chaves de API. Se a variável estiver armazenada criptografada, ela estará disponível apenas dentro de um runbook na conta de automação.
  • Certificados: Usados para armazenar certificados que podem ser utilizados em runbooks.
  • Conexões: Usadas para armazenar informações de conexão com serviços externos. Isso pode conter informações sensíveis.
  • Acesso à Rede: Pode ser definido como público ou privado.

Runbooks & Trabalhos

Um Runbook na Automação do Azure é um script que executa tarefas automaticamente dentro do seu ambiente em nuvem. Os runbooks podem ser escritos em PowerShell, Python ou editores gráficos. Eles ajudam a automatizar tarefas administrativas como gerenciamento de VM, aplicação de patches ou verificações de conformidade.

No código localizado dentro dos Runbooks pode conter informações sensíveis (como credenciais).

Um Trabalho é uma instância da execução de um Runbook. Quando você executa um Runbook, um Trabalho é criado para rastrear essa execução. Cada trabalho inclui:

  • Status: Em fila, Executando, Concluído, Falhou, Suspenso.
  • Saída: O resultado da execução do Runbook.
  • Hora de Início e Fim: Quando o trabalho começou e foi concluído.

Um trabalho contém a saída da execução do Runbook. Se você puder ler os trabalhos, faça isso, pois eles contêm a saída da execução (potencial informação sensível).

Agendas & Webhooks

Existem 3 maneiras principais de executar um Runbook:

  • Agendas: Usadas para disparar Runbooks em um horário específico ou intervalo.
  • Webhooks: São endpoints HTTP que podem ser usados para disparar Runbooks a partir de serviços externos. Observe que a URL do webhook não é visível após a criação.
  • Disparo Manual: Você pode disparar manualmente um Runbook a partir do Portal do Azure e do CLI.

Controle de Versão

Permite importar Runbooks do Github, Azure Devops (Git) e Azure Devops (TFVC). É possível indicar que os Runbooks do repositório sejam publicados na conta de Automação do Azure e também é possível indicar para sincronizar as alterações do repositório com a conta de Automação do Azure.

Quando a sincronização está habilitada, um webhook é criado no repositório do Github para disparar a sincronização sempre que um evento de push ocorre. Exemplo de uma URL de webhook: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d

Observe que esses webhooks não serão visíveis ao listar webhooks nos runbooks associados ao repositório do Github. Também observe que não é possível alterar a URL do repositório de um controle de versão uma vez que ele é criado.

Para que o controle de versão configurado funcione, a Conta de Automação do Azure precisa ter uma identidade gerenciada (sistema ou usuário) com o papel de Contribuidor. Além disso, para atribuir uma identidade gerenciada de usuário à Conta de Automação, é necessário indicar o ID do cliente da MI do usuário na variável AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.

Ambientes de Execução

Ao criar um Runbook, é possível selecionar o ambiente de execução. Por padrão, os seguintes ambientes de execução estão disponíveis:

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

No entanto, também é possível criar seus próprios ambientes, usando um desses como base. No caso do Python, é possível fazer upload de pacotes .whl para o ambiente que será utilizado. No caso do PowerShell, é possível fazer upload de pacotes .zip com os módulos a serem utilizados na execução.

Grupos de Trabalhadores Híbridos

Na Automação do Azure, o ambiente de execução padrão para runbooks é o Azure Sandbox, uma plataforma baseada em nuvem gerenciada pelo Azure, adequada para tarefas envolvendo recursos do Azure. No entanto, esse sandbox tem limitações, como acesso restrito a recursos locais e restrições de tempo de execução e uso de recursos. Para superar essas limitações, são empregados Grupos de Trabalhadores Híbridos. Um Grupo de Trabalhadores Híbridos consiste em um ou mais Trabalhadores de Runbook Híbridos instalados em suas próprias máquinas, seja em locais, em outros ambientes de nuvem ou VMs do Azure. Essa configuração permite que runbooks sejam executados diretamente nessas máquinas, proporcionando acesso direto a recursos locais, a capacidade de executar tarefas mais longas e intensivas em recursos, e a flexibilidade de interagir com ambientes além do alcance imediato do Azure.

Quando um grupo de trabalhadores híbridos é criado, é necessário indicar as credenciais a serem usadas. Existem 2 opções:

  • Credenciais padrão: Você não precisa fornecer as credenciais e os runbooks serão executados dentro das VMs como Sistema.
  • Credenciais específicas: Você precisa fornecer o nome do objeto de credenciais dentro da conta de automação, que será usado para executar os runbooks dentro das VMs. Portanto, nesse caso, pode ser possível roubar credenciais válidas para as VMs.

Portanto, se você puder escolher executar um Runbook em um Trabalhador Híbrido, você executará comandos arbitrários dentro de uma máquina externa como Sistema (boa técnica de pivotagem).

Além disso, se o trabalhador híbrido estiver sendo executado no Azure com outras Identidades Gerenciadas anexadas, o runbook poderá acessar a identidade gerenciada do runbook e todas as identidades gerenciadas da VM a partir do serviço de metadados.

tip

Lembre-se de que o serviço de metadados tem uma URL diferente (http://169.254.169.254) do serviço de onde se obtém o token de identidades gerenciadas da conta de automação (IDENTITY_ENDPOINT).

Configuração de Estado (SC)

warning

Conforme indicado na documentação, a Configuração de Estado do Azure Automation será descontinuada em 30 de setembro de 2027 e substituída pela Configuração de Máquina do Azure.

As Contas de Automação também suportam Configuração de Estado (SC), que é um recurso que ajuda a configurar e manter o estado de suas VMs. É possível criar e aplicar configurações DSC em máquinas Windows e Linux.

Do ponto de vista de um atacante, isso era interessante porque permitia executar código PS arbitrário em todas as VMs configuradas, permitindo escalar privilégios para as identidades gerenciadas dessas VMs, potencialmente pivotando para novas redes... Além disso, as configurações poderiam conter informações sensíveis.

Enumeração

bash
# 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"
bash
# 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>

Escalação de Privilégios & Pós Exploração

Az - Automation Accounts Privesc

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks