Le SID est la fondation de toute décision d'accès sur Windows. Ce chapitre couvre l'anatomie des identifiants de sécurité, les comptes et groupes intégrés, leurs implications offensives et défensives, et comment auditer ces éléments via PowerShell et les Event IDs.
DÉBUTANT → INTERMÉDIAIREOFFENSIF + DÉFENSIF3 – 4h
1.1
Le SID - Structure & Rôle
Un Security Identifier (SID) est l'identifiant unique qu'utilise Windows pour représenter toute entité de sécurité : utilisateur, groupe, processus, ordinateur. Contrairement au nom d'affichage (qui peut changer librement), le SID est immuable une fois créé - c'est lui qui fait foi dans toutes les décisions d'accès du système.
Analogie : Le SID est au système Windows ce que le numéro de sécurité sociale est à un citoyen. Peu importe si vous changez de nom ou de prénom, votre numéro reste identique à vie. Quand Windows décide si un processus peut lire un fichier, il compare des SIDs - jamais des noms.
Anatomie d'un SID - décomposition visuelle
Exemple : SID du compte Administrateur local
S
Préfixe
1
Révision
5
Authority
21
Sub-Auth
1234567890-0987654321-1122334455
Domain ID (3×32-bit)
500
RID
Préfixe "S"
Toujours "S"
Marque le début de tout SID Windows
Révision
Toujours 1
Version du format - n'a jamais changé depuis NT
Identifier Authority
5 = NT_AUTHORITY
0=NULL · 1=World · 2=Local · 5=NT (le plus courant)
Sub-Authority 21
NON_UNIQUE
Indique qu'un Domain ID unique suit - propre à chaque machine/domaine
Domain ID
3 valeurs 32-bit
Identifiant unique de la machine ou du domaine AD - généré à l'installation
RID (Relative ID)
500 = Admin
Identifie l'objet DANS ce domaine - 500/501 réservés, ≥1000 pour les comptes créés
Well-Known SIDs - identiques sur toutes les machines Windows
Ces SIDs sont fixes et universels - ils ne dépendent pas du domaine ni de la machine. Un attaquant ou un analyste peut les utiliser directement dans les ACLs ou les requêtes d'audit sans connaître le domaine cible.
SID
Nom
Usage & risque sécurité
S-1-0-0
Nobody
Aucune identité - rarement utile
S-1-1-0
Everyone
Tout utilisateur y compris anonymes - Risque ACL
S-1-2-0
Local
Utilisateurs connectés localement (console)
S-1-5-18
LocalSystem
Compte système le plus puissant - Cible finale
S-1-5-19
LocalService
Service avec droits réduits, anonyme sur réseau
S-1-5-20
NetworkService
Service avec authentification réseau machine
S-1-5-32-544
Administrators
Groupe admins locaux - Compromission totale
S-1-5-32-545
Users
Groupe utilisateurs standard
S-1-5-32-546
Guests
Groupe invités - Énumération SMB si activé
S-1-5-32-551
Backup Operators
Lecture tous fichiers + dump SAM - Escalade quasi-garantie
S-1-5-21-…-500
Administrateur local
RID 500 = admin built-in, même renommé - Priorité d'attaque
S-1-5-21-…-501
Invité local
RID 501 - désactivé par défaut
S-1-5-21-…-1000+
Comptes créés manuellement
RID ≥ 1000 pour tous les comptes normaux
Offensif
Lors d'une énumération, obtenir un SID se terminant par -500 confirme que c'est l'Administrateur built-in même s'il a été renommé en "john" ou "maintenance". impacket-secretsdump cible ce compte en priorité car il n'est pas soumis au verrouillage par défaut sur le réseau local.
Défensif
Des événements contenant S-1-5-18 indiquent une action du système lui-même - c'est normal. En revanche, un S-1-5-21-…-500 utilisé activement en dehors d'une maintenance planifiée est un signal d'alerte. Croiser avec l'Event ID 4624 (connexion réussie) pour identifier l'origine.
Commandes essentielles
Inspecter et manipuler les SIDsPOWERSHELL
# Voir son propre SIDwhoami /user
# Voir les SIDs de tous ses groupes (avec les attributs Enabled/Disabled)whoami /groups
# Convertir un SID en nom lisible$sid = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-32-544")
$sid.Translate([System.Security.Principal.NTAccount])
# Retourne : BUILTIN\Administrators# Convertir un nom en SID$account = New-Object System.Security.Principal.NTAccount("Administrators")
$account.Translate([System.Security.Principal.SecurityIdentifier])
# Lister tous les comptes locaux avec leurs SIDsGet-WmiObject Win32_UserAccount | Select-Object Name, SID, Disabled
1.2
Comptes Utilisateurs Intégrés
Windows crée automatiquement plusieurs comptes à l'installation. Chacun a un rôle précis, un SID fixe, et des implications sécurité distinctes. Connaître leur état par défaut est fondamental pour l'audit et l'offensif.
Administrator
RID - 500
Compte admin local le plus puissant. Identifiable via son RID 500 même renommé.
Désactivé par défautRID 500
Guest
RID - 501
Accès très limité, sans mot de passe. Si activé, peut permettre l'énumération SMB anonyme.
Désactivé depuis VistaRID 501
DefaultAccount
RID - 503
Introduit avec Windows 10 pour les apps UWP universelles. Désactivé en permanence.
DésactivéUWP
WDAGUtilityAccount
RID - 504
Windows Defender Application Guard - sandboxing navigateur. Désactivé si WDAG non configuré.
DésactivéWDAG
Focus - Administrateur (RID 500)
Point critique
Le compte Administrateur ne peut pas être supprimé - seulement désactivé. Même renommé en "jean-pierre" ou "maintenance", son SID se termine toujours par -500, ce qui le trahit lors d'une énumération. Il est désactivé par défaut sur Windows 10/11 (sauf Server, où il est activé).
Bonne pratique : le désactiver, créer un compte admin avec un nom non évident et un RID ≥ 1000, et surveiller toute tentative d'activation du compte -500.
Inspecter les comptes intégrésPOWERSHELL
# État du compte AdministratorGet-LocalUser-Name"Administrator"# État du compte GuestGet-LocalUser-Name"Guest" | Select-Object Name, Enabled, SID
# Voir TOUS les comptes locaux (actifs + inactifs)Get-LocalUser | Select-Object Name, Enabled, SID, Description | Format-Table-AutoSize
Offensif
impacket-secretsdump cible le compte RID 500 en priorité car il n'est pas soumis au verrouillage par défaut en LAN. Même si le compte est désactivé localement, ses credentials stockés dans la SAM peuvent être extraits si on obtient un accès SYSTEM - et utilisés pour du Pass-the-Hash via le réseau.
1.3
Comptes Système
Ces comptes sont fondamentalement différents des comptes utilisateurs classiques : ils n'ont pas de mot de passe, pas de profil de connexion interactive, et ne peuvent pas être utilisés pour ouvrir une session normalement. Ils servent de contexte d'exécution aux services Windows.
Comprendre le modèle
Quand un service Windows démarre, il doit s'exécuter sous une identité pour avoir accès aux ressources. Le choix de cette identité détermine ce que le service peut faire : lire des fichiers, accéder au réseau, lire la mémoire d'autres processus. Choisir le mauvais compte (trop de droits) = surface d'attaque agrandie.
Comparatif des trois comptes système
Compte
Niveau de privilège
Accès réseau
Usage typique
LocalSystem S-1-5-18
Maximum - équivaut SYSTEM Peut lire/modifier tout le système, accéder à la mémoire kernel
S'authentifie comme le compte machine (DOMAIN\HOSTNAME$)
Services critiques OS : Winlogon, Print Spooler, RPC
LocalService S-1-5-19
Faible - droits réduits Accès limité aux ressources locales non sensibles
Accès réseau anonyme - aucune authentification
Services non critiques : DHCP Client, DNS Client
NetworkService S-1-5-20
Faible - droits réduits Similaire à LocalService mais avec accès réseau
S'authentifie comme le compte machine (comme LocalSystem)
Services réseau : WCF, IIS Worker Process
Services sous LocalSystem - énumérationPOWERSHELL
# Lister les services tournant sous SYSTEM (LocalSystem)Get-CimInstance Win32_Service |
Where-Object {$_.StartName -eq"LocalSystem"} |
Select-Object Name, StartName, State | Format-Table# Un service sous LocalSystem compromis = accès SYSTEM garanti# Vérifier les services avec des permissions faibles (Chapitre 11)Get-CimInstance Win32_Service |
Where-Object {$_.StartName -eq"LocalSystem"-and$_.State -eq"Running"} |
Select-Object Name, PathName | Format-Table-AutoSize
Offensif
Un processus sous LocalSystem peut accéder à tout le système : lire la mémoire des autres processus (y compris LSASS), modifier le registre système, installer des drivers. C'est pourquoi l'escalade vers SYSTEM est l'objectif final d'une compromission locale - et pourquoi SeImpersonatePrivilege (Chapitre 10) est si précieux : il permet de passer de NetworkService à SYSTEM.
Piège - contexte partagé LocalService
Point critique souvent mal compris : si deux services tournent sous LocalService, la compromission de l'un permet d'attaquer l'autre directement car ils partagent le même contexte de sécurité. Windows Vista a partiellement mitigé cela avec des SIDs de service uniques par service - mais ce vecteur reste exploitable dans certaines configurations.
1.4
Groupes Locaux & Implications Sécurité
Les groupes définissent les droits et permissions attribués collectivement à tous leurs membres. L'appartenance à certains groupes constitue une voie d'escalade de privilèges directe - même sans être dans le groupe Administrators.
Groupes à fort impact sécurité - cliquer pour détailler
CritiqueAdministratorsS-1-5-32-544
Contrôle total du système. Tout compte dans ce groupe = compromission totale - accès aux ACLs, installation de services, accès LSASS.
Peut modifier n'importe quelle ACL NTFS, même sur des fichiers système
Peut installer des services et des drivers non signés (si Secure Boot désactivé)
Peut lire et dumper la mémoire de lsass.exe directement
Peut activer/modifier les politiques d'audit et effacer les logs
Accès complet au registre HKLM et à toutes ses branches
Très dangereuxBackup OperatorsS-1-5-32-551
Groupe extrêmement sous-estimé - souvent oublié dans les audits. Il donne des capacités équivalentes à un admin pour les opérations fichiers et les dumps de secrets.
Peuvent lire et écrire tous les fichiers quelle que soit l'ACL NTFS (via SeBackupPrivilege + SeRestorePrivilege)
Peuvent copier SAM, SYSTEM, NTDS.dit via reg save ou ntdsutil
Peuvent se connecter et éteindre le système
Peuvent remplacer des fichiers système sur un Domain Controller
Sont considérés comme des "Service Administrators" dans AD
Offensif - Exploitation directe
Un compte membre de Backup Operators peut exécuter : reg save HKLM\SAM C:\temp\sam.hiv reg save HKLM\SYSTEM C:\temp\system.hiv Puis extraire les hashes avec impacket-secretsdump - escalade vers SYSTEM garantie.
Accès distantRemote Management UsersS-1-5-32-580
Autorisent l'accès WinRM/WSMan sans être admin. Utilisés pour les sessions PowerShell distantes et les configurations JEA (Chapitre 3).
Permet Enter-PSSession et Invoke-Command à distance sans droits admin
Accès au CIM/WMI distant via PowerShell
Impliqué dans les configurations JEA (Just Enough Administration) - Chapitre 3
Peut être utilisé comme vecteur de mouvement latéral si des scripts exécutent des commandes sensibles
Accès interactifRemote Desktop UsersS-1-5-32-555
Autorisent la connexion RDP. Ne donnent pas de droits admin mais permettent l'accès interactif distant - suffisant pour exécuter du code et pivoter.
Connexion RDP (port 3389) sans être administrateur
Session bureau à distance complète - peut lancer des processus, accéder aux fichiers de l'utilisateur
Avec un credential dumped, permet la persistence via RDP
Peuvent lire des compteurs de performance sans droits admin. Utilisables pour de l'énumération silencieuse de l'activité système.
Accès aux compteurs Performance Monitor (CPU, mémoire, processus actifs)
Peut révéler des informations sur les processus, services et activité réseau
Rarement audité - discrète source d'informations de reconnaissance
Commandes de gestion des groupes
Groupes locaux - gestion complètePOWERSHELL
# Lister tous les groupes locaux avec leurs SIDsGet-LocalGroup | Select-Object Name, SID, Description
# Lister les membres d'un groupe - avec leurs SIDs completsGet-LocalGroupMember-Group"Administrators"Get-LocalGroupMember-Group"Backup Operators"# Ajouter un utilisateur à un groupeAdd-LocalGroupMember-Group"Administrators"-Member"restricteduser"# Méthode classique avec net.exe
net localgroup Administrators
net localgroup "Backup Operators" restricteduser /add
# Vérification des membres de Backup Operators (audit SOC)Get-LocalGroupMember-Group"Backup Operators" |
Select-Object Name, SID, PrincipalSource
1.5
Gestion via net.exe & PowerShell
Deux approches coexistent sous Windows pour gérer utilisateurs et groupes. net.exe est omniprésent et disponible sur toutes les versions, mais PowerShell offre plus de contrôle, une meilleure intégration avec le pipeline, et des sorties structurées. Connaître les deux est indispensable - en forensics, vous retrouverez les deux dans les logs.
Créer un utilisateur complet - exemple commenté pas à pas
Création utilisateur - workflow completPOWERSHELL
# Étape 1 : Créer le mot de passe de manière sécurisée (jamais en clair dans le code)$password = ConvertTo-SecureString"P@ssw0rd!2024"-AsPlainText-Force# Étape 2 : Créer l'utilisateur avec tous ses attributsNew-LocalUser-Name"restricteduser" `
-Password$password `
-FullName"Restricted User" `
-Description"Compte de test sécurité" `
-PasswordNeverExpires $true# Étape 3 : Vérifier la création + SID attribué (RID doit être ≥ 1000)Get-LocalUser-Name"restricteduser" | Select-Object Name, SID, Enabled
# Étape 4 : Ajouter au groupe souhaitéAdd-LocalGroupMember-Group"Users"-Member"restricteduser"
Référence complète des cmdlets LocalUser & LocalGroup
Ces techniques sont présentées exclusivement dans le cadre d'un environnement de lab isolé (réseau Host-Only, VM dédiée). Ne jamais appliquer sur un système de production. L'objectif est de comprendre les mécanismes pour mieux les détecter en SOC.
En lab offensif, Defender bloque la majorité des outils (Mimikatz, certains scripts Impacket, Responder...). Connaître les méthodes de désactivation est aussi indispensable pour la détection défensive de ces techniques dans un SIEM.
Méthode 1 - PowerShell (temporaire)
Désactivation via Set-MpPreferencePOWERSHELL
# Désactiver la protection en temps réel (le plus courant)Set-MpPreference-DisableRealtimeMonitoring $true# Vérifier l'étatGet-MpPreference | Select-Object DisableRealtimeMonitoring
# Ajouter une exclusion de dossier (moins bruyant qu'une désactivation totale)Add-MpPreference-ExclusionPath"C:\Tools"# Désactivation complète (nécessite Tamper Protection désactivé dans UI)Set-MpPreference-DisableIOAVProtection $true `
-DisableBehaviorMonitoring $true `
-DisableBlockAtFirstSeen $true `
-SubmitSamplesConsent 2 `
-MAPSReporting 0
Méthode 2 - Via GPO locale (persistant)
Chemin GPO locale - gpedit.msc
Ouvrir gpedit.msc (Group Policy Object Editor)
Computer Configuration
Administrative Templates
Windows Components
Microsoft Defender Antivirus
"Turn off Microsoft Defender Antivirus" → Enabled
Persiste au reboot - survit aux mises à jour Windows
Méthode 3 - Via le Registre
Désactivation via clé de registrePOWERSHELL
# Désactiver via la clé de politiqueSet-ItemProperty-Path"HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" `
-Name"DisableAntiSpyware"-Value 1 -Type DWord
# Appliquer immédiatement sans redémarrage
gpupdate /force
# Pour vérifier l'état de Defender depuis le registreGet-ItemProperty"HKLM:\SOFTWARE\Microsoft\Windows Defender"-Name DisableAntiSpyware
Défensif - Détection
La désactivation de Defender génère des events spécifiques dans le log Microsoft-Windows-Windows Defender/Operational :
5001 - Real-time Protection désactivée 5004 - Configuration de Real-time Protection modifiée 5010 - Scan d'un fichier désactivé 5012 - Exécution du moteur désactivée
Un SIEM doit alerter immédiatement sur l'Event ID 5001. Il précède souvent l'exécution d'outils offensifs de quelques secondes à quelques minutes.
TP 1
Créer restricteduser et vérifier ses SIDs
TP 01-ACréation d'utilisateurs, gestion de groupes, inspection des SIDsDÉBUTANT
Objectifs
Créer un compte restricteduser avec des attributs complets
Créer un groupe personnalisé RestrictedCmdlets
Ajouter l'utilisateur aux groupes RestrictedCmdlets et Administrators
Inspecter les SIDs générés et vérifier que le RID est ≥ 1000
Comprendre la différence entre les SIDs locaux et les Well-Known SIDs
PowerShell Admin - VM WindowsPOWERSHELL
# Créer le mot de passe de façon sécurisée$pwd = ConvertTo-SecureString"Restricted@2024!"-AsPlainText-Force# Créer le compte utilisateurNew-LocalUser-Name"restricteduser" `
-Password$pwd `
-Description"Compte de test - lab sécurité" `
-PasswordNeverExpires $true# Créer le groupe RestrictedCmdletsNew-LocalGroup-Name"RestrictedCmdlets" `
-Description"Groupe JEA pour lab"
Groupes + Inspection des SIDsPOWERSHELL
# Ajouter aux deux groupesAdd-LocalGroupMember-Group"RestrictedCmdlets"-Member"restricteduser"Add-LocalGroupMember-Group"Administrators"-Member"restricteduser"# ── VÉRIFICATION DES SIDs ──────────────────────────────# SID de l'utilisateur$user = Get-LocalUser-Name"restricteduser"Write-Host"SID utilisateur : $($user.SID)"# Attendu : se termine par -1001 ou -1002 (RID ≥ 1000)# SIDs de tous ses groupes$username = "restricteduser"$groups = Get-LocalGroup | Where-Object {
(Get-LocalGroupMember-Group$_.Name -ErrorAction SilentlyContinue).Name `
-contains"$env:COMPUTERNAME\$username"
}
$groups | ForEach-Object {
Write-Host"Groupe : $($_.Name) | SID : $($_.SID)"
}
# Attendu : Administrators = S-1-5-32-544 (Well-Known)# RestrictedCmdlets = S-1-5-21-...-XXXX (local)
Vérification via net.exeCMD
net user restricteduser
net localgroup Administrators
net localgroup RestrictedCmdlets
Résultats attendus
RID de restricteduser ≥ 1000 (ex: -1001). SID de Administrators = S-1-5-32-544. SID de RestrictedCmdlets = S-1-5-21-[domaine]-XXXX (local à cette machine).
TP 2
Audit des comptes actifs & Détection d'un backdoor
TP 01-BIdentifier un compte suspect simulant un backdoor via PowerShell et Event IDsINTERMÉDIAIRE
Objectifs
Simuler la création d'un compte backdoor (comme le ferait un attaquant)
Écrire un script d'audit PowerShell pour détecter les anomalies
Utiliser les Event IDs 4720 et 4732 pour retracer les actions
Nettoyer l'environnement après l'exercice
Un attaquant ayant obtenu des droits admin crée souvent un compte discret avec un nom ressemblant à un compte système pour persister.
Simulation - PowerShell AdminPOWERSHELL
# Créer un compte caché simulant un backdoor# Notez : nom générique (svc_update), description vide, mdp ne expire pas$pwd = ConvertTo-SecureString"B@ckd00r!"-AsPlainText-ForceNew-LocalUser-Name"svc_update" `
-Password$pwd `
-Description"" `
-PasswordNeverExpires $true# L'attaquant l'ajoute au groupe AdministratorsAdd-LocalGroupMember-Group"Administrators"-Member"svc_update"# Ces deux actions génèrent respectivement :# Event ID 4720 (création de compte)# Event ID 4732 (ajout à un groupe local)
Audit complet - anomalies et alertesPOWERSHELL
# ── PARTIE 1 : Vue d'ensemble des comptes actifs ──────────────────Write-Host"`n=== COMPTES LOCAUX ACTIFS ==="-ForegroundColor Cyan
Get-LocalUser | Where-Object {$_.Enabled -eq $true} | ForEach-Object {
$user = $_# Vérifier si membre d'Administrators$isAdmin = $falsetry {
$members = Get-LocalGroupMember-Group"Administrators"-ErrorAction Stop
$isAdmin = $members.Name -contains"$env:COMPUTERNAME\$($user.Name)"
} catch {}
[PSCustomObject]@{
Nom = $user.Name
SID = $user.SID
Admin = $isAdmin
MdpNoExpire = $user.PasswordNeverExpires
DerniereConnexion = if ($user.LastLogon) { $user.LastLogon } else { "Jamais" }
Description = $user.Description
}
} | Format-Table-AutoSize# ── PARTIE 2 : Alertes sur les anomalies ──────────────────────────Write-Host"`n=== ALERTES SÉCURITÉ ==="-ForegroundColor Red
Get-LocalGroupMember-Group"Administrators" | ForEach-Object {
$memberName = $_.Name.Split("\")[-1]
$user = Get-LocalUser-Name$memberName-ErrorAction SilentlyContinue
if ($user-and$user.Description -eq"") {
Write-Host"[!] Admin sans description : $($_.Name) - SID: $($_.SID)"-ForegroundColor Yellow
}
if ($user-and$user.PasswordNeverExpires) {
Write-Host"[!] MDP ne expire jamais : $($_.Name)"-ForegroundColor Yellow
}
}
# Supprimer les comptes créés durant les exercicesRemove-LocalUser-Name"svc_update"Remove-LocalUser-Name"restricteduser"Remove-LocalGroup-Name"RestrictedCmdlets"# Vérifier que le nettoyage est completGet-LocalUser | Select-Object Name, Enabled, SID
Bonne pratique
Toujours nettoyer les comptes de test après les exercices. Restaurer ensuite le snapshot VM pour repartir sur une base propre avant le prochain chapitre.
✓
Résumé - Points clés à retenir
Pour l'Offensif
Vecteurs prioritaires
RID -500 identifie l'admin built-in même renommé. Backup Operators = escalade quasi-garantie vers dump SAM/NTDS. LocalSystem (S-1-5-18) = objectif final d'une compromission locale.
Pour le Défensif
Signaux d'alerte SOC
Event ID 4720 (création compte) + 4732 (ajout groupe) = surveiller en continu. Admin sans description + MDP non expirant + connexion récente inexpliquée = backdoor potentiel. Event ID 5001 = Defender désactivé.
Expliquer la structure d'un SID et identifier le RID depuis une chaîne SID
Citer les Well-Known SIDs critiques de mémoire (S-1-5-18, S-1-5-32-544, -500, -501)
Différencier les comptes intégrés (Administrator, Guest) des comptes système (SYSTEM, LocalService)
Identifier les groupes à risque - en particulier Backup Operators et Remote Management Users
Utiliser Get-LocalUser, Get-LocalGroup, Get-LocalGroupMember pour l'audit
Créer un utilisateur complet et l'ajouter à des groupes avec PowerShell
Écrire un script de détection d'anomalies dans les comptes administrateurs
Interroger les Event IDs 4720 et 4732 pour détecter des créations de comptes suspectes
Connaître les trois méthodes de désactivation de Defender et l'Event ID 5001 associé