Exercice 06 : Investigation d'Incident de Sécurité
Niveau de Difficulté
Avancé
Objectifs Pédagogiques
- DĂ©clencher soi-mĂȘme des Ă©vĂ©nements rĂ©els dans le journal Security pour comprendre la trace qu'ils laissent
- Conduire une investigation forensique d'un incident AD en suivant une méthodologie structurée
- Corréler des événements de sécurité issus de plusieurs sources pour reconstruire une chronologie
- Prendre des mesures de remédiation appropriées et rédiger un rapport d'incident
Durée Estimée
90 minutes (45 min déclenchement + 45 min investigation/rapport)
Prérequis
- Tous les exercices prĂ©cĂ©dents complĂ©tĂ©s (01â05)
- Audit AD activé (configuré par
MonitoringLab_Setup.ps1Ă l'Ă©tape 7, et renforcĂ© par les GPOs de l'exercice 03) - Au moins deux fenĂȘtres PowerShell ouvertes : une "attaquant" et une "investigateur"
Contexte / Scénario
Scénario pédagogique
Vous allez jouer les deux rĂŽles dans cet exercice :
- RĂŽle A â L'attaquant : vous effectuez une sĂ©rie d'actions suspectes en utilisant des credentials privilĂ©giĂ©s. Chaque action laisse une trace dans le journal Security.
- RĂŽle B â L'investigateur : 15 minutes aprĂšs vos actions, vous "dĂ©couvrez l'incident" et devez reconstruire ce qui s'est passĂ© en lisant uniquement les journaux.
L'intĂ©rĂȘt : vous saurez exactement ce qu'un attaquant aurait fait, et vous vĂ©rifierez si l'audit configurĂ© aux exercices prĂ©cĂ©dents permet bien de retrouver toute la chronologie. Si une action manque dans les logs, c'est que l'audit n'est pas assez large â c'est une dĂ©couverte prĂ©cieuse.
Avant de commencer
Notez l'heure de début sur une feuille à part : $($Date_debut = Get-Date). Vous en aurez besoin pour filtrer les événements dans la phase d'investigation.
Phase 1 : Préparation (5 min)
Tùche 1.1 : Vérifier que l'audit est actif
# Doit montrer Success et/ou Failure activés pour ces sous-catégories
auditpol /get /subcategory:"User Account Management","Security Group Management","Logon" |
Select-String "User Account|Security Group|Logon"
Résultat attendu
Au minimum User Account Management : Success and Failure, Security Group Management : Success and Failure, et Logon : Success and Failure. Si l'un manque :
auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable
auditpol /set /subcategory:"Security Group Management" /success:enable /failure:enable
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
Tùche 1.2 : Marquer le début de l'incident
$Date_debut = Get-Date
Write-Host "Début de l'incident simulé : $Date_debut" -ForegroundColor Yellow
# Notez cette heure quelque part - vous en aurez besoin plus tard
Phase 2 : RĂŽle A â Effectuer les actions suspectes (15 min)
Vous incarnez un attaquant qui a compromis un compte privilégié. Effectuez les actions suivantes dans l'ordre, en attendant 30 secondes entre chacune (pour qu'elles soient séparables dans la chronologie).
Ces actions sont réelles dans votre lab
Elles laisseront de vraies traces dans le journal Security. Faites-les uniquement sur ce lab MonitoringLab, pas sur un environnement de production.
Action 1 â Ăchecs de connexion (Event ID 4625)
Vous tentez de "deviner" le mot de passe du compte pascal (CFO de Finance).
Depuis une fenĂȘtre cmd, exĂ©cutez 3 fois (avec un mauvais mot de passe Ă chaque fois) :
runas /user:maxtec\pascal cmd
Quand l'invite demande le mot de passe, entrez n'importe quel mauvais mot de passe et appuyez sur EntrĂ©e. La commande Ă©chouera â c'est le but. Recommencez 3 fois.
Trace attendue : 3 Ă©vĂ©nements 4625 (Ăchec de connexion).
Action 2 â Connexion rĂ©ussie (Event ID 4624)
Vous trouvez enfin le bon mot de passe. Connectez-vous avec un compte existant â par exemple alexandre (Responsable Infrastructure) :
runas /user:maxtec\alexandre cmd
Entrez le bon mot de passe (Monitor2024!). Une nouvelle fenĂȘtre cmd s'ouvre sous ce compte.
Trace attendue : 1 événement 4624 (Connexion réussie) avec LogonType=2 (interactive).
Action 3 â CrĂ©ation d'un compte dormant (Event ID 4720)
Toujours sous le compte compromis (ou directement en Domain Admin pour simplifier l'exercice), créez un nouveau compte qui servira de porte dérobée :
$pwd = ConvertTo-SecureString "Backdoor_2026!" -AsPlainText -Force
New-ADUser -Name "Compte Backup" `
-SamAccountName "svc_backup_v2" `
-UserPrincipalName "svc_backup_v2@maxtec.be" `
-Path "OU=ServiceAccounts,OU=MONITORING,DC=maxtec,DC=be" `
-AccountPassword $pwd `
-Enabled $true `
-PasswordNeverExpires $true `
-Description "Compte temporaire - Ă supprimer aprĂšs l'exercice"
Trace attendue : 1 événement 4720 (Compte utilisateur créé).
Action 4 â Escalade de privilĂšges (Event ID 4728)
Vous ajoutez ce nouveau compte au groupe Finance Admin pour avoir accÚs aux données financiÚres :
Add-ADGroupMember -Identity "GG-MONITORING-Finance-Admin" -Members "svc_backup_v2"
Trace attendue : 1 événement 4728 (Membre ajouté à un groupe global de sécurité).
Action 5 â Modification d'un compte existant (Event ID 4738)
Vous modifiez la description d'un compte légitime pour effacer vos traces :
Set-ADUser -Identity "alexandre" -Description "Compte principal Infrastructure"
Trace attendue : 1 événement 4738 (Compte utilisateur modifié).
Action 6 â DĂ©sactivation d'un compte sensible (Event ID 4725)
Vous dĂ©sactivez le compte d'audit pour empĂȘcher la dĂ©tection :
Disable-ADAccount -Identity "henri"
Trace attendue : 1 événement 4725 (Compte utilisateur désactivé).
SynthĂšse de la Phase 2
Vous venez d'effectuer 6 actions distinctes qui couvrent les principales catégories d'événements de sécurité AD. La phase 3 commence maintenant : vous "découvrez" l'incident et devez tout reconstruire en lisant les logs.
Phase 3 : RĂŽle B â Investigation (30 min)
Méthodologie d'investigation
Une investigation forensique suit toujours cet ordre :
- Collecter les preuves sans les altérer
- Ătablir une chronologie des Ă©vĂ©nements
- Identifier le vecteur d'attaque
- Ăvaluer l'Ă©tendue des dommages
- Identifier le responsable (si possible)
Tùche 3.1 : Collecter TOUS les événements depuis l'heure de début
# Récupérer tous les événements pertinents depuis le début de l'incident
$eventIds = @(4624, 4625, 4720, 4722, 4725, 4728, 4729, 4732, 4733, 4738, 4740)
$evenements = Get-WinEvent -FilterHashtable @{
LogName = "Security"
Id = $eventIds
StartTime = $Date_debut
} | Sort-Object TimeCreated
Write-Host "ĂvĂ©nements collectĂ©s : $($evenements.Count)" -ForegroundColor Cyan
Résultat attendu
Vous devriez avoir au minimum 6 événements, correspondant aux 6 actions de la phase 2 (souvent plus, car certaines actions génÚrent plusieurs événements connexes).
TĂąche 3.2 : Construire la chronologie
$chronologie = foreach ($event in $evenements) {
$xml = [xml]$event.ToXml()
$data = $xml.Event.EventData.Data
$compte = ($data | Where-Object { $_.Name -eq "TargetUserName" }).'#text'
$par = ($data | Where-Object { $_.Name -eq "SubjectUserName" }).'#text'
$ip = ($data | Where-Object { $_.Name -eq "IpAddress" }).'#text'
[PSCustomObject]@{
Heure = $event.TimeCreated.ToString("HH:mm:ss")
EventID = $event.Id
Cible = $compte
Par = $par
IP = $ip
}
}
$chronologie | Format-Table -AutoSize
Résultat attendu
Un tableau ordonné dans le temps qui devrait montrer :
| Heure | EventID | Description (à déduire) |
|---|---|---|
| T+0 | 4625 Ă 3 | Ăchecs de connexion sur pascal |
| T+1m | 4624 | Connexion réussie de alexandre |
| T+2m | 4720 | Création de svc_backup_v2 |
| T+3m | 4728 | Ajout Ă GG-MONITORING-Finance-Admin |
| T+4m | 4738 | Modification d'alexandre |
| T+5m | 4725 | Désactivation de henri |
Tùche 3.3 : Identifier les comptes touchés
# Quels comptes ont été créés ou modifiés ?
$evenements | Where-Object { $_.Id -in @(4720, 4738, 4725, 4722) } |
ForEach-Object {
$xml = [xml]$_.ToXml()
$cible = ($xml.Event.EventData.Data | Where-Object { $_.Name -eq "TargetUserName" }).'#text'
Write-Host "Event $($_.Id) Ă $($_.TimeCreated.ToString('HH:mm:ss')) : $cible"
}
Tùche 3.4 : Identifier les groupes modifiés
# Quels groupes ont vu leur composition changer ?
$evenements | Where-Object { $_.Id -in @(4728, 4729, 4732, 4733) } |
ForEach-Object {
$xml = [xml]$_.ToXml()
$groupe = ($xml.Event.EventData.Data | Where-Object { $_.Name -eq "TargetUserName" }).'#text'
$membre = ($xml.Event.EventData.Data | Where-Object { $_.Name -eq "MemberName" }).'#text'
$action = if ($_.Id -in @(4728, 4732)) { "AJOUT" } else { "RETRAIT" }
Write-Host "[$action] $($_.TimeCreated.ToString('HH:mm:ss')) | Groupe: $groupe | Membre: $membre"
}
TĂąche 3.5 : Exporter la chronologie en CSV
$chronologie | Export-Csv "C:\Labos\incident_$(Get-Date -Format 'yyyyMMdd_HHmm').csv" `
-NoTypeInformation -Encoding UTF8
Phase 4 : Remédiation (10 min)
à partir de votre chronologie, vous savez maintenant exactement ce qui s'est passé. Mettez en place les actions correctives.
Tùche 4.1 : Neutraliser le compte porte dérobée
# Désactiver immédiatement le compte créé pendant l'incident
Disable-ADAccount -Identity "svc_backup_v2"
Set-ADUser -Identity "svc_backup_v2" `
-Description "COMPROMIS - Créé pendant incident le $(Get-Date -Format 'dd/MM/yyyy') - à supprimer aprÚs validation"
# RĂ©initialiser le mot de passe pour empĂȘcher une rĂ©activation
$newPwd = ConvertTo-SecureString "P0stIncident@$(Get-Random)!" -AsPlainText -Force
Set-ADAccountPassword -Identity "svc_backup_v2" -NewPassword $newPwd -Reset
TĂąche 4.2 : Nettoyer les appartenances aux groupes
# Retirer le compte compromis du groupe Finance Admin
Remove-ADGroupMember -Identity "GG-MONITORING-Finance-Admin" `
-Members "svc_backup_v2" -Confirm:$false
Tùche 4.3 : Réactiver les comptes désactivés à tort
# Si henri a été désactivé pendant l'incident, le réactiver
Enable-ADAccount -Identity "henri"
TĂąche 4.4 : Forcer le changement de mot de passe d'alexandre
Le compte qui a "Ă©tĂ© utilisĂ©" doit ĂȘtre considĂ©rĂ© comme compromis :
Set-ADUser -Identity "alexandre" -ChangePasswordAtLogon $true
Phase 5 : Rapport d'incident (10 min)
Tùche 5.1 : Rédiger le rapport d'incident
Créez un fichier C:\Labos\rapport_incident.txt avec la structure suivante (utilisez vos données collectées dans la phase 3) :
RAPPORT D'INCIDENT DE SĂCURITĂ
===============================
Date de l'incident : [date du jour]
Détecté par : [votre nom / votre fonction]
Heure de détection : [Date_debut + 15min, simulée]
Heure de confinement : [Get-Date au moment de la Phase 4]
1. RĂSUMĂ EXĂCUTIF
[2-3 phrases : compte légitime compromis, création d'un compte
dormant, escalade dans un groupe sensible, désactivation d'un
compte d'audit pour brouiller les pistes.]
2. CHRONOLOGIE
[Tableau extrait de la phase 3 â heure, Event ID, action, compte cible]
3. ĂTENDUE DE L'IMPACT
- Comptes créés : svc_backup_v2
- Comptes modifiés : alexandre (description), henri (désactivé)
- Groupes modifiés : GG-MONITORING-Finance-Admin (+ svc_backup_v2)
- Données potentiellement accédées : à investiguer (cf. exercice 05)
4. VECTEUR D'ATTAQUE
[Tentatives échouées sur pascal puis connexion réussie sur alexandre.
Mot de passe d'alexandre vraisemblablement compromis (brute-force réussi,
hameçonnage, ou autre source).]
5. MESURES DE CONFINEMENT
- Compte svc_backup_v2 désactivé et mot de passe réinitialisé
- Compte retiré de GG-MONITORING-Finance-Admin
- Compte henri réactivé
- Forçage du changement de mot de passe d'alexandre
6. REMĂDIATION
[Actions effectuées dans la phase 4]
7. RECOMMANDATIONS
- Renforcer la politique de mots de passe (déjà fait dans Ex. 03)
- Activer l'authentification multi-facteurs sur les comptes Admin
- Revoir l'audit pour s'assurer que TOUS les événements
pertinents sont bien capturés (cf. tùche 3.1)
- Mettre en place une alerte automatique sur les modifications
du groupe Finance Admin (cf. exercice 04 â 4_Create-CustomAlerts.ps1)
Nettoyage de l'exercice
Pour remettre le lab dans son état initial avant l'exercice :
# Supprimer le compte créé pendant l'incident
Remove-ADUser -Identity "svc_backup_v2" -Confirm:$false
# Restaurer la description d'alexandre (si vous le souhaitez)
Set-ADUser -Identity "alexandre" -Description $null
Write-Host "Lab nettoyé." -ForegroundColor Green
Vérification de la Réussite
Commandes PowerShell de Vérification
Import-Module ActiveDirectory
Write-Host "=== Vérification Exercice 06 ===" -ForegroundColor Cyan
$erreurs = 0
# Test 1 : Le compte svc_backup_v2 a été créé puis désactivé/supprimé
$bd = Get-ADUser -Filter { SamAccountName -eq "svc_backup_v2" } -ErrorAction SilentlyContinue
if ($bd -and -not $bd.Enabled) {
Write-Host "svc_backup_v2 désactivé : OK" -ForegroundColor Green
} elseif (-not $bd) {
Write-Host "svc_backup_v2 supprimé (nettoyage final) : OK" -ForegroundColor Green
} else {
Write-Host "svc_backup_v2 toujours ACTIF â incomplet" -ForegroundColor Red
$erreurs++
}
# Test 2 : svc_backup_v2 retiré du groupe Finance Admin
$finadm = Get-ADGroupMember "GG-MONITORING-Finance-Admin" |
Select-Object -ExpandProperty SamAccountName
if ($finadm -notcontains "svc_backup_v2") {
Write-Host "svc_backup_v2 absent de Finance-Admin : OK" -ForegroundColor Green
} else {
Write-Host "svc_backup_v2 toujours dans Finance-Admin !" -ForegroundColor Red
$erreurs++
}
# Test 3 : henri réactivé
$h = Get-ADUser "henri" -Properties Enabled
if ($h.Enabled) {
Write-Host "henri réactivé : OK" -ForegroundColor Green
} else {
Write-Host "henri est dĂ©sactivĂ© â vĂ©rifier si intentionnel" -ForegroundColor Yellow
}
# Test 4 : alexandre forcé à changer son mot de passe
$a = Get-ADUser "alexandre" -Properties pwdLastSet, PasswordExpired
if ($a.PasswordExpired) {
Write-Host "alexandre doit changer son mot de passe au prochain logon : OK" -ForegroundColor Green
} else {
Write-Host "alexandre n'est pas forcĂ© de changer son mot de passe â ajouter -ChangePasswordAtLogon `$true" -ForegroundColor Yellow
}
# Test 5 : événements de la phase 2 retrouvés dans les logs
$nbEvts = (Get-WinEvent -FilterHashtable @{LogName="Security"; Id=@(4624,4625,4720,4725,4728,4738); StartTime=$Date_debut} -ErrorAction SilentlyContinue).Count
Write-Host "ĂvĂ©nements collectĂ©s depuis Date_debut : $nbEvts (attendu â„ 6)" -ForegroundColor $(if ($nbEvts -ge 6) { "Green" } else { "Yellow" })
Write-Host "`n========================================" -ForegroundColor Cyan
if ($erreurs -eq 0) {
Write-Host "INVESTIGATION ET REMĂDIATION RĂUSSIES !" -ForegroundColor Green
} else {
Write-Host "REMĂDIATION INCOMPLĂTE : $erreurs point(s) Ă corriger" -ForegroundColor Red
}
CritÚres de Réussite
- Vous avez déclenché les 6 actions de la phase 2 (échecs de logon, connexion réussie, création, ajout groupe, modification, désactivation)
- Vous avez retrouvé chacune de ces actions dans le journal Security via PowerShell
- Vous avez construit une chronologie ordonnée des événements
- Vous avez exporté la chronologie en CSV
- Vous avez appliqué les 4 actions de remédiation (désactivation
svc_backup_v2, retrait du groupe, réactivationhenri, force-change du mdp d'alexandre) - Vous avez rédigé un rapport d'incident avec les 7 sections demandées
Points Clés à Retenir
- L'audit doit ĂȘtre configurĂ© AVANT l'incident. Sans audit, les actions de l'attaquant n'auront pas laissĂ© de trace â votre chronologie sera vide.
- Le confinement précÚde l'investigation : on désactive le compte compromis et on nettoie les modifications avant d'analyser l'incident en profondeur.
- Une chronologie ordonnée est la base de tout rapport d'incident. Elle permet de comprendre la séquence et démontrer l'étendue de la compromission.
- Les "petites" modifications comptent : un attaquant intelligent ne crĂ©e pas un compte "BACKDOOR_HAXOR" Ă©vident â il imite la nomenclature existante (
svc_backup_v2ressemble Ăsvc_backup). - Les comptes d'audit (henri) sont des cibles : les dĂ©sactiver fait disparaĂźtre les yeux de la sĂ©curitĂ©. C'est pourquoi il faut alerter immĂ©diatement sur leur dĂ©sactivation.
Dépannage (Erreurs Courantes)
| Erreur Possible | Cause | Solution |
|---|---|---|
| Peu d'Ă©vĂ©nements dans les journaux aprĂšs la Phase 2 | Audit non activĂ© | TĂąche 1.1 â vĂ©rifier auditpol /get et relancer l'audit |
runas /user:maxtec\pascal ne génÚre pas 4625 |
Le DC n'Ă©crit pas les Ă©checs venant du DC lui-mĂȘme de la mĂȘme façon | Faire le test depuis un client joint au domaine, ou utiliser Invoke-Command -Credential |
Date_debut perdu entre les phases |
Variable PowerShell volatile | Notez l'heure sur papier OU exportez : Get-Date \| Export-Clixml C:\Labos\debut.xml |
| ĂvĂ©nements anciens Ă©crasĂ©s | Journal Security trop petit | VĂ©rifier la GPO MONITORING - Configuration Journaux ĂvĂ©nements (Ex. 03) : 2 GB attendus |
| Pas d'IP source dans les Ă©vĂ©nements | Connexion locale ou via service | Normal pour les actions effectuĂ©es sur le DC lui-mĂȘme â l'IP est vide ou 127.0.0.1 |
Récapitulatif de la Progression
Félicitations !
Vous avez complété les 6 exercices du Labo MonitoringLab. Vous maßtrisez maintenant :
- L'exploration de la structure Active Directory
- L'analyse des journaux d'événements de sécurité
- La configuration de GPOs de sécurité et d'audit via GPMC
- La gestion et sécurisation des comptes de service
- La mise en place d'une politique d'audit personnalisée
- La conduite d'une investigation d'incident de sécurité
Ces compétences sont directement applicables dans un environnement professionnel réel.