unityActive

Dificultad: Easy - OS: Windows

chevron-right¯\_( ͡° ͜ʖ ͡°)_/¯ Machine infohashtag

El CTF “Active” se sitúa en un entorno Windows que simula un dominio de Active Directory, un tipo de infraestructura común en redes empresariales. A través de un análisis inicial de superficie (enumeración), se identifican varios servicios clave como SMB, Kerberos y LDAP. El primer vector de acceso se encuentra en la exposición de recursos compartidos, específicamente la carpeta “Replication”, la cual contiene archivos de políticas de grupo (Group Policy Preferences) accesibles de forma anónima. A partir de estos, se recupera un archivo Groups.xml con credenciales cifradas, las cuales pueden ser fácilmente desencriptadas gracias a una clave AES pública conocida, lo que facilita obtener una cuenta válida dentro del dominio.

Con estas credenciales, el siguiente paso implica realizar una enumeración más profunda, ahora autenticada, sobre los recursos compartidos y los usuarios del dominio. Utilizando herramientas como smbmap, ldapsearch y scripts de la suite Impacket, se puede consultar información sensible como flags de control de cuentas o la existencia de cuentas con Service Principal Names (SPN), que son esenciales para explotar un vector muy conocido en entornos Kerberos: el Kerberoasting. Este ataque permite solicitar y capturar tickets cifrados (TGS) que luego se crackean offline para revelar contraseñas de cuentas privilegiadas.

El acceso final al dominio se logra al crackear un hash Kerberos perteneciente a la cuenta de administrador, lo que habilita la ejecución remota de comandos con privilegios completos. Con herramientas como wmiexec.py, se establece una shell remota como Domain Admin, desde donde se puede acceder al archivo de recompensa final del reto. En conjunto, este CTF enseña técnicas prácticas de post-explotación en redes Windows, haciendo uso de vectores comunes como SMB misconfigurado, contraseñas embebidas en políticas de grupo y la debilidad del protocolo Kerberos frente al Kerberoasting.

Enumeración:

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

    • -sC: Ejecuta 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.

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

  • -n: No resuelve nombres de dominio (reduce el tiempo del escaneo).

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

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

  • -v: Modo verbose → Muestra más detalles sobre el progreso del escaneo.

Resultados:

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Microsoft DNS 6.1.7601 (1DB15D39) (Windows Server 2008 R2 SP1)
| dns-nsid: 
|_  bind.version: Microsoft DNS 6.1.7601 (1DB15D39)
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-04-20 05:47:02Z)
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: active.htb, 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: active.htb, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
49152/tcp open  msrpc         Microsoft Windows RPC
49153/tcp open  msrpc         Microsoft Windows RPC
49154/tcp open  msrpc         Microsoft Windows RPC
49155/tcp open  msrpc         Microsoft Windows RPC
49157/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49158/tcp open  msrpc         Microsoft Windows RPC
49165/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows_server_2008:r2:sp1, cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2025-04-20T05:47:59
|_  start_date: 2025-04-20T05:45:02
| smb2-security-mode: 
|   2:1:0: 
|_    Message signing enabled and required
|_clock-skew: -8m44s

En síntesis, los puertos donde nos vamos a centrar:

Lo primero que vamos a hacer es agregar el dominio que nmap nos arrojó a nuestro archivo /etc/hosts para evitar problemas con el virtual host.

Lo segundo que haremos es sincronizar el horario del equipo kali con el del servidor, ya que nmap también nos detecto esa falla con el siguiente mensaje clock-skew: -8m44s: Esto indica una diferencia de tiempo (desfase) entre el reloj del escáner (máquina kali) y el del servidor. En este caso, el reloj del servidor está adelantado 8 minutos y 44 segundos respecto al del kali. Esto puede ser relevante en ataques como Kerberoasting o Pass-the-Ticket, donde una desincronización importante puede invalidar tickets de autenticación basados en tiempo.

Unauthenticated enumeration

Empezamos por enumerar recursos con smbmap conectándonos sin credenciales

En este punto nos vamos a encontrar con el directorio Replication, y si exploramos su contenido vamos a encontrar el archivo Groups.xml que contiene información sensible sobre una cuenta de dominio (SVC_TGS) y su contraseña cifrada. Esta contraseña fue almacenada mediante un cifrado AES-256 que, si bien puede parecer seguro, utiliza una clave pública que fue publicada por Microsoft en su documentación. Esto permite que cualquier atacante con acceso de lectura al archivo pueda desencriptar la contraseña fácilmente con herramientas como gpp-decrypt. Esta exposición de credenciales es el reflejo de una mala configuración de los entornos que está relacionada con la GPP.

Group Policy Preferences (GPP): las GPP son una extensión de las Directivas de Grupo clásicas utilizadas en entornos de Active Directory, que permiten a los administradores configurar ajustes específicos en equipos unidos al dominio. Entre otras funcionalidades, permiten la creación de cuentas locales y la aplicación de configuraciones sin necesidad de scripting, utilizando archivos XML almacenados en el recurso compartido SYSVOL, el cual es accesible para todos los usuarios autenticados del dominio.

En este caso el recurso Replication resulta ser una copia del SYSVOL

Lo siguiente que hacemos es conectarnos al equipo objetivo con smbclient para buscar el archivo Groups.xml y descargarlo

Nota: si quieres aprender más sobre las GPP te recomiendo el siguiente artículo

Groups.xml

