Azure Pentesting

Support HackTricks


Basic Information

Az - Basic Information

Azure Pentester/Red Team Methodology

In order to audit an AZURE environment it's very important to know: which services are being used, what is being exposed, who has access to what, and how are internal Azure services and external services connected.

From a Red Team point of view, the first step to compromise an Azure environment is to manage to obtain some credentials for Azure AD. Here you have some ideas on how to do that:

  • Leaks in github (or similar) - OSINT

  • Social Engineering

  • Password reuse (password leaks)

  • Vulnerabilities in Azure-Hosted Applications

    • Server Side Request Forgery with access to metadata endpoint

    • Local File Read

      • /home/USERNAME/.azure

      • C:\Users\USERNAME\.azure

      • The file accessTokens.json in az cli before 2.30 - Jan2022 - stored access tokens in clear text

      • The file azureProfile.json contains info about logged user.

      • az logout removes the token.

      • Older versions of Az PowerShell stored access tokens in clear text in TokenCache.dat. It also stores ServicePrincipalSecret in clear-text in AzureRmContext.json. The cmdlet Save-AzContext can be used to store tokens. Use Disconnect-AzAccount to remove them.

  • 3rd parties breached

  • Internal Employee

Even if you haven't compromised any user inside the Azure tenant you are attacking, you can gather some information from it:

Az - Unauthenticated Enum & Initial Entry

After you have managed to obtain credentials, you need to know to who do those creds belong, and what they have access to, so you need to perform some basic enumeration:

Basic Enumeration

Remember that the noisiest part of the enumeration is the login, not the enumeration itself.


If you found a SSRF in a machine inside Azure check this page for tricks:

Bypass Login Conditions

In cases where you have some valid credentials but you cannot login, these are some common protections that could be in place:

  • IP whitelisting -- You need to compromise a valid IP

  • Geo restrictions -- Find where the user lives or where are the offices of the company and get a IP from the same city (or contry at least)

  • Browser -- Maybe only a browser from certain OS (Windows, Linux, Mac, Android, iOS) is allowed. Find out which OS the victim/company uses.

  • You can also try to compromise Service Principal credentials as they usually are less limited and its login is less reviewed

After bypassing it, you might be able to get back to your initial setup and you will still have access.

Subdomain Takeover


Learn how to install az cli, AzureAD and Az PowerShell in the Az - AzureAD section.

One of the first things you need to know is who you are (in which environment you are):

az account list 
az account tenant list # Current tenant info
az account subscription list # Current subscription info
az ad signed-in-user show # Current signed-in user
az ad signed-in-user list-owned-objects # Get owned objects by current user
az account management-group list #Not allowed by default

Oone of the most important commands to enumerate Azure is Get-AzResource from Az PowerShell as it lets you know the resources your current user has visibility over.

You can get the same info in the web console going to or searching for "All resources"

AzureAD Enumeration

By default, any user should have enough permissions to enumerate things such us, users, groups, roles, service principals... (check default AzureAD permissions). You can find here a guide:

Az - AzureAD (AAD)

