Skip to content

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 :

  1. Collecter les preuves sans les altérer
  2. Établir une chronologie des Ă©vĂ©nements
  3. Identifier le vecteur d'attaque
  4. Évaluer l'Ă©tendue des dommages
  5. 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Ă©activation henri, 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_v2 ressemble Ă  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.