Manipulation des méthodes d'authentification comme persistance
Lorsqu’un cybercriminel compromet une identité cloud d’entreprise, il sait pertinemment que son vecteur d’accès initial (mot de passe dérobé, cookie de session intercepté par AiTM ou jeton temporaire) finira par expirer ou être révoqué par l’équipe de sécurité. Pour s’assurer une persistance pérenne et invulnérable aux réinitialisations de mot de passe, l’attaquant ancre un second facteur d’authentification complice directement au sein des méthodes d’authentification Microsoft Entra ID du compte victime.
Une fois cette méthode MFA complice enregistrée, l’attaquant découple totalement sa persistance de l’équipement physique du collaborateur légitime. Même si la victime renouvelle son mot de passe, l’adversaire valide ses propres invites MFA, se maintient dans le tenant ou déclenche la réinitialisation de mot de passe en libre-service (SSPR) pour reprendre unilatéralement le contrôle du compte. En outre, si l’attaquant dispose de rôles d’administration, il peut émettre des Temporary Access Passes (TAP) pour contourner l’intégralité des mécanismes d’authentification forte.
Ce guide propose une dissection technique et forensique de la manipulation des méthodes d’authentification sous Entra ID, analyse la télémétrie des journaux d’audit et fournit des requêtes de détection KQL ainsi que des scripts PowerShell d’éradication.
1. Cycle de vie d’une backdoor par second facteur (MFA backdoor)
Section intitulée « 1. Cycle de vie d’une backdoor par second facteur (MFA backdoor) »L’ancrage d’une méthode d’authentification complice se déroule selon l’enchaînement opérationnel suivant :
sequenceDiagram autonumber participant Attacker as Attaquant participant Victim as Compte Victime participant SecurityInfo as Portail Entra ID Security Info (aka.ms/mysecurityinfo) participant SSPR as Moteur SSPR Entra ID
Attacker->>Victim: Compromission Initiale du Compte (AiTM / Password Spray) Attacker->>SecurityInfo: Connexion au portail d'enregistrement des méthodes de sécurité Note over SecurityInfo: Ajout d'un numéro de mobile ou d'une instance Authenticator pirate SecurityInfo-->>Attacker: Émission du log Entra Audit : « User registered security info » Note over Attacker: PERSISTANCE ANCRÉE DANS LE CLOUD !
alt L'Utilisateur Réinitialise son Mot de Passe Victim->>Victim: Renouvellement du mot de passe (Procédure de sécurité) Attacker->>SSPR: Déclenche « Mot de passe oublié » sur login.microsoftonline.com SSPR-->>Attacker: Émet un challenge de vérification MFA Attacker->>SSPR: Valide le challenge via sa propre méthode MFA enregistrée SSPR-->>Attacker: Autorise la saisie d'un nouveau mot de passe sans intervention de l'administrateur ! else Connexion Directe de l'Attaquant Attacker->>Victim: Authentification avec mot de passe Victim-->>Attacker: Invite MFA envoyée sur le smartphone de L'ATTAQUANT (La victime ne reçoit rien !) end1.1 types de méthodes d’authentification détournées :
Section intitulée « 1.1 types de méthodes d’authentification détournées : »- Authentification par téléphone (
PhoneAuthenticationMethod) : enrôlement d’un numéro mobile contrôlé par l’attaquant pour recevoir des codes SMS ou des appels vocaux. - Application Microsoft authenticator (
MicrosoftAuthenticatorAuthenticationMethod) : association d’une nouvelle instance smartphone de Microsoft Authenticator appartenant à l’attaquant. - Jeton logiciel OATH TOTP (
SoftwareOathAuthenticationMethod) : enregistrement d’un secret TOTP à 6 chiffres dans une application d’attaque (ex. script Python ou Google Authenticator). - Clé de sécurité FIDO2 (
Fido2AuthenticationMethod) : enregistrement d’une clé physique (ex. YubiKey) pour satisfaire les exigences d’authentification résistante au phishing. - Pass d’accès temporaire (TAP -
TemporaryAccessPassAuthenticationMethod) : émission d’un code temporaire à usage unique ou multiple permettant de contourner simultanément mot de passe et invite MFA.
2. Détournement du temporary access pass (TAP)
Section intitulée « 2. Détournement du temporary access pass (TAP) »Un Temporary Access Pass (TAP) est un code d’accès temporaire généré par un administrateur pour permettre à un utilisateur d’enrôler un nouvel équipement ou de se reconnecter sans ses identifiants habituels.
graph TD COMP_ADMIN[Rôle d'Administration Compromis<br/>User Admin / Privileged Auth Admin] --> GEN_TAP[Génération d'un Temporary Access Pass<br/>POST /users/{id}/authentication/temporaryAccessPassMethods]
GEN_TAP --> TAP_PROPS[Paramètres du TAP :<br/>- Durée de vie : 10 min à 8 heures<br/>- IsUsableOnce : False / True<br/>- Authentification Forte : Oui (Satisfait le MFA !)]
TAP_PROPS --> ATT_LOGIN[Connexion Attaquant sur login.microsoftonline.com<br/>Sélection de 'Utiliser un code d'accès temporaire']
ATT_LOGIN --> BYPASS[Accès Immédiat aux Ressources Cloud<br/>Aucun Mot de Passe Requis / Aucune Notification sur le Mobile Victime]Pourquoi le détournement de TAP est dévastateur :
Section intitulée « Pourquoi le détournement de TAP est dévastateur : »- Validation intrinsèque du MFA : le TAP satisfait nativement l’exigence d’authentification forte imposée par l’Accès Conditionnel.
- Cécité absolue de la cible : contrairement aux notifications push de Microsoft Authenticator, la connexion via TAP n’envoie aucune notification ni alerte sur le terminal du collaborateur.
- Enrôlement immédiat de FIDO2 : une fois connecté avec le TAP, l’attaquant peut enrôler sa propre clé FIDO2 permanente.
3. Télémétrie et traces d’audit dans Microsoft Entra ID
Section intitulée « 3. Télémétrie et traces d’audit dans Microsoft Entra ID »Toute altération des méthodes d’authentification produit des enregistrements précis dans la table AuditLogs d’Entra ID (catégorie UserManagement) :
| Nom de l’Opération | Contexte de l’Initié | Intention de l’Attaquant |
|---|---|---|
User registered security info | Libre-service (InitiatedBy.user) | L’attaquant enrôle une méthode MFA complice (téléphone, Authenticator) depuis sa session. |
User deleted security info | Libre-service (InitiatedBy.user) | L’attaquant supprime la méthode légitime de la victime pour lui bloquer l’accès. |
User changed default authentication method | Libre-service (InitiatedBy.user) | L’attaquant définit sa méthode comme méthode par défaut pour intercepter les flux. |
Admin registered security info | Administratif (InitiatedBy.user) | Un administrateur compromis ajoute une méthode de sécurité sur le compte d’un tiers. |
Generate temporary access pass | Administratif (InitiatedBy.user) | Un compte privilégié génère un TAP pour accéder furtivement à une boîte cible. |
3.1 décodage du payload d’audit JSON
Section intitulée « 3.1 décodage du payload d’audit JSON »Dans Sentinel ou Log Analytics, le tableau modifiedProperties détaille la nature exacte de la modification :
{ "activityDateTime": "2026-03-24T14:20:15Z", "activityDisplayName": "User registered security info", "category": "UserManagement", "result": "success", "initiatedBy": { "user": { "userPrincipalName": "victim@target.com", "ipAddress": "198.51.100.44" } }, "targetResources": [ { "userPrincipalName": "victim@target.com", "type": "User", "modifiedProperties": [ { "displayName": "Method Type", "newValue": "\"Mobile Phone\"" }, { "displayName": "Phone Number", "newValue": "\"+33 7 ** ** 42\"" }, { "displayName": "Device Name", "newValue": "\"iPhone (Appareil Pirate)\"" } ] } ]}4. Requêtes de chasse KQL en production
Section intitulée « 4. Requêtes de chasse KQL en production »4.1 détection des enrôlements de nouvelles méthodes MFA
Section intitulée « 4.1 détection des enrôlements de nouvelles méthodes MFA »Identifier les collaborateurs enregistrant de nouvelles méthodes d’authentification, avec le type de méthode, le numéro et l’IP source :
AuditLogs| where TimeGenerated >= ago(14d)| where Category == "UserManagement"| where OperationName in ("User registered security info", "Admin registered security info")| extend InitiatedByUser = tostring(InitiatedBy.user.userPrincipalName), InitiatedByIP = tostring(InitiatedBy.user.ipAddress)| extend TargetUser = tostring(TargetResources[0].userPrincipalName)| extend ModifiedProps = TargetResources[0].modifiedProperties| mv-expand ModifiedProps| summarize RegisteredDetails = make_bag(pack(tostring(ModifiedProps.displayName), tostring(ModifiedProps.newValue))) by TimeGenerated, OperationName, InitiatedByUser, TargetUser, InitiatedByIP| project TimeGenerated, OperationName, InitiatedByUser, TargetUser, InitiatedByIP, MethodType=tostring(RegisteredDetails.["Method Type"]), PhoneNumber=tostring(RegisteredDetails.["Phone Number"]), DeviceName=tostring(RegisteredDetails.["Device Name"])| sort by TimeGenerated desc4.2 corrélation entre enrôlement MFA et connexion hostile récente
Section intitulée « 4.2 corrélation entre enrôlement MFA et connexion hostile récente »Repérer les méthodes de sécurité enregistrées dans un délai de 2 heures suivant une connexion inhabituelle ou à risque :
let RiskySignins = SigninLogs| where TimeGenerated >= ago(7d)| where ResultType == 0| where NetworkLocationDetails has "Unknown" or RiskLevelDuringSignIn in ("high", "medium")| project SigninTime=TimeGenerated, UserPrincipalName, SigninIP=IPAddress, SigninLocation=Location;AuditLogs| where TimeGenerated >= ago(7d)| where OperationName == "User registered security info"| extend TargetUser = tostring(TargetResources[0].userPrincipalName), AuditIP = tostring(InitiatedBy.user.ipAddress)| join kind=inner (RiskySignins) on $left.TargetUser == $right.UserPrincipalName| where TimeGenerated between (SigninTime .. (SigninTime + 2h))| project TimeGenerated, TargetUser, AuditIP, SigninIP, SigninLocation, AdditionalDetails| sort by TimeGenerated desc4.3 détection de la génération et de l’utilisation d’un pass temporaire (TAP)
Section intitulée « 4.3 détection de la génération et de l’utilisation d’un pass temporaire (TAP) »Lister toutes les émissions de codes TAP sur le tenant :
AuditLogs| where TimeGenerated >= ago(30d)| where OperationName has "temporary access pass"| extend AdminUPN = tostring(InitiatedBy.user.userPrincipalName), AdminIP = tostring(InitiatedBy.user.ipAddress), TargetUser = tostring(TargetResources[0].userPrincipalName)| project TimeGenerated, OperationName, AdminUPN, AdminIP, TargetUser, ResultDescription| sort by TimeGenerated desc5. Playbook forensique d’audit et purge PowerShell
Section intitulée « 5. Playbook forensique d’audit et purge PowerShell »5.1 script d’inventaire exhaustif des méthodes d’un utilisateur
Section intitulée « 5.1 script d’inventaire exhaustif des méthodes d’un utilisateur »Contrôler l’ensemble des facteurs de sécurité enregistrés sur le compte cible :
# Prérequis : Module Microsoft.Graph.Identity.SignIns# Connect-MgGraph -Scopes "UserAuthenticationMethod.ReadWrite.All"
$targetUser = "victim@target.com"Write-Host "[*] Examen des méthodes d'authentification pour : $targetUser" -ForegroundColor Cyan
# 1. Contrôle des numéros de téléphoneWrite-Host "`n--- Numéros de téléphone enregistrés ---" -ForegroundColor Yellow$phoneMethods = Get-MgUserAuthenticationPhoneMethod -UserId $targetUser$phoneMethods | Select-Object Id, PhoneNumber, PhoneType, SmsState | Format-Table
# 2. Contrôle des instances Microsoft AuthenticatorWrite-Host "`n--- Terminaux Microsoft Authenticator enregistrés ---" -ForegroundColor Yellow$authMethods = Get-MgUserAuthenticationMicrosoftAuthenticatorMethod -UserId $targetUser$authMethods | Select-Object Id, DisplayName, DeviceTag, CreatedDateTime | Format-Table
# 3. Contrôle des clés de sécurité FIDO2Write-Host "`n--- Clés de sécurité FIDO2 ---" -ForegroundColor Yellow$fidoKeys = Get-MgUserAuthenticationFido2Method -UserId $targetUser$fidoKeys | Select-Object Id, DisplayName, Model, CreatedDateTime | Format-Table
# 4. Contrôle des Temporary Access Passes actifsWrite-Host "`n--- Pass d'accès temporaires (TAP) actifs ---" -ForegroundColor Yellow$taps = Get-MgUserAuthenticationTemporaryAccessPassMethod -UserId $targetUser$taps | Select-Object Id, CreatedDateTime, StartDateTime, LifetimeInMinutes, IsUsableOnce, MethodUsabilityReason | Format-Table5.2 script de purge et révocation des backdoors MFA
Section intitulée « 5.2 script de purge et révocation des backdoors MFA »# Éradication des méthodes frauduleuses$targetUser = "victim@target.com"$roguePhoneId = "31055a57-0910-4e4a-aa81-111111111111"$rogueAppId = "8f3b6a9c-2d1e-4b5a-9f8e-7c6b5a4d3e2f"
# 1. Supprimer le numéro de téléphone suspectRemove-MgUserAuthenticationPhoneMethod -UserId $targetUser -PhoneAuthenticationMethodId $roguePhoneIdWrite-Host "[+] Numéro de téléphone suspect supprimé." -ForegroundColor Green
# 2. Supprimer l'application Authenticator suspecteRemove-MgUserAuthenticationMicrosoftAuthenticatorMethod -UserId $targetUser -MicrosoftAuthenticatorAuthenticationMethodId $rogueAppIdWrite-Host "[+] Terminal Authenticator suspect révoqué." -ForegroundColor Green
# 3. Révoquer tous les pass temporaires TAP actifs$activeTaps = Get-MgUserAuthenticationTemporaryAccessPassMethod -UserId $targetUserforeach ($tap in $activeTaps) { Remove-MgUserAuthenticationTemporaryAccessPassMethod -UserId $targetUser -TemporaryAccessPassAuthenticationMethodId $tap.Id Write-Host "[+] Pass temporaire ($($tap.Id)) révoqué." -ForegroundColor Green}
# 4. Révoquer les sessions activesRevoke-MgUserSignSession -UserId $targetUserWrite-Host "[+] Sessions actives invalidées avec succès." -ForegroundColor Green6. Maillage interne & navigation
Section intitulée « 6. Maillage interne & navigation »- Fiche précédente : 29. Consentement OAuth, Applications Furtives & Service Principals
- Fiche suivante : 31. Rôles Entra, Abus de PIM & Élévation de Privilèges
- Fiches complémentaires :