Azure Pentesting

Support HackTricks

AÚN ESTOY CONSTRUYENDO LA METODOLOGÍA DE AZURE

Información Básica

Az - Basic Information

Metodología de Pentester/Red Team de Azure

Para auditar un entorno de AZURE, es muy importante saber: qué servicios se están utilizando, qué está siendo expuesto, quién tiene acceso a qué, y cómo están conectados los servicios internos de Azure y los servicios externos.

Desde el punto de vista de un Red Team, el primer paso para comprometer un entorno de Azure es conseguir obtener algunas credenciales para Azure AD. Aquí tienes algunas ideas sobre cómo hacerlo:

  • Filtraciones en github (o similar) - OSINT

  • Ingeniería Social

  • Reutilización de contraseñas (filtraciones de contraseñas)

  • Vulnerabilidades en Aplicaciones Alojadas en Azure

  • Server Side Request Forgery con acceso al endpoint de metadatos

  • Lectura de Archivos Locales

  • /home/USERNAME/.azure

  • C:\Users\USERNAME\.azure

  • El archivo accessTokens.json en az cli antes de 2.30 - Jan2022 - almacenaba tokens de acceso en texto claro

  • El archivo azureProfile.json contiene información sobre el usuario conectado.

  • az logout elimina el token.

  • Versiones anteriores de Az PowerShell almacenaban tokens de acceso en texto claro en TokenCache.dat. También almacena ServicePrincipalSecret en texto claro en AzureRmContext.json. El cmdlet Save-AzContext se puede usar para almacenar tokens. Usa Disconnect-AzAccount para eliminarlos.

  • Terceros comprometidos

  • Empleado Interno

  • Phishing Común (credenciales o aplicación Oauth)

Incluso si no has comprometido a ningún usuario dentro del inquilino de Azure que estás atacando, puedes recolectar algo de información de él:

Az - Unauthenticated Enum & Initial Entry

Después de haber conseguido obtener credenciales, necesitas saber a quién pertenecen esas credenciales, y a qué tienen acceso, así que necesitas realizar alguna enumeración básica:

Enumeración Básica

Recuerda que la parte más ruidosa de la enumeración es el inicio de sesión, no la enumeración en sí.

SSRF

Si encontraste un SSRF en una máquina dentro de Azure, consulta esta página para trucos:

Bypass de Condiciones de Inicio de Sesión

En casos donde tienes algunas credenciales válidas pero no puedes iniciar sesión, estas son algunas protecciones comunes que podrían estar en su lugar:

  • Lista blanca de IP -- Necesitas comprometer una IP válida

  • Restricciones geográficas -- Encuentra dónde vive el usuario o dónde están las oficinas de la empresa y obtén una IP de la misma ciudad (o país al menos)

  • Navegador -- Tal vez solo se permite un navegador de cierto SO (Windows, Linux, Mac, Android, iOS). Descubre qué SO usa la víctima/empresa.

  • También puedes intentar comprometer las credenciales del Service Principal ya que generalmente son menos limitadas y su inicio de sesión es menos revisado

Después de eludirlo, podrías ser capaz de volver a tu configuración inicial y aún tendrás acceso.

Toma de Subdominio

Whoami

Aprende cómo instalar az cli, AzureAD y Az PowerShell en la sección Az - AzureAD.

Una de las primeras cosas que necesitas saber es quién eres (en qué entorno estás):

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

Uno de los comandos más importantes para enumerar Azure es Get-AzResource de Az PowerShell, ya que te permite conocer los recursos a los que tu usuario actual tiene visibilidad.

Puedes obtener la misma información en la consola web yendo a https://portal.azure.com/#view/HubsExtension/BrowseAll o buscando "Todos los recursos"

Enumeración de AzureAD

Por defecto, cualquier usuario debería tener suficientes permisos para enumerar cosas como, usuarios, grupos, roles, principales de servicio... (ver permisos predeterminados de AzureAD). Aquí puedes encontrar una guía:

Az - AzureAD (AAD)

Ahora que tienes algo de información sobre tus credenciales (y si eres un equipo rojo, espero que no hayas sido detectado). Es hora de averiguar qué servicios se están utilizando en el entorno. En la siguiente sección puedes revisar algunas formas de enumerar algunos servicios comunes.

Principal de Servicio y Política de Acceso

Un servicio de Azure puede tener una Identidad del Sistema (del propio servicio) o usar una Identidad Administrada Asignada por el Usuario. Esta Identidad puede tener una Política de Acceso a, por ejemplo, un KeyVault para leer secretos. Estas Políticas de Acceso deberían estar restringidas (principio de menor privilegio), pero podrían tener más permisos de los necesarios. Típicamente, un App Service usaría KeyVault para recuperar secretos y certificados.

Por lo tanto, es útil explorar estas identidades.

SCM de App Service

Consola Kudu para iniciar sesión en el 'contenedor' del App Service.

Webshell

Usa portal.azure.com y selecciona la shell, o usa shell.azure.com, para un bash o powershell. El 'disco' de esta shell se almacena como un archivo de imagen en una cuenta de almacenamiento.

Azure DevOps

Azure DevOps es independiente de Azure. Tiene repositorios, pipelines (yaml o release), tableros, wiki, y más. Los Grupos de Variables se utilizan para almacenar valores de variables y secretos.

Herramientas de Reconocimiento Automatizado

cd ROADTools
pipenv shell
roadrecon auth -u test@corp.onmicrosoft.com -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 test@corp.onmicrosoft.com -p Welcome2022!
python stormspotter\stormcollector\sscollector.pyz cli
# This will generate a .zip file to upload in the frontend (127.0.0.1:9091)

# You need to use the Az PowerShell and Azure AD modules:
$passwd = ConvertTo-SecureString "Welcome2022!" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("test@corp.onmicrosoft.com", $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 n.name
## All Azure Applications
MATCH (n:AZApp) return n.objectid
## All Azure Devices
MATCH (n:AZDevice) return n.name
## All Azure Groups
MATCH (n:AZGroup) return n.name
## All Azure Key Vaults
MATCH (n:AZKeyVault) return n.name
## All Azure Resource Groups
MATCH (n:AZResourceGroup) return n.name
## All Azure Service Principals
MATCH (n:AZServicePrincipal) return n.objectid
## All Azure Virtual Machines
MATCH (n:AZVM) return n.name
## 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 https://github.com/nccgroup/azucar.git
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 user@company.com

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

Connect-AzAccount
ipmo C:\Path\To\Powerzure.psd1
Get-AzureTarget

# 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 test@contoso.com -Resource Win10VMTest

# Administrator
$ Create-Backdoor, Execute-Backdoor
Apoya a HackTricks

Last updated