Page cover

🟠Puppy

En esta ocasión vamos a hacer el writeup de la máquina Puppy de Hack the Box, una máquina Windows Active Directory de dificultad medium.

Información General

  • Nombre de la máquina: Puppy

  • IP: 10.10.11.70

  • Sistema operativo: Windows

  • Dificultad: 🟡 Media

  • Fecha: 26/05/2025

Pista inicial

La plataforma nos proporciona las credenciales iniciales para esta máquina:

Primer acceso

Añadimos la IP 10.10.11.70 a nuestro /etc/hosts y accedemos través del navegador.

Escaneo de puertos

Encontramos multitud de puertos abiertos, lo normal en máquinas Windows. Ademas nos encontramos con que la máquina objetivo es un Domain Controller, por la presencia de los puertos 3268 o 389, reservados para DCs.

Destacan los puertos:

  • 111 (RPC) - Puede contener recursos compartidos o enumerar usuarios

  • 445 (SMB) - Recursos compartidos y enumeración

  • 5985 (WinRM) - Acceso con EvilWinRM con contraseña

  • 88 (Kerberos) - Posible Kerberoasting o AS-REP Roasting

Enumeración inicial

Enumeración con credenciales

Shares - Recursos compartidos

Encontramos un Share DEV interesante, pero no tenemos permisos de lectura, y analizando el resto de Shares no encontramos nada relevante. Seguramente si conseguimos un usuario del grupo DEVELOPERS podríamos acceder.

Usuarios

Añadimos los usuarios encontramos a un archivo valid-users.txt. Probar a volcar tickets Kerberos mediante ASREP-Roasting falla:

Enumeración con Bloodhound

Editar resolv.conf

Bloodhound Python

Análisis con Bloodhound

Encontramos que el usuario levi.james pertenece al grupo HR, que a su ver tiene permisos GenericWrite sobre el grupo DEVELOPERS.

En el grupo DEVELOPERS encontramos 3 miembros:

  • ant.edwards

  • adam.silver

  • jamie.williams

Analizando a los 3 usuarios vemos que el usuario ant.edwards es miembro del grupo SENIOR DEVS y este grupo tiene permisos GenericAll sobre el usuario adam.silver

Los usuarios adam.silver y jamie.williams tienen permisos AllExtendedRights sobre el grupo ADMINISTRATORS, del cual es miembro el usuario steph.cooper.

Resumen de Relaciones de Privilegio

Levi.james → HR → DEVELOPERS → SENIOR DEVS → ADMINISTRATORS

  1. levi.jamesHR

  2. ✅ HR tiene GenericWrite sobre el grupo DEVELOPERS

  3. DEVELOPERS incluye a:

    • ant.edwards

    • adam.silver

    • jamie.williams

  4. ant.edwardsSENIOR DEVS

  5. SENIOR DEVS tiene GenericAll sobre adam.silver

  6. adam.silver y jamie.williams tienen AllExtendedRights sobre el grupo ADMINISTRATORS

  7. steph.cooperADMINISTRATORS

Ruta de escalada

1. Añadir a levi.james al grupo DEVELOPERS

Confirmación

Ahora tenemos acceso a SENIOR DEVS. Parece que no podemos acceder a ningún equipo, ni cambiar la contraseña de adam.silver directamente, por lo que vamos a volver a numerar los Shares:

Ahora ya si tenemos permisos de lectura en el Share DEV. Vamos a ver que hay en su interior:

Encontramos varios archivos interesantes:

  • KeePassXC-2.7.9-Win64.msi - Instalador de KeePassXC (gestor de contraseñas). Potencialmente indica que se usa esta app para guardar credenciales.

  • recovery.kdbx - Archivo de base de datos de KeePass

2. Extracción de recovery.kdbx

Nos descargamos el archivo recovery.kdbx y al crackearlo con keepass2john nos da un error que significa que el archivo .kdbx fue creado con una versión más nueva del formato KeePass que keepass2john no soporta aún.

