Sauna

Dificultad: Easy - OS: Windows

¯\_( ͡° ͜ʖ ͡°)_/¯ Machine info

La máquina Sauna es un entorno de laboratorio diseñado para evaluar habilidades básicas en sistemas Windows y entornos de Active Directory (AD). El objetivo principal es comprometer una infraestructura corporativa simulada que incluye un controlador de dominio, utilizando vectores clásicos de ataque. El proceso comienza con una fase de enumeración, donde se identifican servicios activos como LDAP, SMB, y HTTP. A partir del contenido del sitio web, se extraen nombres completos de empleados, lo que permite construir posibles combinaciones de nombres de usuario. Con estos, se lleva a cabo un ataque ASREPRoasting, técnica que explota cuentas con Kerberos sin preautenticación, permitiendo la recolección de hashes que pueden ser forzados fuera de línea.

Una vez obtenidas las credenciales de acceso inicial, se establece una sesión remota mediante WinRM. Desde esta posición, se profundiza la post-explotación mediante herramientas de enumeración como WinPEAS, que revela la presencia de otra cuenta con inicio automático y credenciales expuestas en el sistema. Esta nueva cuenta, al igual que la anterior, cuenta con acceso remoto, pero además posee privilegios ampliados en el dominio. Utilizando BloodHound, se visualizan las relaciones y permisos dentro del AD, detectando que esta cuenta tiene derechos de replicación de cambios (DS-Replication-Get-Changes-All), lo que abre la posibilidad de ejecutar un ataque DCSync.

El ataque DCSync se lleva a cabo usando secretsdump.py, lo que permite extraer los hashes del administrador del dominio sin necesidad de acceder directamente al controlador. Con el hash del administrador, se implementa un ataque Pass-The-Hash mediante psexec.py, logrando así una shell con privilegios de NT AUTHORITY\SYSTEM.

Enumeración de puertos/servicios

┌──(root㉿kali)-[/home/kali/Documents/HTB]
└─# nmap -sCV --open -T4 -v -n 10.10.10.175
📌 Parámetros
  • sCV:

    • -sCEjecuta scripts de detección predeterminados → Usa los scripts de nmap ubicados en /usr/share/nmap/scripts/, los cuales buscan información adicional en los puertos abiertos.

    • -sVDetección de versiones → Intenta identificar el software y su versión en los puertos abiertos.

  • -nNo resuelve nombres de dominio (reduce el tiempo del escaneo).

  • --openMuestra solo puertos abiertos → Filtra la salida para no mostrar puertos cerrados o filtrados.

  • -T4Ajusta la velocidad del escaneo → T4 es un nivel "agresivo" que acelera el escaneo, útil en redes rápidas.

  • -vModo verbose → Muestra más detalles sobre el progreso del escaneo.

Resultado:

PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
80/tcp   open  http          Microsoft IIS httpd 10.0
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
|_http-title: Egotistical Bank :: Home
|_http-server-header: Microsoft-IIS/10.0
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-05-11 02:58:19Z)
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: EGOTISTICAL-BANK.LOCAL0., 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  tcpwrapped
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: EGOTISTICAL-BANK.LOCAL0., Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: SAUNA; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2025-05-11T02:58:34
|_  start_date: N/A
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
|_clock-skew: 6h51m03s

En síntesis:

Primero vamos a extraer el nombre de dominio para agregarlo al /etc/hosts

Inspección del sitio Web

Si recorremos la página web nos vamos a encontrar con algunos nombres de usuarios que podemos aprovechar para hacer un diccionario e intentar un ataque con Kerbrute para hallar algún nombre válido en el dominio.

Para hacer la lista voy a usar la siguiente tool AD-Username-Generator. Primero paso los nombres de los usuarios a una lista y esa lista se la pasó al script para que me haga el diccionario

Una vez generada una lista de posibles nombres de usuario, una de las herramientas más eficientes para verificar su validez en un entorno Kerberos es Kerbrute. Esta tool nos permite realizar una enumeración activa de cuentas contra un Controlador de Dominio mediante el protocolo Kerberos, sin necesidad de conocer previamente una contraseña válida. Su funcionamiento se basa en el envío de solicitudes de Ticket Granting Ticket (TGT) al KDC (Key Distribution Center), en las cuales no se incluye ninguna credencial. Esto desencadena una respuesta diferenciada por parte del servidor, dependiendo de si el nombre de usuario existe o no en el dominio.

Cuando un usuario no existe, el KDC responde con un error específico del protocolo (KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN), indicando que el principal es desconocido. En cambio, si el usuario sí existe pero requiere pre autenticación, el KDC devuelve un error distinto (KRB5KDC_ERR_PREAUTH_REQUIRED). Esta distinción permite a Kerbrute identificar cuáles entradas en la lista corresponden a usuarios válidos en el dominio. Adicionalmente, si una cuenta está configurada sin la exigencia de pre autenticación —es decir, tiene deshabilitada la opción DONT_REQ_PREAUTH—, el KDC responderá directamente con un ticket cifrado que puede ser utilizado para llevar a cabo un ataque de tipo ASREPRoasting, donde el atacante puede intentar romper el hash del ticket fuera de línea.

