Aller au contenu

Rôles entra, abus de PIM & élévation de privilèges

Dans la sécurité du cloud d’entreprise, obtenir un accès initial sur le compte d’un collaborateur standard ne représente que la phase préliminaire d’une intrusion. Pour asseoir une domination totale sur le tenant, accéder sans restriction aux portails d’eDiscovery, neutraliser les politiques de sécurité ou opérer une exfiltration massive, les cybercriminels recherchent activement l’élévation de privilèges vers les échelons d’administration suprêmes de Microsoft Entra ID.

L’élévation de privilèges sous Microsoft Entra ID se distingue radicalement des attaques classiques sous Active Directory Domain Services (AD DS). Dans Entra ID, il n’existe ni délégation Kerberos non contrainte ni usurpation SAM-Account-Name. L’élévation cloud exploite des relations indirectes entre rôles applicatifs et rôles d’annuaire (tels que les administrateurs d’applications injectant des secrets sur des Service Principals administrateurs généraux), des groupes assignables à des rôles mal configurés et le détournement des flux d’activation de Privileged Identity Management (PIM).

Ce guide détaille la hiérarchie des rôles de Tier 0, analyse les vecteurs concrets d’élévation, décode la télémétrie des activations PIM dans les journaux d’audit et fournit des requêtes de détection KQL ainsi que des scripts PowerShell d’audit.


1. Hiérarchie des rôles d’annuaire entra ID & Tier 0

Section intitulée « 1. Hiérarchie des rôles d’annuaire entra ID & Tier 0 »

Entra ID intègre plus de 80 rôles d’annuaire prédéfinis. Pour l’investigation forensique et l’architecture de sécurité, ces rôles se structurent selon un modèle de plan de contrôle à trois niveaux :