Para crackearlo usaremos la alternativa keepass4brute:

Vamos a abrirlo con keepassxc, ponemos la contraseña y vemos el contenido correctamente:

Ahora creamos un archivo de volcado XML desde Base de datos > Exportar > Archivo XML. Lo guardamos con el nombre keepass_dump.xml.

Ahora con el siguiente script en python haremos el volcado de las contraseñas de keepass_dump.xml:

Bingo! Tenemos las contraseñas. Las guardamos en un archivo de texto y haremos un Password Spraying, ya que tenemos la lista de usuarios válidos.

3. Password Spraying

Bingo! Tenemos la contraseña de ant.edwards:Antman2025!

4. Bloodhound con ant.edwards

Usando estas credenciales volvemos a ejecutar bloodhound-python para obtener más información del dominio. Observamos que ant.edwards pertenece al grupo SENIOR DEVS y tiene permisos GenericAll sobre adam.silver:

Y vemos que adam.silver tiene permisos AllExtendedRights sobre el grupo ADMINISTRATORS:

5. Confirmación de permisos de escritura

6. Cambio de contraseña

Después, cambiaremos la contraseña de Adam con la herramienta rpcclient. Sin embargo, la cuenta está deshabilitada. Por lo tanto, la habilitaremos con la herramienta bloodyAD y luego cambiaremos la contraseña con rpcclient.

Cuenta deshabilitada

Quitar el Account Disable

Cambiar contraseña con rpcclient

Confirmación


User flag

Conexión por EvilWinRM


Escalada de privilegios

En el directorio c:/ nos encontramos un directorio de Backups que podría contener credenciales:

Al descomprimir el zip encontramos un archivo de configuración en XML que contiene las credenciales de steph.cooper!

Confirmación

Conexión por EvilWinRM

Al conectarnos vemos que en el desktop no está la flag, por lo que necesitaremos el hash o contraseña del usuario administrator:

Comprobación de privilegios

A continuación, buscaremos el archivo de la clave maestra (clave de cifrado) y lo copiaremos a nuestra máquina. Después, también obtendremos el archivo blob de credenciales, que contiene las credenciales de usuario cifradas (como contraseñas o tokens).

La clave maestra es una clave secreta que se utiliza para cifrar y descifrar datos con la API de protección de datos (DPAPI). El blob de credenciales contiene las credenciales de usuario protegidas por DPAPI. Utilizaremos estos archivos para descifrar sin conexión las credenciales protegidas por DPAPI mediante el script dpapi.py de Impacket.

Para recuperar los archivos, iniciaremos un servidor SMB y nos aseguraremos de que esté en ejecución durante el proceso. Los archivos (clave maestra y blob de credenciales) se transferirán a la carpeta compartida que creamos en el recurso compartido SMB.

1. Iniciar SmbServer

2. Localizar la carpeta de credenciales

Para ver el contenido de su interior necesitamos hacer un ls -force:

3. Copia la clave maestra DPAPI al recurso compartido

4. Copia el blob de contraseñas

Ahora en nuestro directorio local /tmp/smbshare tenemos los archivos descargados

5. Conocer el SID

6. Desencriptado de clave

7. Desencriptado del credential_blob

FInalmente, obtenemos la contraseña del usuario steph.cooper_adm: FivethChipOnItsWay2025!

8. Análisis de Bloodhound

Analizando de nuevo con Bloodhound y estas credenciales, observamos que el usuario steph.cooper_adm tiene permisos AllExtendedRights sobre el dominio, lo que nos permitiría realizar un ataque DCSync y volcar todos los hashes:

9. Ataque DCSync

Tenemos el hash de Administrator!

Confirmación


Root flag

Vamos a conectarnos con psexec para ganar el Domain Admin.

Acceso a la flag

Última actualización

¿Te fue útil?