Aller au contenu

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 !)
end

1.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.

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 : »
  1. Validation intrinsèque du MFA : le TAP satisfait nativement l’exigence d’authentification forte imposée par l’Accès Conditionnel.
  2. 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.
  3. 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érationContexte de l’InitiéIntention de l’Attaquant
User registered security infoLibre-service (InitiatedBy.user)L’attaquant enrôle une méthode MFA complice (téléphone, Authenticator) depuis sa session.
User deleted security infoLibre-service (InitiatedBy.user)L’attaquant supprime la méthode légitime de la victime pour lui bloquer l’accès.
User changed default authentication methodLibre-service (InitiatedBy.user)L’attaquant définit sa méthode comme méthode par défaut pour intercepter les flux.
Admin registered security infoAdministratif (InitiatedBy.user)Un administrateur compromis ajoute une méthode de sécurité sur le compte d’un tiers.
Generate temporary access passAdministratif (InitiatedBy.user)Un compte privilégié génère un TAP pour accéder furtivement à une boîte cible.

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.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 desc

4.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 desc

4.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 desc

5. 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 :

Fenêtre de terminal
# 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éphone
Write-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 Authenticator
Write-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é FIDO2
Write-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 actifs
Write-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-Table

5.2 script de purge et révocation des backdoors MFA

Section intitulée « 5.2 script de purge et révocation des backdoors MFA »
Fenêtre de terminal
# É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 suspect
Remove-MgUserAuthenticationPhoneMethod -UserId $targetUser -PhoneAuthenticationMethodId $roguePhoneId
Write-Host "[+] Numéro de téléphone suspect supprimé." -ForegroundColor Green
# 2. Supprimer l'application Authenticator suspecte
Remove-MgUserAuthenticationMicrosoftAuthenticatorMethod -UserId $targetUser -MicrosoftAuthenticatorAuthenticationMethodId $rogueAppId
Write-Host "[+] Terminal Authenticator suspect révoqué." -ForegroundColor Green
# 3. Révoquer tous les pass temporaires TAP actifs
$activeTaps = Get-MgUserAuthenticationTemporaryAccessPassMethod -UserId $targetUser
foreach ($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 actives
Revoke-MgUserSignSession -UserId $targetUser
Write-Host "[+] Sessions actives invalidées avec succès." -ForegroundColor Green