gpp-decrypt: la herramienta gpp-decrypt se utiliza para descifrar contraseñas almacenadas en archivos XML generados por las Group Policy Preferences (GPP) en entornos de Active Directory.

Una vez que tenemos credenciales nuevas lo mejor es validarlas contra los servicios más comunes para encontrar el siguiente vector de ingreso. Para automatizar este proceso diseñe el siguiente script en bash que puedes encontrar en mi repositorio: service_validation.sharrow-up-right

Vemos que las credenciales funcionan para conectarnos al smb, entonces podemos volver a enumerar recursos smbmap y ver si encontramos algo nuevo:

Navegando por el directorio User con smbclient nos vamos a encontrar con la user flag

Otra forma de conectarnos al SMB especificando usuario y contraseña en la misma línea es de la siguiente forma:

Kerberosting con impacket-GetUserSPNs.py

Lo siguiente que vamos a implementar es un ataque Kerberoasting ya que también tenemos acceso al servicio LDAP. Si no estás familiarizado con este tipo de ataques te recomiendo que veas la siguiente sala de THM que resolví en este blog Attacking Kerberos, allí podrás ver en detalle cómo y porqué funciona este tipo de ataques. Pero básicamente vamos a enumerar cuentas de usuario en Active Directory que tengan configurado un Service Principal Name (SPN). Un Service Principal Name (SPN) es un identificador único que vincula una cuenta de servicio con una instancia específica de un servicio dentro de un dominio. Cuando un usuario tiene un SPN asignado, podemos solicitar un Ticket de Servicio (TGS) para ese SPN. El ticket estará cifrado con el hash NTLM de la cuenta de servicio. Si esa cuenta tiene privilegios elevados y una contraseña débil, podemos crackear el TGS offline y obtener acceso. Para realizar el Kerberosting usaremos impacket-GetUserSPNs.py

chevron-right📌Parámetroshashtag
  • active.htb/SVC_TGS:GPPstillStandingStrong2k18 Indica las credenciales usadas para autenticarse. active.htb es el nombre del dominio, SVC_TGS es el nombre del usuario, GPPstillStandingStrong2k18 es la contraseña del usuario.

  • -dc-ip 10.10.10.100 Especifica la IP del Domain Controller con el que se va a comunicar la herramienta.

  • -request Le indica a la herramienta que además de listar los usuarios con SPN, solicite sus tickets TGS, necesarios para Kerberoasting.

  • -outputfile spn.txt Especifica que la salida con los hashes TGS obtenidos será guardada en un archivo llamado spn.txt, listo para usar con herramientas como hashcat.

TGS Cracking con John

Ahora para descifrar el hash del TGS con John The Ripper

chevron-right📌Parámetroshashtag
  • --format=krb5tgs Indica el tipo de hash que se va a crackear. En este caso, es un hash Kerberos TGS (Ticket Granting Service), lo que corresponde a un ataque de Kerberoasting.

  • -w=/usr/share/wordlists/rockyou.txt Especifica el diccionario que se va a usar para el ataque. En este caso, es el archivo rockyou.txt, un diccionario común que contiene millones de contraseñas potenciales.

  • spn.txt Es el archivo que contiene el hash Kerberos TGS extraído previamente con GetUserSPNs.py -request. Este es el hash que se intentará crackear.

Ahora que conseguimos otro par de credenciales nuevas podemos chequear cuales son los servicios a los que podemos acceder:

Remote Code Execution con Psexec

Para finalizar el CTF nos conectamos al equipo objetivo con impacket-psexec y buscamos las flags que nos faltan. Para comprender mejor el funcionamiento de esta herramienta te recomiendo que leas el siguiente artículo:

Otra forma de conectarnos con psexec especificando usuario y contraseña en la misma línea es con el siguiente comando:

Otra forma de localizar archivos específicos como flags, desde la raíz, es usando el comando dir file_name /s

Bonus: Pass the hash con impacket-secretsdump

¿Qué es un ataque Pass-the-Hash?

El ataque Pass-the-Hash permite autenticarse contra servicios de red (como SMB, WinRM, WMI, RDP) sin conocer la contraseña, usando directamente el hash NTLM del usuario como si fuera su credencial. Esto sí se puede hacer si tenés el hash NTLM completo (no cifrado) de la cuenta. Para implementar este ataque usaremos impacket-secretsdump

chevron-right📌Parámetroshashtag
  • active.htb/administrator:Ticketmaster1968 Credenciales válidas usadas para autenticarte en el dominio:

    • active.htb: nombre del dominio.

    • administrator: usuario con privilegios.

    • Ticketmaster1968: contraseña del usuario.

  • @10.10.10.100 IP del controlador de dominio o del sistema objetivo.

  • -just-dc-ntlm Le indica a la herramienta que extraiga solamente los hashes NTLM de los usuarios del dominio (no secretos LSA, ni claves Kerberos, ni contraseñas en texto claro). Utiliza el método DRSUAPI sobre el controlador de dominio para acceder directamente a NTDS.DIT.

Ahora le pasamos el hash a impacket-psexec o impacket-wmiexec, no podemos usar EvilWinRM para este caso porque no está disponible el puerto de winrm

Localizando Groups.xml con impacket-Get-GPPPassword

Cuando un entorno es vulnerable a la exposición de contraseñas vía GPP, podemos usar impacket-Get-GPPPassword para buscar el fichero Groups.xml, pero se recomienda tener previamente credenciales de algún usuario

Last updated