📌¿Qué es el KDC y el TGT?

KDC (Key Distribution Center) es un componente fundamental del protocolo Kerberos, utilizado ampliamente en entornos Windows con Active Directory. Su función principal es emitir y gestionar tickets de autenticación para los usuarios y servicios del dominio. El KDC está compuesto por dos servicios:

  • AS (Authentication Service): Se encarga de autenticar inicialmente al usuario.

  • TGS (Ticket Granting Service): Entrega tickets de acceso a servicios dentro del dominio.

Cuando un usuario desea autenticarse, contacta primero con el AS, que valida su identidad y, si todo es correcto, le entrega un TGT (Ticket Granting Ticket). Este TGT está cifrado con la clave secreta del servicio krbtgt (cuenta especial en Active Directory) y sirve como "pasaporte" del usuario dentro del dominio. El usuario usará luego ese TGT para pedir tickets de servicio específicos al TGS.

¿Qué relación tiene esto con el ataque ASREPRoasting?

Normalmente, el KDC requiere pre autenticación: el usuario debe enviar un timestamp cifrado con su clave derivada de la contraseña. Si es válido, el KDC devuelve el AS_REP con el TGT. Sin embargo, si una cuenta tiene deshabilitada la preautenticación (es decir, tiene la bandera DONT_REQ_PREAUTH activada), cualquiera puede solicitarle un TGT sin conocer su contraseña.

El KDC entonces responde con un AS_REP que incluye un bloque cifrado con la clave derivada de la contraseña del usuario, y ese bloque es precisamente el que se extrae y se ataca mediante fuerza bruta. Esto es el núcleo del ataque ASREPRoasting: obtener ese paquete sin necesidad de interacción directa ni credenciales válidas.

Si te interesa aprender más sobre el funcionamiento del protocolo Kerberos te recomiendo el siguiente artículo introductorio

ASREPRoasting attack

Una vez identificada una cuenta de usuario con la bandera DONT_REQ_PREAUTH habilitada —como es el caso de fsmith en este escenario—, es posible explotar una característica del protocolo Kerberos mediante un ataque conocido como ASREPRoasting. En este tipo de ataques, se solicita un Ticket Granting Ticket (TGT) al Key Distribution Center (KDC) sin necesidad de proporcionar una contraseña válida. El protocolo permite esta operación siempre que la cuenta en cuestión no requiera preautenticación. El KDC responde con un mensaje KRB_AS_REP, el cual contiene un TGT cifrado junto con un paquete adicional que incluye datos como la clave de sesión, la expiración del ticket y un nonce generado por el cliente. Este paquete está cifrado con una clave derivada directamente de la contraseña del usuario, y es este componente el que puede ser extraído y sometido a un ataque de fuerza bruta offline con herramientas como Hashcat o JohnthreRipper.

Este proceso de obtención del AS-REP cifrado y su posterior intento de descifrado con diccionarios se conoce coloquialmente como TGT Cracking. A pesar del nombre, el objetivo no es romper el TGT en sí, que está cifrado con la clave del servicio krbtgt, sino descifrar el bloque cifrado con la clave derivada de la contraseña del usuario objetivo. Esto permite descubrir contraseñas débiles sin interacción adicional con el sistema remoto, lo que representa un vector silencioso y eficaz dentro de una infraestructura de Active Directory mal configurada. Para aprender más técnicas como estas te recomiendo que leas los siguientes articulos que estan en este blog: Attacktive Directory (THM) y Attacking Kerberos (THM)

Para explotar esta técnica vamos a usar el script GetNPUsers de la suite de impacket. Este comando interactúa directamente con el AS del KDC, solicitando un AS_REP para fsmith. Como fsmith no requiere preautenticación, el KDC entrega el paquete con el bloque cifrado que se puede atacar. El hash extraído representa ese bloque, y es el que luego se fuerza con Hashcat o John.

📌Parámetros
  • EGOTISTICAL-BANK.LOCAL/fsmith: dominio y nombre de usuario objetivo.

  • -dc-ip 10.10.10.175: IP del Domain Controller (donde está corriendo el KDC).

  • -no-pass: indica que no se usará contraseña para autenticarse (clave en este ataque, ya que la cuenta no requiere preautenticación).

  • -format john: genera el hash en formato compatible con John the Ripper (para romperlo offline).

  • -outputfile hashes.txt: guarda los hashes extraídos en ese archivo.

TGT Cracking

Llegó el momento de descifrar la contraseña con John the Ripper

Bingo! ( ͡• ͜ʖ ͡•)