Now that you have some information about your credentials (and if you are a red team hopefully you haven't been detected). It's time to figure out which services are being used in the environment. In the following section you can check some ways to enumerate some common services.

Service Principal and Access Policy

An Azure service can have a System Identity (of the service itself) or use a User Assigned Managed Identity. This Identity can have Access Policy to, for example, a KeyVault to read secrets. These Access Policies should be restricted (least privilege principle), but might have more permissions than required. Typically an App Service would use KeyVault to retrieve secrets and certificates.

So it is useful to explore these identities.

App Service SCM

Kudu console to log in to the App Service 'container'.


Use and select the shell, or use, for a bash or powershell. The 'disk' of this shell are stored as an image file in a storage-account.

Azure DevOps

Azure DevOps is separate from Azure. It has repositories, pipelines (yaml or release), boards, wiki, and more. Variable Groups are used to store variable values and secrets.

Automated Recon Tools

cd ROADTools
pipenv shell
roadrecon auth -u -p "Welcome2022!"
roadrecon gather
roadrecon gui

Import-Module monkey365
Get-Help Invoke-Monkey365
Get-Help Invoke-Monkey365 -Detailed
Invoke-Monkey365 -IncludeAzureActiveDirectory -ExportTo HTML -Verbose -Debug -InformationAction Continue
Invoke-Monkey365 - Instance Azure -Analysis All -ExportTo HTML

# Start Backend
cd stormspotter\backend\
pipenv shell
python ssbackend.pyz

# Start Front-end
cd stormspotter\frontend\dist\spa\
quasar.cmd serve -p 9091 --history

# Run Stormcollector
cd stormspotter\stormcollector\
pipenv shell
az login -u -p Welcome2022!
python stormspotter\stormcollector\sscollector.pyz cli
# This will generate a .zip file to upload in the frontend (

# You need to use the Az PowerShell and Azure AD modules:
$passwd = ConvertTo-SecureString "Welcome2022!" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("", $passwd)
Connect-AzAccount -Credential $creds

Import-Module AzureAD\AzureAD.psd1
Connect-AzureAD -Credential $creds

# Launch AzureHound
. AzureHound\AzureHound.ps1
Invoke-AzureHound -Verbose

# Simple queries
## All Azure Users
MATCH (n:AZUser) return
## All Azure Applications
MATCH (n:AZApp) return n.objectid
## All Azure Devices
MATCH (n:AZDevice) return
## All Azure Groups
MATCH (n:AZGroup) return
## All Azure Key Vaults
MATCH (n:AZKeyVault) return
## All Azure Resource Groups
MATCH (n:AZResourceGroup) return
## All Azure Service Principals
MATCH (n:AZServicePrincipal) return n.objectid
## All Azure Virtual Machines
MATCH (n:AZVM) return
## All Principals with the ‘Contributor’ role
MATCH p = (n)-[r:AZContributor]->(g) RETURN p

# Advanced queries
## Get Global Admins
MATCH p =(n)-[r:AZGlobalAdmin*1..]->(m) RETURN p
## Owners of Azure Groups
MATCH p = (n)-[r:AZOwns]->(g:AZGroup) RETURN p
## All Azure Users and their Groups
MATCH p=(m:AZUser)-[r:MemberOf]->(n) WHERE NOT m.objectid CONTAINS 'S-1-5' RETURN p
## Privileged Service Principals
MATCH p = (g:AZServicePrincipal)-[r]->(n) RETURN p
## Owners of Azure Applications
MATCH p = (n)-[r:AZOwns]->(g:AZApp) RETURN p
## Paths to VMs
MATCH p = (n)-[r]->(g: AZVM) RETURN p
## Paths to KeyVault
MATCH p = (n)-[r]->(g:AZKeyVault) RETURN p
## Paths to Azure Resource Group
MATCH p = (n)-[r]->(g:AZResourceGroup) RETURN p
## On-Prem users with edges to Azure
MATCH  p=(m:User)-[r:AZResetPassword|AZOwns|AZUserAccessAdministrator|AZContributor|AZAddMembers|AZGlobalAdmin|AZVMContributor|AZOwnsAZAvereContributor]->(n) WHERE m.objectid CONTAINS 'S-1-5-21' RETURN p
## All Azure AD Groups that are synchronized with On-Premise AD
MATCH (n:Group) WHERE n.objectid CONTAINS 'S-1-5' AND n.azsyncid IS NOT NULL RETURN n

# You should use an account with at least read-permission on the assets you want to access
git clone
PS> Get-ChildItem -Recurse c:\Azucar_V10 | Unblock-File

PS> .\Azucar.ps1 -AuthMode UseCachedCredentials -Verbose -WriteLog -Debug -ExportTo PRINT
PS> .\Azucar.ps1 -ExportTo CSV,JSON,XML,EXCEL -AuthMode Certificate_Credentials -Certificate C:\AzucarTest\server.pfx -ApplicationId 00000000-0000-0000-0000-000000000000 -TenantID 00000000-0000-0000-0000-000000000000
PS> .\Azucar.ps1 -ExportTo CSV,JSON,XML,EXCEL -AuthMode Certificate_Credentials -Certificate C:\AzucarTest\server.pfx -CertFilePassword MySuperP@ssw0rd! -ApplicationId 00000000-0000-0000-0000-000000000000 -TenantID 00000000-0000-0000-0000-000000000000

# resolve the TenantID for an specific username
PS> .\Azucar.ps1 -ResolveTenantUserName

Import-Module .\MicroBurst.psm1
Import-Module .\Get-AzureDomainInfo.ps1
Get-AzureDomainInfo -folder MicroBurst -Verbose

ipmo C:\Path\To\Powerzure.psd1

# Reader
$ Get-Runbook, Get-AllUsers, Get-Apps, Get-Resources, Get-WebApps, Get-WebAppDetails

# Contributor
$ Execute-Command -OS Windows -VM Win10Test -ResourceGroup Test-RG -Command "whoami"
$ Execute-MSBuild -VM Win10Test  -ResourceGroup Test-RG -File "build.xml"
$ Get-AllSecrets # AllAppSecrets, AllKeyVaultContents
$ Get-AvailableVMDisks, Get-VMDisk # Download a virtual machine's disk

# Owner
$ Set-Role -Role Contributor -User -Resource Win10VMTest

# Administrator
$ Create-Backdoor, Execute-Backdoor
Support HackTricks

Last updated