Page cover

🔴Haze

En esta ocasión vamos a hacer el writeup de la máquina Haze de Hack the Box, una máquina Windows de dificultad Hard.

Primer contacto

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

Escaneo de puertos

El host 10.10.11.61 es un Domain Controller Windows (presencia de Kerberos, LDAP y Global Catalog) con Splunkd expuesto por múltiples puertos HTTP/HTTPS. Esto sugiere vectores de ataque tanto en el dominio como en aplicaciones web internas como Splunk.

Puerto
Servicio
Descripción Técnica

53

DNS

Resolución interna, útil para zona DNS y enum. de subdominios

88

Kerberos

Confirmación de Active Directory

135/139/445

MSRPC, NetBIOS, SMB

Vectores comunes para null sessions, shares, y enumeración de usuarios

389/636/3268/3269

LDAP y GC (LDAP + LDAPS)

Enumeración de usuarios y grupos del dominio

5985

WinRM

Ejecución remota si conseguimos credenciales

8000/8088/8089

Splunkd

Acceso al panel de Splunk, posiblemente vulnerable

Domain Controller

  • FQDN: dc01.haze.htb

  • Dominio: haze.htb

  • Windows Server 2022

  • Single-domain forest

Enumeración de usuarios

Usando Kerbrute para enumerar usuarios del sistema parece que solo nos encuentra al usuario administrator:

Splunk App

Puerto 8000

  • Búsquedas guardadas con scripts incrustados

  • Capacidades de carga de archivos de búsqueda

  • Inyección de XML en el panel de control

No funcionan las credenciales por defecto admin:changeme

Puerto 8089

  • Configuración del servidor de implementación

  • Versión 9.2.1 (podríamos encontrar algún exploit público)

Búsqueda de exploits

Buscando exploits públicos vemos que es vulnerable a Path Traversal con el CVE-2024-36991:

Al ejecutarlo, revela archivos de configuración, el etc/passwd, logs y historial, archivos y servicios de sistema y scripts en entornos Splunk sin autenticación, explotando un Path Traversal:

Deglose

Usuarios de etc/passwd

Concretamente encuentra 3 usuarios nuevos, además del admin:

Archivos de configuración de Splunk

  • splunk.secret

Este archivo contiene la clave maestra simétrica AES-256 que Splunk usa para cifrar y descifrar secretos internos como:

  • Contraseñas en archivos .conf (como authentication.conf, inputs.conf)

  • Tokens

  • Credenciales LDAP en texto cifrado

Si tienes este archivo, puedes descifrar las contraseñas cifradas en otros archivos .conf del entorno.

  • autentication.conf

Este archivo define cómo se autentican los usuarios de Splunk, incluyendo:

  • Reglas de complejidad de contraseñas

  • Métodos de autenticación externos como LDAP, SAML, etc.

  • Usuarios locales definidos manualmente

  • Credenciales cifradas (del usuario Paul Taylor)

De igual manera podríamos capturar estos archivos haciendo un curl con el Path Traversal o con BurpSuite:

Cracking de contraseña cifrada

La contraseña está cifrada, por lo que vamos a usar Splunksecrets para crackearla:

Para usar la herramienta necesitamos el parámetro splunk.secret y la clave cifrada del autentication.conf que descubrimos antes.

Lo guardamos en un archivo de texto secret.txt

Splunksecrets

Cuando nos muestre Ciphertext le pasamos la clave cifrada de usuario Paul Taylor que encontramos antes:

Tenemos una contraseña en plano! Comprobamos que funciona con crackmapexec:

Enumeración con credenciales

Usamos crackmapexec para enumerar con credenciales usuarios del entorno AD:

Vemos que hay varios usuarios nuevos. Los añadiremos a una lista completa de usuarios válidos que hemos recopilado:

Password Spraying

Vamos a ver si esa contraseña la utilizan más usuarios:

Bingo, el usuario Mark Adams también la utiliza!

Análisis con BloodHound

Bloodhound-python

Análisis

