Az - Entra ID (AzureAD) & Azure IAM
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Informazioni di base
Azure Active Directory (Azure AD) funge da servizio basato su cloud di Microsoft per la gestione dellâidentitĂ e degli accessi. Ă fondamentale per consentire ai dipendenti di accedere e ottenere risorse, sia allâinterno che al di fuori dellâorganizzazione, comprendendo Microsoft 365, il portale Azure e una moltitudine di altre applicazioni SaaS. Il design di Azure AD si concentra sulla fornitura di servizi essenziali per lâidentitĂ , includendo in modo prominente autenticazione, autorizzazione e gestione degli utenti.
Le caratteristiche chiave di Azure AD comprendono autenticazione a piĂš fattori e accesso condizionale, insieme a unâintegrazione fluida con altri servizi di sicurezza Microsoft. Queste funzionalitĂ elevano significativamente la sicurezza delle identitĂ degli utenti e consentono alle organizzazioni di implementare e far rispettare efficacemente le loro politiche di accesso. Come componente fondamentale dellâecosistema dei servizi cloud di Microsoft, Azure AD è cruciale per la gestione basata su cloud delle identitĂ degli utenti.
Enumerazione
Connessione
az login #This will open the browser (if not use --use-device-code)
az login -u <username> -p <password> #Specify user and password
az login --identity #Use the current machine managed identity (metadata)
az login --identity -u /subscriptions/<subscriptionId>/resourcegroups/myRG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myID #Login with user managed identity
# Login as service principal
##Â With password
az login --service-principal -u <application ID> -p VerySecret --tenant contoso.onmicrosoft.com # Tenant can also be the tenant UUID
##Â With cert
az login --service-principal -u <application ID> -p ~/mycertfile.pem --tenant contoso.onmicrosoft.com
# Request access token (ARM)
az account get-access-token
# Request access token for different resource. Supported tokens: aad-graph, arm, batch, data-lake, media, ms-graph, oss-rdbms
az account get-access-token --resource-type aad-graph
# If you want to configure some defaults
az configure
# Get user logged-in already
az ad signed-in-user show
# Help
az find "vm" # Find vm commands
az vm -h # Get subdomains
az ad user list --query-examples # Get examples
Quando effettui il login tramite CLI in Azure con qualsiasi programma, stai utilizzando un Azure Application di un tenant che appartiene a Microsoft. Queste Applicazioni, come quelle che puoi creare nel tuo account, hanno un client id. Non sarai in grado di vederle tutte nelle liste delle applicazioni consentite che puoi vedere nella console, ma sono consentite per impostazione predefinita.
Ad esempio, uno script powershell che autentica utilizza unâapp con client id 1950a258-227b-4e31-a9cf-717495945fc2. Anche se lâapp non appare nella console, un sysadmin potrebbe bloccare quellâapplicazione in modo che gli utenti non possano accedere utilizzando strumenti che si connettono tramite quellâApp.
Tuttavia, ci sono altri client-id di applicazioni che ti permetteranno di connetterti ad Azure:
# The important part is the ClientId, which identifies the application to login inside Azure
$token = Invoke-Authorize -Credential $credential `
-ClientId '1dfb5f98-f363-4b0f-b63a-8d20ada1e62d' `
-Scope 'Files.Read.All openid profile Sites.Read.All User.Read email' `
-Redirect_Uri "https://graphtryit-staging.azurewebsites.net/" `
-Verbose -Debug `
-InformationAction Continue
$token = Invoke-Authorize -Credential $credential `
-ClientId '65611c08-af8c-46fc-ad20-1888eb1b70d9' `
-Scope 'openid profile Sites.Read.All User.Read email' `
-Redirect_Uri "chrome-extension://imjekgehfljppdblckcmjggcoboemlah" `
-Verbose -Debug `
-InformationAction Continue
$token = Invoke-Authorize -Credential $credential `
-ClientId 'd3ce4cf8-6810-442d-b42e-375e14710095' `
-Scope 'openid' `
-Redirect_Uri "https://graphexplorer.azurewebsites.net/" `
-Verbose -Debug `
-InformationAction Continue
Inquilini
# List tenants
az account tenant list
Utenti
Per ulteriori informazioni sugli utenti di Entra ID, controlla:
# Enumerate users
az ad user list --output table
az ad user list --query "[].userPrincipalName"
# Get info of 1 user
az ad user show --id "test@corp.onmicrosoft.com"
# Search "admin" users
az ad user list --query "[].displayName" | findstr /i "admin"
az ad user list --query "[?contains(displayName,'admin')].displayName"
# Search attributes containing the word "password"
az ad user list | findstr /i "password" | findstr /v "null,"
# All users from Entra ID
az ad user list --query "[].{osi:onPremisesSecurityIdentifier,upn:userPrincipalName}[?osi==null]"
az ad user list --query "[?onPremisesSecurityIdentifier==null].displayName"
# All users synced from on-prem
az ad user list --query "[].{osi:onPremisesSecurityIdentifier,upn:userPrincipalName}[?osi!=null]"
az ad user list --query "[?onPremisesSecurityIdentifier!=null].displayName"
# Get groups where the user is a member
az ad user get-member-groups --id <email>
# Get roles assigned to the user in Azure (NOT in Entra ID)
az role assignment list --include-inherited --include-groups --include-classic-administrators true --assignee <email>
# Get ALL roles assigned in Azure in the current subscription (NOT in Entra ID)
az role assignment list --include-inherited --include-groups --include-classic-administrators true --all
# Get EntraID roles assigned to a user
## Get Token
export TOKEN=$(az account get-access-token --resource https://graph.microsoft.com/ --query accessToken -o tsv)
## Get users
curl -X GET "https://graph.microsoft.com/v1.0/users" \
-H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" | jq
## Get EntraID roles assigned to an user
curl -X GET "https://graph.microsoft.com/beta/rolemanagement/directory/transitiveRoleAssignments?\$count=true&\$filter=principalId%20eq%20'86b10631-ff01-4e73-a031-29e505565caa'" \
-H "Authorization: Bearer $TOKEN" \
-H "ConsistencyLevel: eventual" \
-H "Content-Type: application/json" | jq
## Get role details
curl -X GET "https://graph.microsoft.com/beta/roleManagement/directory/roleDefinitions/cf1c38e5-3621-4004-a7cb-879624dced7c" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" | jq
Cambiare la password dellâutente
$password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText âForce
(Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password âVerbose
MFA & Conditional Access Policies
Ă fortemente consigliato aggiungere MFA a ogni utente, tuttavia, alcune aziende potrebbero non impostarlo o potrebbero impostarlo con un Accesso Condizionale: Lâutente sarĂ richiesto MFA se accede da una posizione specifica, browser o alcuna condizione. Queste politiche, se non configurate correttamente, potrebbero essere soggette a bypass. Controlla:
Az - Conditional Access Policies & MFA Bypass
Groups
Per ulteriori informazioni sui gruppi di Entra ID, controlla:
# Enumerate groups
az ad group list
az ad group list --query "[].[displayName]" -o table
# Get info of 1 group
az ad group show --group <group>
# Get "admin" groups
az ad group list --query "[].displayName" | findstr /i "admin"
az ad group list --query "[?contains(displayName,'admin')].displayName"
# All groups from Entra ID
az ad group list --query "[].{osi:onPremisesSecurityIdentifier,displayName:displayName,description:description}[?osi==null]"
az ad group list --query "[?onPremisesSecurityIdentifier==null].displayName"
# All groups synced from on-prem
az ad group list --query "[].{osi:onPremisesSecurityIdentifier,displayName:displayName,description:description}[?osi!=null]"
az ad group list --query "[?onPremisesSecurityIdentifier!=null].displayName"
# Get members of group
az ad group member list --group <group> --query "[].userPrincipalName" -o table
# Check if member of group
az ad group member check --group "VM Admins" --member-id <id>
# Get which groups a group is member of
az ad group get-member-groups -g "VM Admins"
# Get roles assigned to the group in Azure (NOT in Entra ID)
az role assignment list --include-groups --include-classic-administrators true --assignee <group-id>
# To get Entra ID roles assigned check how it's done with users and use a group ID
Aggiungi utente al gruppo
I proprietari del gruppo possono aggiungere nuovi utenti al gruppo
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
Warning
I gruppi possono essere dinamici, il che significa fondamentalmente che se un utente soddisfa determinate condizioni, verrà aggiunto a un gruppo. Naturalmente, se le condizioni si basano su attributi che un utente può controllare, potrebbe abusare di questa funzionalità per entrare in altri gruppi.
Controlla come abusare dei gruppi dinamici nella pagina seguente:
Service Principals
Per ulteriori informazioni sui service principals di Entra ID, controlla:
# Get Service Principals
az ad sp list --all
az ad sp list --all --query "[].[displayName,appId]" -o table
# Get details of one SP
az ad sp show --id 00000000-0000-0000-0000-000000000000
# Search SP by string
az ad sp list --all --query "[?contains(displayName,'app')].displayName"
# Get owner of service principal
az ad sp owner list --id <id> --query "[].[displayName]" -o table
# Get service principals owned by the current user
az ad sp list --show-mine
# Get SPs with generated secret or certificate
az ad sp list --query '[?length(keyCredentials) > `0` || length(passwordCredentials) > `0`].[displayName, appId, keyCredentials, passwordCredentials]' -o json
Warning
Il proprietario di un Service Principal può cambiare la sua password.
Elenca e prova ad aggiungere un client secret su ogni Enterprise App
```bash # Just call Add-AzADAppSecret Function Add-AzADAppSecret { <# .SYNOPSIS Add client secret to the applications..PARAMETER GraphToken Pass the Graph API Token
.EXAMPLE PS C:> Add-AzADAppSecret -GraphToken âeyJ0eX..â
.LINK https://docs.microsoft.com/en-us/graph/api/application-list?view=graph-rest-1.0&tabs=http https://docs.microsoft.com/en-us/graph/api/application-addpassword?view=graph-rest-1.0&tabs=http #>
[CmdletBinding()] param( [Parameter(Mandatory=$True)] [String] $GraphToken = $null )
$AppList = $null $AppPassword = $null
List All the Applications
$Params = @{ âURIâ = âhttps://graph.microsoft.com/v1.0/applicationsâ âMethodâ = âGETâ âHeadersâ = @{ âContent-Typeâ = âapplication/jsonâ âAuthorizationâ = âBearer $GraphTokenâ } }
try { $AppList = Invoke-RestMethod @Params -UseBasicParsing } catch { }
Add Password in the Application
if($AppList -ne $null) { [System.Collections.ArrayList]$Details = @()
foreach($App in $AppList.value) { $ID = $App.ID $psobj = New-Object PSObject
$Params = @{ âURIâ = âhttps://graph.microsoft.com/v1.0/applications/$ID/addPasswordâ âMethodâ = âPOSTâ âHeadersâ = @{ âContent-Typeâ = âapplication/jsonâ âAuthorizationâ = âBearer $GraphTokenâ } }
$Body = @{ âpasswordCredentialâ= @{ âdisplayNameâ = âPasswordâ } }
try { $AppPassword = Invoke-RestMethod @Params -UseBasicParsing -Body ($Body | ConvertTo-Json) Add-Member -InputObject $psobj -NotePropertyName âObject IDâ -NotePropertyValue $ID Add-Member -InputObject $psobj -NotePropertyName âApp IDâ -NotePropertyValue $App.appId Add-Member -InputObject $psobj -NotePropertyName âApp Nameâ -NotePropertyValue $App.displayName Add-Member -InputObject $psobj -NotePropertyName âKey IDâ -NotePropertyValue $AppPassword.keyId Add-Member -InputObject $psobj -NotePropertyName âSecretâ -NotePropertyValue $AppPassword.secretText $Details.Add($psobj) | Out-Null } catch { Write-Output âFailed to add new client secret to â$($App.displayName)â Application.â } } if($Details -ne $null) { Write-Output ââ Write-Output âClient secret added to : â Write-Output $Details | fl * } } else { Write-Output âFailed to Enumerate the Applications.â } }
</details>
### Applicazioni
Per ulteriori informazioni sulle Applicazioni controlla:
<a class="content_ref" href="../az-basic-information/index.html"><span class="content_ref_label">Az - Basic Information</span></a>
Quando un'App viene generata, vengono date 2 tipologie di permessi:
- **Permessi** dati al **Service Principal**
- **Permessi** che l'**app** può avere e utilizzare per **conto dell'utente**.
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List Apps
az ad app list
az ad app list --query "[].[displayName,appId]" -o table
# Get info of 1 App
az ad app show --id 00000000-0000-0000-0000-000000000000
# Search App by string
az ad app list --query "[?contains(displayName,'app')].displayName"
# Get the owner of an application
az ad app owner list --id <id> --query "[].[displayName]" -o table
# Get SPs owned by current user
az ad app list --show-mine
# Get apps with generated secret or certificate
az ad app list --query '[?length(keyCredentials) > `0` || length(passwordCredentials) > `0`].[displayName, appId, keyCredentials, passwordCredentials]' -o json
# Get Global Administrators (full access over apps)
az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/1b2256f9-46c1-4fc2-a125-5b2f51bb43b7/members"
# Get Application Administrators (full access over apps)
az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/1e92c3b7-2363-4826-93a6-7f7a5b53e7f9/members"
# Get Cloud Applications Administrators (full access over apps)
az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/0d601d27-7b9c-476f-8134-8e7cd6744f02/members"
{{#endtab }}
{{#tab name=âAzâ }}
# Get Apps
Get-AzADApplication
# Get details of one App
Get-AzADApplication -ObjectId <id>
# Get App searching by string
Get-AzADApplication | ?{$_.DisplayName -match "app"}
# Get Apps with password
Get-AzADAppCredential
{{#endtab }}
{{#tab name=âMS Graphâ }}
# List Applications using Microsoft Graph PowerShell
Get-MgApplication -All
# Get application details
Get-MgApplication -ApplicationId 7861f72f-ad49-4f8c-96a9-19e6950cffe1 | Format-List *
# Search App by display name
Get-MgApplication -Filter "startswith(displayName, 'app')" | Select-Object DisplayName
# Get owner of an application
Get-MgApplicationOwner -ApplicationId <ApplicationId>
# List available commands in Microsoft Graph PowerShell
Get-Command -Module Microsoft.Graph.Applications
{{#endtab }}
{{#tab name=âAzure ADâ }}
# List all registered applications
Get-AzureADApplication -All $true
# Get details of an application
Get-AzureADApplication -ObjectId <id> | fl *
# List all the apps with an application password
Get-AzureADApplication -All $true | %{if(Get-AzureADApplicationPasswordCredential -ObjectID $_.ObjectID){$_}}
# Get owner of an application
Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
{{#endtab }} {{#endtabs }}
Warning
Unâapp con il permesso
AppRoleAssignment.ReadWritepuò escalare a Global Admin concedendosi il ruolo.
Per ulteriori informazioni controlla questo.
Note
Una stringa segreta che lâapplicazione utilizza per dimostrare la propria identitĂ quando richiede un token è la password dellâapplicazione.
Quindi, se trovi questa password puoi accedere come service principal allâinterno del tenant.
Nota che questa password è visibile solo quando viene generata (puoi cambiarla ma non puoi ottenerla di nuovo).
Lâowner dellâapplicazione può aggiungere una password ad essa (cosĂŹ può impersonarla).
Gli accessi come questi service principals non sono contrassegnati come rischiosi e non avranno MFA.
Ă possibile trovare un elenco di App ID comunemente usati che appartengono a Microsoft in https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications
Managed Identities
Per ulteriori informazioni su Managed Identities controlla:
# List all manged identities
az identity list --output table
# With the principal ID you can continue the enumeration in service principals
Ruoli di Azure
Per ulteriori informazioni sui ruoli di Azure, controlla:
# Get roles
az role definition list
# Get all assigned roles
az role assignment list --all --query "[].roleDefinitionName"
az role assignment list --all | jq '.[] | .roleDefinitionName,.scope'
# Get info of 1 role
az role definition list --name "AzureML Registry User"
# Get only custom roles
az role definition list --custom-role-only
# Get only roles assigned to the resource group indicated
az role definition list --resource-group <resource_group>
# Get only roles assigned to the indicated scope
az role definition list --scope <scope>
# Get all the principals a role is assigned to
az role assignment list --all --query "[].{principalName:principalName,principalType:principalType,scope:scope,roleDefinitionName:roleDefinitionName}[?roleDefinitionName=='<ROLE_NAME>']"
# Get all the roles assigned to a user
az role assignment list --assignee "<email>" --all --output table
# Get all the roles assigned to a user by filtering
az role assignment list --all --query "[?principalName=='admin@organizationadmin.onmicrosoft.com']" --output table
# Get deny assignments
az rest --method GET --uri "https://management.azure.com/{scope}/providers/Microsoft.Authorization/denyAssignments?api-version=2022-04-01"
## Example scope of subscription
az rest --method GET --uri "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/providers/Microsoft.Authorization/denyAssignments?api-version=2022-04-01"
Ruoli di Entra ID
Per ulteriori informazioni sui ruoli di Azure, controlla:
# List template Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoleTemplates"
# List enabled built-in Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles"
# List all Entra ID roles with their permissions (including custom roles)
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions"
# List only custom Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions" | jq '.value[] | select(.isBuiltIn == false)'
# List all assigned Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments"
# List members of a Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles/<role-id>/members"
# List Entra ID roles assigned to a user
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/users/<user-id>/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
# List Entra ID roles assigned to a group
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/groups/$GROUP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
# List Entra ID roles assigned to a service principal
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$SP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
Dispositivi
# If you know how to do this send a PR!
Warning
Se un dispositivo (VM) è collegato ad AzureAD, gli utenti di AzureAD potranno accedere.
Inoltre, se lâutente connesso è Proprietario del dispositivo, sarĂ amministratore locale.
UnitĂ Amministrative
Per ulteriori informazioni sulle unitĂ amministrative, controlla:
# List all administrative units
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits"
# Get AU info
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53"
# Get members
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53/members"
# Get principals with roles over the AU
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53/scopedRoleMembers"
Escalation dei privilegi di Entra ID
Escalation dei privilegi di Azure
Az - Azure IAM Privesc (Authorization)
Meccanismi difensivi
Gestione delle identitĂ privilegiate (PIM)
La Gestione delle identitĂ privilegiate (PIM) in Azure aiuta a prevenire lâassegnazione eccessiva di privilegi agli utenti in modo non necessario.
Una delle principali caratteristiche fornite da PIM è che consente di non assegnare ruoli a soggetti che sono costantemente attivi, ma di renderli idonei per un periodo di tempo (ad es. 6 mesi). Poi, ogni volta che lâutente desidera attivare quel ruolo, deve richiederlo indicando il tempo di cui ha bisogno per il privilegio (ad es. 3 ore). Quindi un amministratore deve approvare la richiesta.
Nota che lâutente sarĂ anche in grado di chiedere di estendere il tempo.
Inoltre, PIM invia email ogni volta che un ruolo privilegiato viene assegnato a qualcuno.
.png)
Quando PIM è abilitato, è possibile configurare ciascun ruolo con determinati requisiti come:
- Durata massima (ore) di attivazione
- Richiedere MFA allâattivazione
- Richiedere contesto di autenticazione di Accesso Condizionale
- Richiedere giustificazione allâattivazione
- Richiedere informazioni sul ticket allâattivazione
- Richiedere approvazione per attivare
- Tempo massimo per far scadere le assegnazioni idonee
- Molte altre configurazioni su quando e a chi inviare notifiche quando si verificano determinate azioni con quel ruolo
Politiche di Accesso Condizionale
Controlla:
Az - Conditional Access Policies & MFA Bypass
Protezione dellâidentitĂ di Entra
La Protezione dellâidentitĂ di Entra è un servizio di sicurezza che consente di rilevare quando un utente o un accesso è troppo rischioso per essere accettato, consentendo di bloccare lâutente o il tentativo di accesso.
Consente allâamministratore di configurarlo per bloccare i tentativi quando il rischio è âBasso e superioreâ, âMedio e superioreâ o âAltoâ. Tuttavia, per impostazione predefinita è completamente disabilitato:
.png)
Tip
Oggigiorno è consigliato aggiungere queste restrizioni tramite politiche di Accesso Condizionale dove è possibile configurare le stesse opzioni.
Protezione della password di Entra
La Protezione della password di Entra (https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade) è una funzionalitĂ di sicurezza che aiuta a prevenire lâabuso di password deboli bloccando gli account quando si verificano diversi tentativi di accesso non riusciti.
Consente anche di vietare un elenco di password personalizzato che è necessario fornire.
Può essere applicata sia a livello cloud che su Active Directory on-premises.
La modalità predefinita è Audit:
.png)
Riferimenti
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
HackTricks Cloud