graph TD
subgraph "Tier 0 : Plan de Contrôle du Tenant"
T0_GA[Global Administrator<br/>Contrôle Total et Illimité du Tenant]
T0_PRA[Privileged Role Administrator<br/>Gestion et Attribution de Tous les Rôles]
T0_PAA[Privileged Authentication Administrator<br/>Réinitialisation Mots de Passe / MFA de Tous les Admins]
T0_HIA[Hybrid Identity Administrator<br/>Contrôle du Pipeline Entra Connect / Synchronisation]
end
subgraph "Tier 1 : Plan de Contrôle des Services SaaS"
T1_EX[Exchange Administrator<br/>Boîtes Mail du Tenant & Flux de Messagerie]
T1_SP[SharePoint Administrator<br/>Ensemble des Sites SharePoint & OneDrive]
T1_SEC[Security Administrator<br/>Defender, Purview, Règles d'Accès Conditionnel]
T1_INT[Intune Administrator<br/>Gestion et Effacement des Postes de Travail]
end
subgraph "Tier 2 : Opérateurs d'Identité & d'Applications"
T2_APP[Application Administrator<br/>Gestion des Inscriptions d'Apps & Secrets]
T2_CAPP[Cloud Application Administrator<br/>Gestion des Apps Cloud & Secrets]
T2_USR[User Administrator<br/>Gestion des Comptes Non-Administrateurs]
T2_HELP[Helpdesk Administrator<br/>Réinitialisation des Comptes Standards]
end
T2_APP -.->|Vecteur d'Élévation Indirecte| T0_GA
T2_USR -.->|Vecteur Groupes Assignables| T0_PRA
T1_SEC -.->|Contournement Accès Conditionnel| T0_GA
  • Global administrator : autorité absolue sur le tenant. Contourne toutes les frontières RBAC, peut s’octroyer les privilèges racine sur les souscriptions Azure et accéder à l’ensemble des services.
  • Privileged role administrator : peut attribuer, modifier ou révoquer n’importe quel rôle d’annuaire (actif ou éligible) pour tous les utilisateurs et Service Principals.
  • Privileged authentication administrator : peut réinitialiser les mots de passe, purger les méthodes MFA et émettre des pass temporaires (TAP) pour absolument tous les comptes du tenant, y compris les administrateurs généraux.

2.1 le pont de l’application administrator vers le global admin

Section intitulée « 2.1 le pont de l’application administrator vers le global admin »

Le vecteur d’élévation indirecte le plus répandu sous Entra ID survient lorsqu’un attaquant compromet un compte disposant du rôle Application Administrator ou Cloud Application Administrator :

sequenceDiagram
autonumber
participant Attacker as Attaquant (Rôle App Admin)
participant Entra as Annuaire Entra ID
participant TargetSP as Service Principal Préexistant (Doté du rôle Global Admin)
participant Graph as API Microsoft Graph
Note over Attacker: L'attaquant compromet un compte ayant le rôle 'Application Administrator'
Attacker->>Entra: Énumère les applications d'entreprise détenant des rôles d'annuaire
Note over Entra: Découvre que le SP 'Automation-Pipeline' détient le rôle 'Global Administrator' !
Attacker->>Entra: POST /applications/{id}/addPassword (Injection d'un secret client)
Entra-->>Attacker: Renvoie un client_secret valide pour 'Automation-Pipeline'
Attacker->>Entra: Authentification via OAuth Client Credentials
Entra-->>Attacker: Délivrance d'un jeton applicatif doté des droits Global Admin !
Attacker->>Graph: Contrôle absolu du tenant via l'API Graph !

Les administrateurs d’applications peuvent gérer les secrets et certificats de toutes les applications d’entreprise et Service Principals de l’annuaire. Si des administrateurs ont précédemment octroyé un rôle d’annuaire (Global Admin, Exchange Admin) à un Service Principal (ex. script de synchronisation ou outil tiers), tout Application Administrator peut y injecter un secret et usurper immédiatement ses prérogatives de Tier 0.

2.2 les groupes de sécurité assignables à des rôles

Section intitulée « 2.2 les groupes de sécurité assignables à des rôles »

Entra ID permet d’assigner des rôles d’annuaire directement à des groupes de sécurité (isRoleAssignable : true). Pour prévenir les élévations illégitimes, seuls les Global Administrators et Privileged Role Administrators peuvent en créer ou en modifier les membres.

Cependant, des failles d’élévation apparaissent lorsque :

  1. Délégation abusive de propriété : un administrateur délègue la propriété du groupe à un compte standard ou à un Service Principal non surveillé. Le propriétaire peut alors y adjoindre n’importe quel compte, lui conférant le rôle d’annuaire attaché au groupe.
  2. PIM pour groupes : abus des éligibilités PIM sur les groupes d’administration pour élever un compte tiers.

3. Détournement des activations privileged identity management (PIM)

Section intitulée « 3. Détournement des activations privileged identity management (PIM) »

Microsoft Entra Privileged Identity Management (PIM) applique le principe du Just-In-Time (JIT) : les administrateurs ne détiennent pas de rôles permanents mais sont positionnés en statut Éligible et doivent activer leur rôle pour une durée délimitée.

graph TD
ATTACKER[Compte Utilisateur Compromis par l'Attaquant] --> PIM_CHECK{Le Compte est-il Éligible PIM ?}
PIM_CHECK -->|Non| RECON[Maintien en Droits Utilisateur Standard]
PIM_CHECK -->|Oui : Éligible Global Admin| ACT_REQ[Soumission de Requête d'Activation<br/>POST /roleAssignmentScheduleRequests]
ACT_REQ --> POL_CHECK{Configuration de la Politique PIM ?}
POL_CHECK -->|Approbation Requise| WAIT_APP[En Attente d'Approbation<br/>L'attaquant soumet un faux ticket INC-94812]
POL_CHECK -->|Sans Approbation / Justification Seule| INSTANT[Activation Immédiate du Rôle !<br/>Statut : Actif pour 8 Heures]
INSTANT --> FULL_TENANT[Prise de Contrôle Absolue du Tenant Microsoft 365]
  1. Éligibilités sans approbation obligatoire : de nombreuses entreprises configurent l’éligibilité PIM sans circuit de validation tiers, n’imposant qu’une simple justification textuelle. L’attaquant saisit un faux numéro de ticket ("Urgence Incident DSI - INC-88412") et obtient les privilèges Global Admin en 30 secondes.
  2. Compromission des approbateurs : si une approbation est requise, les attaquants compromettent le compte de l’approbateur désigné, valident leur propre demande d’élévation et finalisent la prise de contrôle.
  3. Altération des politiques PIM : un attaquant disposant temporairement du rôle Privileged Role Administrator modifie les paramètres PIM (Update role setting in PIM), étendant la durée d’activation maximale à 24 heures et désactivant l’exigence d’approbation.

4. Télémétrie forensique dans les audit logs entra ID

Section intitulée « 4. Télémétrie forensique dans les audit logs entra ID »

Toutes les attributions de rôles, activations PIM et modifications de groupes assignables génèrent des événements sous les catégories RoleManagement et GroupManagement :

OpérationCatégorieSignification en Réponse à Incident
Add member to roleRoleManagementAttribution de rôle actif permanent. Élévation immédiate vers le rôle ciblé.
Add eligible member to roleRoleManagementAttribution d’éligibilité PIM permanente. Le compte peut activer le rôle à sa guise.
Add role assignment schedule requestRoleManagementActivation effective sous PIM. L’utilisateur active son rôle éligible pour un créneau programmé.
Add member to groupGroupManagementAlerte critique si le groupe ciblé possède isRoleAssignable : true.
Update role setting in PIMRoleManagementAltération des règles de sécurité PIM (suppression de l’approbation).

L’enregistrement JSON extrait de la table AuditLogs présente la structure suivante :

{
"activityDateTime": "2026-03-24T16:45:00Z",
"activityDisplayName": "Add role assignment schedule request",
"category": "RoleManagement",
"result": "success",
"initiatedBy": {
"user": {
"userPrincipalName": "victim-admin@target.com",
"ipAddress": "198.51.100.55"
}
},
"targetResources": [
{
"displayName": "Global Administrator",
"type": "RoleDefinition",
"modifiedProperties": [
{
"displayName": "Role.DisplayName",
"newValue": "\"Global Administrator\""
},
{
"displayName": "Assignment.Type",
"newValue": "\"Active\""
},
{
"displayName": "Assignment.Duration",
"newValue": "\"PT8H\""
},
{
"displayName": "Assignment.Justification",
"newValue": "\"Intervention urgente ticket INC-89124\""
}
]
}
]
}

Points clés pour l’investigation :

  • initiatedBy.user.ipAddress : adresse IP à corréler avec les plages d’entreprise pour déterminer si l’activation provient de l’infrastructure de l’attaquant.
  • modifiedProperties[Assignment.Justification] : examen de la légitimité du ticket et de la justification.
  • modifiedProperties[Role.DisplayName] : rôle d’annuaire débloqué.

5.1 détection des attributions de rôles permanents de Tier 0

Section intitulée « 5.1 détection des attributions de rôles permanents de Tier 0 »

Repérer l’attribution directe de rôles d’administration sans passer par PIM :

let CriticalRoles = dynamic([
"Global Administrator",
"Privileged Role Administrator",
"Privileged Authentication Administrator",
"Security Administrator",
"Exchange Administrator"
]);
AuditLogs
| where TimeGenerated >= ago(30d)
| where Category == "RoleManagement"
| where OperationName in ("Add member to role", "Add member to role completed (PIM activation)")
| extend RoleName = tostring(TargetResources[0].displayName)
| extend AssignedTo = tostring(TargetResources[2].displayName)
| extend AssignedToUPN = tostring(TargetResources[2].userPrincipalName)
| extend Initiator = tostring(InitiatedBy.user.userPrincipalName)
| extend InitiatorIP = tostring(InitiatedBy.user.ipAddress)
| where RoleName in (CriticalRoles)
| project TimeGenerated, OperationName, RoleName, AssignedTo, AssignedToUPN, Initiator, InitiatorIP
| sort by TimeGenerated desc

Identifier les activations PIM intervenues en dehors des heures ouvrées ou depuis des adresses IP atypiques :

AuditLogs
| where TimeGenerated >= ago(14d)
| where Category == "RoleManagement"
| where OperationName == "Add role assignment schedule request"
| extend InitiatorUPN = tostring(InitiatedBy.user.userPrincipalName),
InitiatorIP = tostring(InitiatedBy.user.ipAddress)
| extend TargetRole = tostring(TargetResources[0].displayName)
| extend ModifiedProps = TargetResources[0].modifiedProperties
| mv-expand ModifiedProps
| where ModifiedProps.displayName == "Assignment.Justification"
| extend Justification = tostring(ModifiedProps.newValue)
| project TimeGenerated, OperationName, TargetRole, InitiatorUPN, InitiatorIP, Justification
| sort by TimeGenerated desc

5.3 détection de secrets injectés sur des applications détenant des rôles

Section intitulée « 5.3 détection de secrets injectés sur des applications détenant des rôles »

Identifier les applications détenant des rôles d’annuaire qui reçoivent un nouveau secret :

let RoleAssignedApps = AuditLogs
| where TimeGenerated >= ago(90d)
| where OperationName == "Add member to role"
| extend TargetAppId = tostring(TargetResources[1].id)
| where isnotempty(TargetAppId)
| distinct TargetAppId;
AuditLogs
| where TimeGenerated >= ago(30d)
| where OperationName in ("Update application - Certificates and secrets management", "Add service principal credentials")
| extend AppId = tostring(TargetResources[0].id)
| where AppId in (RoleAssignedApps)
| project TimeGenerated, OperationName, TargetApp=tostring(TargetResources[0].displayName),
AppId, InitiatedBy=tostring(InitiatedBy.user.userPrincipalName)
| sort by TimeGenerated desc

6. Playbook forensique d’inventaire et révocation PowerShell

Section intitulée « 6. Playbook forensique d’inventaire et révocation PowerShell »

6.1 inventaire des titulaires de rôles de Tier 0 (actifs et éligibles)

Section intitulée « 6.1 inventaire des titulaires de rôles de Tier 0 (actifs et éligibles) »

Lister tous les membres actifs et éligibles des rôles d’administration majeurs :

Fenêtre de terminal
# Prérequis : Module Microsoft.Graph.Identity.Governance
# Connect-MgGraph -Scopes "RoleManagement.Read.Directory","Directory.Read.All"
Write-Host "=====================================================" -ForegroundColor Cyan
Write-Host " AUDIT DES ATTRIBUTIONS DE RÔLES D'ANNUAIRE & PIM " -ForegroundColor Cyan
Write-Host "=====================================================" -ForegroundColor Cyan
# 1. Attributions Actives Permanentes
Write-Host "`n[*] Examen des attributions de rôles actives..." -ForegroundColor Yellow
$activeAssignments = Get-MgRoleManagementDirectoryRoleAssignmentScheduleInstance -ExpandProperty "RoleDefinition,Principal"
$tier0Roles = @("Global Administrator", "Privileged Role Administrator", "Privileged Authentication Administrator")
$activeReport = @()
foreach ($assign in $activeAssignments) {
if ($tier0Roles -contains $assign.RoleDefinition.DisplayName) {
$activeReport += [PSCustomObject]@{
RoleName = $assign.RoleDefinition.DisplayName
PrincipalName = $assign.Principal.AdditionalProperties.userPrincipalName
PrincipalType = $assign.Principal.AdditionalProperties["@odata.type"]
AssignmentType= $assign.AssignmentType
StartDateTime = $assign.StartDateTime
EndDateTime = $assign.EndDateTime
}
}
}
$activeReport | Format-Table -AutoSize
# 2. Éligibilités PIM
Write-Host "`n[*] Examen des éligibilités PIM..." -ForegroundColor Yellow
$eligibleAssignments = Get-MgRoleManagementDirectoryRoleEligibilityScheduleInstance -ExpandProperty "RoleDefinition,Principal"
$eligibleReport = @()
foreach ($elig in $eligibleAssignments) {
if ($tier0Roles -contains $elig.RoleDefinition.DisplayName) {
$eligibleReport += [PSCustomObject]@{
RoleName = $elig.RoleDefinition.DisplayName
PrincipalName = $elig.Principal.AdditionalProperties.userPrincipalName
MemberType = $elig.MemberType
StartDateTime = $elig.StartDateTime
EndDateTime = $elig.EndDateTime
}
}
}
$eligibleReport | Format-Table -AutoSize

6.2 révocation d’urgence d’un rôle compromis

Section intitulée « 6.2 révocation d’urgence d’un rôle compromis »
Fenêtre de terminal
# Retirer immédiatement une attribution de rôle d'annuaire actif :
$compromisedUPN = "admin-compromis@target.com"
$roleName = "Global Administrator"
$user = Get-MgUser -Filter "userPrincipalName eq '$compromisedUPN'"
$role = Get-MgRoleManagementDirectoryRoleDefinition -Filter "displayName eq '$roleName'"
$assignment = Get-MgRoleManagementDirectoryRoleAssignment -Filter "principalId eq '$($user.Id)' and roleDefinitionId eq '$($role.Id)'"
if ($assignment) {
Remove-MgRoleManagementDirectoryRoleAssignment -UnifiedRoleAssignmentId $assignment.Id
Write-Host "[+] Attribution '$roleName' révoquée avec succès pour $compromisedUPN" -ForegroundColor Green
}