Vemos que el usuario mark pertenece al grupo GMSA_MANAGERS (Group Managed Service Accounts:

Los administradores de gMSA tienen privilegios para acceder a las contraseñas de cuentas de servicio gestionadas en Active Directory. Esto permite:

  • Leer contraseñas en texto claro desde el atributo msDS-ManagedPassword.

  • Realizar ataques de retransmisión NTLM para acceder a ese atributo.

  • Ejecutar ataques “gMSA dorado” si se compromete la clave raíz del KDS, generando contraseñas de gMSA sin conexión.

Estos privilegios permiten la suplantación de identidades y posibles escaladas de privilegios.

Leer la contraseña de GMSAPassword

Usaremos gMSADumper:

Mark no tiene este permiso actualmente, pero pertenece al grupo de administradores y puede agregar permisos a sí mismo. Ten en cuenta que gMSA no es un grupo, sino un tipo de cuenta especial, por lo no puedes encontrarlo en bloodhound.

Vamos a conectarnos por evil-winrm:

Puede comprobar el tipo de cuenta de Haze-IT-Backup$ con el siguiente comando:

¿Quién tiene permiso para ver su contraseña? Sólo administradores de dominio

Mark está en el grupo de administradores de gMSA, así que intenta modificar el usuario legible.

Luego volvemos a ejecutar gMSADumper y vemos que nos devuelve el hash del usuario Haze-IT-Backup$:

Intentamos conectarnos por RDP y evil-winrm pero no podemos con este usuario. Para verificar que mark.adams tiene permiso de escritura, podemos ejecutar el siguiente comando para ver la lista de control de acceso de Backup :

Bloodhound con privilegios

Como es un usuario con más privilegios, vamos a volver a ejecutar bloodhound-python con este usuario.

Se puede ver que el usuario BACKUP puede modificar el propietario del grupo SUPPORT , y el grupo SUPPORT puede modificar la contraseña de EDWARD Shadow Credential y lanzar ataques.

A continuación, configure Backup como propietario del grupo.

Agregarnos al grupo SUPPORT

Cambiar propietario del grupo support a BACKUP:

Nos añadimos todos los permisos a nosotros mismos:

Y nos agregamos al grupo:

Cambiar la contraseña de EDWARD

Ahora el usuario BACKUP puede cambiar la contraseña del usuario EDWARD usando Shadown Credential:

Generar TGT con PKINITtools

Lo clonamos en nuestro directorio actual, dentro de pywhisker:

Sincronizamos el reloj con el DC

Generamos el TGT

Obtenemos la clave hexadecimal necesaria

Configuramos la variable de entorno

Extraer el hash NTLM

Hemos conseguido el hash de Edward Martin!

User flag

Escalada de privilegios

En el directorio c:/ hay un directorio Backups interesante que contiene un backup de Splunk, que podría contener credenciales de usuarios:

Descarga del backup de Splunk

Después de la descarga, vemos que es el código fuente de respaldo del sitio web, que es diferente del contenido real del sitio web.

Credential Hunting de Splunk

Una vez descomprimimos el zip buscamos cadenas similares a contraseñas y buscamos según el formato de contraseña de Splunk.

Encontramos un password encriptado en authentication.conf. Usaremos splunksecrets para crackearlo.

Tenemos la contraseña en plano, y indica que pertenece a un administrador. SI no ha cambiado la contraseña posiblemente podamos acceder a través de la aplicación de Splunk en producción.

Acceso a Splunk

Estamos dentro! Vamos a seguir los pasos de la sección dedicada:

💣Splunk - Ataques

Preparación del exploit

Vamos a usar este repositorio:

Este directorio contiene 2 carpetas, una con ejecutables y una con un archivo de configuración.

Editamos run.ps1 para añadir nuestra IP y puerto de atacante:

También editamos inputs.conf de la siguiente manera:

Una vez guardamos los archivos lo comprimimos con el siguiente comando:

Subida del exploit

Dentro de Apps hacemos click en Install app from file:

Aquí le damos a Browse, cargamos el archivo updater.tar.gz y le damos a Upload:

Antes de darle debemos configurar un listener de Netcat para recibir la conexión, y al darle a Update automátcamente conseguimos la shell!

Tenemos una shell con el usuario alexander.green, vamos a ver información del usuario y sus permisos:

Tenemos SeImpersonatePrivilege habilitado. Podemos consultar la siguiente sección para explotarlo:

📘SeImpersonate y SeAssignPrimaryToken

También vemos que pertenece al grupo HAZE\Splunk_Admins, por lo que si conseguimos un Meterpreter sería muy fácil escalar privilegios a SYSTEM con getsystem.

Aumentar privilegios con JuicyPotato

Enviamos el JuicyPotato.exe y un binario estático de Netcat a la máquina:

Y lo ejecutamos de la siguiente manera:

El error 10038 significa literalmente: “El descriptor no es un socket.” En el contexto de JuicyPotato, suele indicar que:

  1. El CLSID usado no es válido o no permite activación con el token actual.

  2. El puerto especificado (-l 53375) no está abierto o en uso.

  3. No se puede establecer comunicación con el COM Server adecuado.

Como el proceso de conseguir CLSIDs válidos es un tanto extenso, vamos a optar por conseguir un Meterpreter y elevar a SYSTEM para hacer un hashdump.

Meterpreter Webdelivery

Configura un Powershell web delivery escuchando en el puerto 8080.

Ejecutar el comando en la máquina objetivo

Recibiendo el Meterpreter

Consiguiendo SYSTEM

Acceso a la flag

Extra: Hashdump

Y ya habríamos comprometido totalmente la máquina!

Última actualización

¿Te fue útil?