Des cadavres dans le placard découverts après un incident de sécurité

Des cadavres dans le placard découverts après un incident de sécurité

Le directeur financier a immédiatement fait irruption dans mon bureau dès que je me suis assis et nous a propulsés, mon manager et moi, dans son bureau

J’adore les images que vous ajoutez à vos publications.

La partie sur le système financier fonctionnant avec Wine et Cygwin m’a véritablement fait éclater de rire au point d’en avoir mal aux côtes. Donc, merci beaucoup pour cela.

Le helpdesk a vraiment une valeur inestimable quand il est de votre côté. Pas seulement en cas d’incident, mais je les ai régulièrement utilisés comme mes espions du shadow IT.

  • Helpdesk : Tiens, c’est quoi cette icône ?
  • Utilisateur : Oh, c’est la base de données Access dans laquelle on met toutes nos données sensibles et qui fait les rapports critiques
  • Helpdesk : Oh… c’est intéressant.
  • Utilisateur : Oui. Au fait, vous pourriez nous aider avec ça ? C’est devenu très lent, alors on a dû commencer à la garder sur une clé USB
  • Helpdesk : D’accord, puis-je vous mettre en attente un instant ? clic ! Hé, sysadmin ! Vous êtes au courant de cette folie ?!

Content que vous vous en soyez sorti, on dirait que l’entreprise a encore beaucoup à faire en termes de culture, mais vous avez bien travaillé. Bravo !

Bonjour,

La découverte de “cadavres dans le placard” après un incident de sécurité — expression qui désigne la mise au jour de vulnérabilités, de configurations défaillantes, d’accès orphelins ou de compromissions passées non détectées — est malheureusement une réalité très courante lors des investigations post-incident. Cette situation révèle souvent que l’incident visible n’était que la partie émergée de l’iceberg. Voici une méthodologie complète pour traiter ces découvertes et renforcer durablement votre posture de sécurité.


Comprendre ce que cachent les “cadavres dans le placard”

Les découvertes les plus fréquentes lors des investigations post-incident

Type de découverte Fréquence Risque résiduel
Comptes utilisateurs anciens non désactivés Très fréquent Élevé — vecteur d’intrusion
Mots de passe partagés ou identiques entre comptes Très fréquent Très élevé
Accès administrateurs non documentés Fréquent Critique
Applications non patchées depuis des mois/années Fréquent Élevé
Données sensibles non chiffrées sur des partages réseau Fréquent Élevé
Connexions RDP exposées directement sur Internet Fréquent Critique
Règles de pare-feu obsolètes autorisant des flux non nécessaires Fréquent Moyen à élevé
Journaux d’audit désactivés ou insuffisants Très fréquent Bloque l’investigation
Sauvegardes non testées ou non fonctionnelles Fréquent Critique en cas de ransomware
Comptes de service avec des droits administrateur excessifs Fréquent Critique

Phase 1 : Containment et investigation immédiate

Isoler les systèmes compromis sans détruire les preuves

La première priorité est de stopper la propagation sans effacer les traces qui permettront de comprendre l’étendue de la compromission.

# Isoler immédiatement une machine compromise du réseau via PowerShell
# (à exécuter sur la machine ou via remote management si encore accessible)

# Bloquer toutes les connexions réseau sortantes sauf vers les serveurs de gestion
New-NetFirewallRule -DisplayName "ISOLATION-BLOC-TOUT" -Direction Outbound -Action Block -Enabled True -Profile Any

# Lister toutes les connexions réseau actives (à faire AVANT isolation pour documentation)
Get-NetTCPConnection -State Established | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess |
    ForEach-Object {
        $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
        [PSCustomObject]@{
            LocalAddress  = $_.LocalAddress
            LocalPort     = $_.LocalPort
            RemoteAddress = $_.RemoteAddress
            RemotePort    = $_.RemotePort
            ProcessName   = $proc.Name
            ProcessPath   = $proc.Path
        }
    } | Format-Table -AutoSize

Préserver les preuves numériques

# Capturer la liste des processus en cours (avant tout redémarrage)
Get-Process | Select-Object Id, Name, CPU, WorkingSet, Path, StartTime |
    Export-Csv "C:\investigation\processes_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation

# Capturer les connexions réseau actives
Get-NetTCPConnection | Export-Csv "C:\investigation\network_connections_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation

# Capturer les tâches planifiées (souvent utilisées pour la persistance)
Get-ScheduledTask | Where-Object {$_.State -eq "Ready"} |
    Select-Object TaskName, TaskPath, @{N='Actions';E={$_.Actions.Execute}} |
    Export-Csv "C:\investigation\scheduled_tasks_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation

# Capturer les services Windows (vecteur de persistance courant)
Get-Service | Select-Object Name, DisplayName, Status, StartType |
    Export-Csv "C:\investigation\services_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation

Phase 2 : Audit des accès et des comptes — Nettoyer les cadavres

Identifier et désactiver les comptes orphelins

# Se connecter à Active Directory
Import-Module ActiveDirectory

# Trouver les comptes utilisateurs inactifs depuis plus de 90 jours
$date90 = (Get-Date).AddDays(-90)
Search-ADAccount -AccountInactive -DateTime $date90 -UsersOnly |
    Select-Object SamAccountName, DisplayName, LastLogonDate, Enabled |
    Export-Csv "C:\audit\comptes_inactifs.csv" -NoTypeInformation