Ahora con el script service_validation.sh vamos a ver a qué servicios podemos conectarnos con estas credenciales capturadas

Vamos a aprovechar que podemos conectarnos al servicio WinRM, usando la tool EvilWinRM

System Enumeration con WinPeas.exe

Levantamos un servidor con python para compartir el recurso winPEASx64.exe, desde el directorio en donde se encuentra, y lo descargamos en la sesión del EvilWinRM

DCSync-Attack

Con estas nuevas credenciales vamos a invocar a nuestro amigo Bloodhound para poder ver los privilegios que tiene el usuario svc_loanmgr en el dominio y encontrar un camino para la escalada de privilegios. Si no conoces esta herramienta a continuación te dejo un artículo introductorio para que puedas comprender su uso

📌Parámetros
  • bloodhound-python: ejecuta el recolector Python para BloodHound (versión que no requiere cargar un ejecutable en la máquina objetivo).

  • -u svc_loanmgr: usuario que se usará para autenticarse en el dominio.

  • -p 'Moneymakestheworldgoround!': contraseña del usuario. Va entre comillas para manejar posibles caracteres especiales o espacios.

  • -d EGOTISTICAL-BANK.LOCAL: nombre completo del dominio de Active Directory.

  • -v: modo verbose, muestra salida detallada en la terminal mientras se realiza la recolección.

  • --zip: comprime los archivos JSON generados en un .zip, que luego podés importar directamente en la interfaz de BloodHound.

  • -c All: especifica qué tipos de datos recolectar. All significa que se ejecutarán todos los métodos disponibles: usuarios locales, ACLs, sesiones, relaciones de grupos, etc.

  • -dc EGOTISTICAL-BANK.LOCAL: FQDN (nombre completo) del Domain Controller contra el que se realizarán las consultas LDAP y Kerberos.

  • -ns 10.10.10.175: dirección IP del servidor DNS (generalmente el mismo que el Domain Controller en entornos AD). Se usa para resolver nombres del dominio si el sistema local no puede hacerlo.

Este comando recolecta toda la información relevante del dominio EGOTISTICAL-BANK.LOCAL utilizando la cuenta svc_loanmgr y genera un archivo .zip que luego puede ser cargado en BloodHound para visualizar relaciones, permisos y posibles caminos de escalamiento de privilegios.

Este archivo zip lo pasamos a la gui de bloodhound de la siguiente manera

Ahora podemos usar la opción Find Shortest Paths to Domain Admins para visualizar los nodos del DC

Luego si filtramos por Find Principals with DCSync Rights vamos a ver que nuestro usuario cuenta con privilegios DCSync en el dominio, esto nos permite deducir que podemos implementar un ataque DCSync para obtener los hashes de todas las cuentas del dominio junto con la de los administradores

El ataque DCSync permite a un atacante simular el comportamiento de un controlador de dominio legítimo. Para ello, se emiten peticiones al Domain Controller utilizando las funciones de replicación de Active Directory, como si el atacante necesitara sincronizarse con el resto del dominio. Estas peticiones acceden a la base de datos NTDS.dit, que contiene información crítica sobre los objetos del dominio, incluyendo los hashes NTLM de todas las cuentas: usuarios, administradores, y servicios. Al realizar esta solicitud desde una cuenta con los privilegios adecuados, el controlador de dominio responde con los datos de replicación, sin necesidad de comprometer el servidor físico ni ejecutar código malicioso sobre él. Nota: el nombre del privilegio que otorga la capacidad de ejecutar un ataque DCSync es GetChangesAll, lo que permite replicar la base de datos de Active Directory y extraer hashes de cualquier cuenta.

📌GetChangesAll

El permiso GetChangesAll es un privilegio extendido en Active Directory que permite a una cuenta replicar todos los atributos de los objetos del dominio, incluidos los hashes de contraseña de los usuarios.

Este permiso es uno de los tres necesarios para realizar un ataque DCSync, en el cual un atacante simula ser un controlador de dominio y solicita al Domain Controller la replicación de la base de datos del AD (NTDS.dit). Si una cuenta posee este privilegio —especialmente si se combina con GetChanges y Replicating Directory Changes—, puede extraer de forma remota los hashes de cualquier cuenta del dominio, incluidos los de administradores.

En resumen, GetChangesAll otorga control total sobre la replicación de objetos sensibles del dominio, y representa un riesgo crítico si está asignado a cuentas no administrativas o de servicio.

Para materializar esta técnica, vamos a utilizar la herramienta secretsdump.py de la suite Impacket. Esta utilidad permite extraer de forma remota los hashes del dominio haciendo uso de los privilegios de replicación del usuario comprometido.

Autenticación con Pass-the-Hash

Ahora que tenemos el hash del Administrator vamos a utilizar el script psexec de impacket para conectarnos al DC y capturar las flags ¯\_( ͡° ͜ʖ ͡°)_/¯

Last updated