# Trouver les comptes jamais connectés
Get-ADUser -Filter {LastLogonDate -notlike "*" -and Enabled -eq $true} `
    -Properties LastLogonDate, WhenCreated |
    Select-Object SamAccountName, DisplayName, WhenCreated |
    Export-Csv "C:\audit\comptes_jamais_connectes.csv" -NoTypeInformation

# Trouver les membres du groupe Domain Admins (souvent surchargé)
Get-ADGroupMember "Domain Admins" -Recursive |
    Select-Object Name, SamAccountName, objectClass |
    Export-Csv "C:\audit\admins_domaine.csv" -NoTypeInformation

# Désactiver en masse les comptes inactifs (après validation)
# Search-ADAccount -AccountInactive -DateTime $date90 -UsersOnly |
#     Disable-ADAccount -WhatIf  # Retirez -WhatIf pour exécuter réellement

Audit des comptes de service

# Identifier les comptes de service (souvent avec des mots de passe qui n'expirent jamais)
Get-ADUser -Filter {PasswordNeverExpires -eq $true} -Properties PasswordNeverExpires, LastLogonDate, MemberOf |
    Select-Object SamAccountName, PasswordNeverExpires, LastLogonDate |
    Export-Csv "C:\audit\comptes_mdp_sans_expiration.csv" -NoTypeInformation

# Vérifier les droits excessifs des comptes de service
Get-ADUser -Filter {ServicePrincipalName -like "*"} -Properties ServicePrincipalName, MemberOf |
    ForEach-Object {
        $user = $_
        $groups = $user.MemberOf | ForEach-Object { (Get-ADGroup $_).Name }
        [PSCustomObject]@{
            Account = $user.SamAccountName
            SPN     = $user.ServicePrincipalName -join "; "
            Groups  = $groups -join "; "
        }
    } | Export-Csv "C:\audit\comptes_service_spn.csv" -NoTypeInformation

Phase 3 : Audit des vulnérabilités découvertes

Vérifier les mises à jour manquantes

# Lister les mises à jour Windows manquantes (via PSWindowsUpdate)
Install-Module -Name PSWindowsUpdate -Force -SkipPublisherCheck
Import-Module PSWindowsUpdate
Get-WUList | Select-Object KB, Size, Title | Format-Table -AutoSize

# Via WSUS ou via l'API Windows Update directement
$updateSession = New-Object -ComObject Microsoft.Update.Session
$updateSearcher = $updateSession.CreateUpdateSearcher()
$searchResult = $updateSearcher.Search("IsInstalled=0 and Type='Software'")
$searchResult.Updates | Select-Object Title, MsrcSeverity | Format-Table -AutoSize

Audit des partages réseau exposés

# Lister tous les partages réseau du serveur
Get-SmbShare | Select-Object Name, Path, Description | Format-Table -AutoSize

# Vérifier les permissions de chaque partage
Get-SmbShareAccess | Select-Object Name, AccountName, AccessControlType, AccessRight | Format-Table -AutoSize

# Identifier les partages avec accès "Tout le monde" ou "Everyone"
Get-SmbShareAccess | Where-Object {$_.AccountName -like "*Everyone*" -or $_.AccountName -like "*Tout le monde*"} |
    Format-Table -AutoSize

Phase 4 : Renforcement post-incident (Hardening)

Actions prioritaires

  1. Réinitialiser le mot de passe du compte KRBTGT (si compromission d’Active Directory suspectée) — à faire deux fois avec 10 heures d’intervalle
  2. Activer la journalisation avancée sur tous les systèmes critiques
  3. Déployer Microsoft Defender for Identity pour détecter les attaques latérales futures
  4. Mettre en place le principe du moindre privilège — revue de tous les accès administrateurs
# Activer l'audit avancé des connexions dans la Stratégie de Groupe
# (Connexions/déconnexions, accès aux objets, gestion des comptes)
auditpol /set /category:"Account Logon" /success:enable /failure:enable
auditpol /set /category:"Account Management" /success:enable /failure:enable
auditpol /set /category:"Logon/Logoff" /success:enable /failure:enable
auditpol /set /category:"Object Access" /success:enable /failure:enable
auditpol /set /category:"Privilege Use" /success:enable /failure:enable

# Vérifier la configuration d'audit actuelle
auditpol /get /category:*

Phase 5 : Signalement et conformité

Si des données personnelles ont été compromises, le RGPD impose des obligations :

  • Notification à la CNIL dans les 72 heures suivant la découverte (article 33 RGPD)
  • Notification aux personnes concernées si le risque pour leurs droits est élevé (article 34 RGPD)
  • Plateforme de signalement : cybermalveillance.gouv.fr
  • Dépôt de plainte : thesee.interieur.gouv.fr (pour les incidents cyber)

Un incident de sécurité révèle presque toujours des défaillances accumulées. L’objectif n’est pas de chercher des coupables mais de mettre en place des processus pérennes pour éviter la récurrence.


Ayi NEDJIMI — Consultant IT & Cybersécurité Microsoft
Pour un audit post-incident, un plan de remédiation ou la mise en place d’une supervision de sécurité (SIEM/SOC) : ayinedjimi-consultants.fr