Raz0rBlack
Dificultad: medium - OS: Windows
Enumeración de puertos/servicios
┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# nmap -sCV --open -T4 -v -n 10.10.18.112Resultado:
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-05-28 05:46:28Z)
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/tcp6 rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 2,3,4 111/udp6 rpcbind
| 100003 2,3 2049/udp nfs
| 100003 2,3 2049/udp6 nfs
| 100003 2,3,4 2049/tcp nfs
| 100003 2,3,4 2049/tcp6 nfs
| 100005 1,2,3 2049/tcp mountd
| 100005 1,2,3 2049/tcp6 mountd
| 100005 1,2,3 2049/udp mountd
| 100005 1,2,3 2049/udp6 mountd
| 100021 1,2,3,4 2049/tcp nlockmgr
| 100021 1,2,3,4 2049/tcp6 nlockmgr
| 100021 1,2,3,4 2049/udp nlockmgr
| 100021 1,2,3,4 2049/udp6 nlockmgr
| 100024 1 2049/tcp status
| 100024 1 2049/tcp6 status
| 100024 1 2049/udp status
|_ 100024 1 2049/udp6 status
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: raz0rblack.thm, 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
2049/tcp open nlockmgr 1-4 (RPC #100021)
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: raz0rblack.thm, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
3389/tcp open ms-wbt-server Microsoft Terminal Services
| ssl-cert: Subject: commonName=HAVEN-DC.raz0rblack.thm
| Issuer: commonName=HAVEN-DC.raz0rblack.thm
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2025-05-27T05:29:02
| Not valid after: 2025-11-26T05:29:02
| MD5: 2b8a:decd:33bd:ac25:58ca:5216:729f:88b5
|_SHA-1: b1ee:9be1:83b6:a528:d0c7:6990:45ea:8875:0ac8:0328
|_ssl-date: 2025-05-28T05:47:29+00:00; -9m06s from scanner time.
| rdp-ntlm-info:
| Target_Name: RAZ0RBLACK
| NetBIOS_Domain_Name: RAZ0RBLACK
| NetBIOS_Computer_Name: HAVEN-DC
| DNS_Domain_Name: raz0rblack.thm
| DNS_Computer_Name: HAVEN-DC.raz0rblack.thm
| Product_Version: 10.0.17763
|_ System_Time: 2025-05-28T05:47:20+00:00
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: HAVEN-DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2025-05-28T05:47:24
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_clock-skew: mean: -9m06s, deviation: 0s, median: -9m06sEn síntesis:
Ya viendo estos puertos podemos deducir lo siguiente: la presencia de servicios como Kerberos (88/tcp), LDAP (389 y 3268/tcp), y SMB (445/tcp) confirman que se trata de un entorno de Active Directory, lo que habilita vectores de ataque como AS-REP Roasting, Kerberoasting, y enumeración de usuarios a través de LDAP. Luego el puerto 2049/tcp (NFS) es particularmente relevante, ya que nos permite montar recursos remotos y extraer archivos accesibles que pueden contener información sensible, como credenciales o listas de usuarios. Network File System (NFS), es un protocolo de red que permite a los usuarios montar sistemas de archivos remotos y trabajar con ellos como si estuvieran en su propia máquina local. Otros elementos que nos arroja nmap en este escáner son:
La diferencia horaria del servidor kerberos con mi equipo Kali: esto es importante en contextos de Kerberos, ya que este protocolo es muy sensible a la sincronización horaria. Una diferencia mayor a 5 minutos por defecto puede causar que el cliente no pueda autenticarse correctamente, afectando herramientas como
Kerbruteoimpacketcuando se realizan ataques como AS-REP Roasting o Kerberoasting.Nmap también detectó información útil de dominio a través de servicios como LDAP y RDP (
rdp-ntlm-infoy certificados SSL), incluyendo:raz0rblack.thm(dominio principal)HAVEN-DC.raz0rblack.thm(nombre FQDN del controlador de dominio)HAVEN-DC(nombre del host NetBIOS)
Para asegurar una correcta resolución DNS durante el CTF (especialmente para herramientas que dependen del nombre de dominio o de servicios Kerberos), es necesario mapear la IP de la máquina al dominio en el
/etc/hostsdel equipo Kali
Para solucionar estos inconvenientes vamos a usar los siguientes comandos:
Enumeración NFS (Puerto 2049)
El procedimiento para ver los recursos compartidos a través del protocolo NFS y montarlo luego en nuestro equipo es el siguiente:
Listamos los recursos compartidos remotos que están disponibles en NFS.
Creamos una carpeta local donde montaremos el recurso
Montamos el recurso compartido en la carpeta local
showmount -e 10.10.18.112→ consulta al servidor NFS (en este caso10.10.18.112) y muestra los directorios que están siendo exportados (compartidos) a través del servicio NFS. El parámetro-een el comandoshowmountsignifica "exports", y su función es mostrar los directorios que el servidor NFS está exportando (compartiendo).mount -t nfs 10.10.18.112:/users ./NFS→ monta el recurso compartido/usersdel servidor NFS en el directorio local./NFS.
Dentro de este recurso vamos a encontrar dos archivos, en sbradley.txt esta la primera flag y en employee_status.xlsx vamos a encontrar lo siguiente:
Se trata de un archivo de tipo Excel, específicamente en el formato Office Open XML Spreadsheet que contiene nombres de usuarios del dominio.
Para extraer los metadatos en busca de información sensible y parsear los usuarios de cualquier archivo .xlsx a un formato de usuarios de AD diseñe el siguiente script en python xlsx_extract.py que nos va a ayudar a obtener un diccionario para la siguiente etapa
AS-REP Roasting attack
As-Rep roasting es una técnica dirigida contra usuarios de Active Directory que no requieren pre autenticación Kerberos. Esta debilidad permite extraer un ticket cifrado directamente del Domain Controller, para luego intentar crackearlo offline y obtener la contraseña de x usuario. Si no conoces esta técnica te recomiendo que leas los siguientes artículos de este blog Attacking Kerberos y Attacktive Directory.
Para realizar el ataque podemos usar impacket-GetNPUsers o Kerbrute y guardar la salida en un fichero para luego crackearlo con John the Ripper
Opción 1: impacket-GetNPUsers.
Opción 2: Kerbrute.
TGT cracking con John
Una vez que obtenemos el hash del usuario podemos descifrar su contraseña con John the Ripper:
Nota: en un ataque AS-REP Roasting no se craquea el TGT completo. Lo que se craquea es una parte del mensaje AS-REP (respuesta del Domain Controller) que contiene un bloque cifrado con la clave derivada de la contraseña del usuario. Si tenes dudas sobre el funcionamiento de este servicio te recomiendo que leas el siguiente artículo:
Una vez que logramos obtener un nuevo par de credenciales lo más recomendable es testear contra que servicios nos permite ingresar, de esta forma tendremos una idea de por donde continuar el ataque/intrusión. Para automatizar esta tarea diseñe un script en bash que lo podes obtener del siguiente repositorio: service_validation
Enumeración de recursos smb
Esta vez usaremos la tool nxc para ver si tenemos permisos de escritura o lectura en el contenido de la unidad compartida con las credenciales twilliams:roastpotatoes
Enumeración de usuarios del dominio con impacket-lookupsid
Los resultados de la enumeración del smb nos muestran que tenemos permisos de lectura sobre el recurso IPC$, este recurso es clave porque nos permite enumerar más objetos del dominio con herramientas como impacket-lookupsid
¿Qué es IPC$?
IPC$(Inter-Process Communication share) es una carpeta especial que permite conexiones remotas a funciones administrativas, como autenticación, sesión de servicios, etc.No contiene archivos visibles, pero sí podemos conectarnos a
IPC$, significa que el usuario tiene algún tipo de privilegio en el dominio, como para usar llamadas RPC.Aunque no tengamos acceso a otras carpetas de archivos (
users,shared, etc.), acceder aIPC$ya es suficiente para enumerar información sensible, como usuarios y grupos, usando RPC.
Ahora vamos a usar un script que diseñe en bash que implementa la enumeración de usuarios con lookupsid pero también parcea el output y nos deja una lista con los nombres de los usuarios en limpio para un posterior ataque. El script lo podes descargar desde el siguiente repositorio: lookupsid_enum.sh
Password spray con Kerbrute
Ahora que contamos con otra lista de usuarios vamos a intentar buscar otros usuarios que usen la misma contraseña que twilliams a través del ataque password spraying que consiste en probar una sola contraseña común contra múltiples usuarios.
Password Reset via SMB con impacket-smbpasswd
Kerbrute encontró un usuario cuya contraseña era la misma que la del usuario twilliams pero que además está ya expiró confirmándolo con el siguiente mensaje: "User's password has expired"
Este mensaje indica que:
El usuario existe y las credenciales son correctas.
El login no falla por contraseña inválida, sino por una política de expiración de contraseñas.
AD está rechazando la autenticación porque la contraseña es válida pero antigua, y se requiere que el usuario la cambie.
Cuando un usuario tiene la contraseña expirada, Active Directory espera que el usuario la reemplace al iniciar sesión. Esto significa que:
El protocolo SMB (vía SAMR) permite realizar un
PasswordChangeUserPasswordsin necesidad de la contraseña actual.La autenticación inicial no requiere éxito total, solo que la cuenta esté activa y que el cambio esté permitido por política.
Sabiendo esto podemos usar impacket-smbpasswd o impacket-changepasswd para aplicar un cambio de contraseña al usuario sbradley y hacernos con su cuenta:
Opción 1: impacket-smbpasswd
Opción 2: impacket-changepasswd
Con este nuevo par de credenciales sbradley:Password123 vamos a chequear nuevamente a que servicios nos permite acceder, usando el script service_validation.sh
Enumeración de recursos smb con nxc
Los resultados del script anterior nos indica que podemos acceder al smb, por ende vamos a listar esos recursos y verificar si tenemos algún permiso nuevo sobre alguno de los directorios usando nxc
Cómo tenemos acceso al directorio trash vamos a conectarnos con smbclient y buscar más recursos expuestos de valor
Nota: el parámetro -m SMB2 es para forzar a smbclient a usar el protocolo SMB2 en lugar de SMB1, lo que evita problemas de timeout y desconexión durante la descarga del archivo .zip. MB2 es más eficiente, moderno y mejor en manejo de archivos grandes, lo que evita errores como NT_STATUS_IO_TIMEOUT que podemos tener con SMB1.
Al inspeccionar el contenido de chat_log_20210222143423.txt vamos a encontrar una copia de un chat entre el usuario sbradley y el Administrator donde básicamente el usuario sbradley comenta que guardó el contenido del ntds.dit y del SYSTEM.hive en un comprimido (experiment_gone_wrong.zip),
Cracking ZIP password con John
Gracias a la pista anterior podemos deducir que en experiment_gone_wrong.zip vamos a encontrar hashes ntlm de los usuarios del dominio, pero al intentar descomprimirlo nos va a pedir una contraseña, y para descifrarla vamos a requerir de la tool zip2john que básicamente se encarga de extraer el hash de la contraseña del archivo ZIP para que luego podamos crackearla con John the Ripper. El paso a paso es el siguiente:
Y de esta forma obtenemos el password del .zip ahora vamos a extraer su contenido
Nota: al archivo hashes_dump.txt le tenemos que aplicar una edición de formato para poder dejar solamente el hash ntlm limpio y usarlo luego con crackmapexec.
Pass the hash con EvilWinRM
Una vez que volcamos los hashes ntlm a un archivo, tenemos que identificar algún usuario de la lista users_enum.txt que haga match con alguno de los hashes y para encontrarlo vamos a usar nxc. La única forma de hacer esto es ir agregando usuario por usuario en la línea de comando hasta encontrar el match, en este caso como no son muchos usuarios no hay problema, pero sino lo mejor es construir un script para automatizar este trabajo.
Y ahora si podemos aplicar el pass the hash de la siguiente manera:
Credential Harvesting
Encontramos el recurso lvetrova.xml, y si lo inspeccionamos vamos a encontrar lo siguiente:
Lo que encontramos es un archivo .xml que contiene un objeto serializado de PowerShell del tipo System.Management.Automation.PSCredential. Este tipo de objeto suele usarse para almacenar credenciales seguras (usuario + contraseña) en scripts de PowerShell, y es probable que el archivo contenga una contraseña cifrada en formato SecureString. Vamos a desglosarlo:
<S N="UserName">Your Flag is here =></S>→ este es el campo del nombre de usuario. En este caso parece indicarnos una pista: el valor real del flag estaría en el campo de contraseña.<SS N="Password">...cadena larga...</SS>→ este campo representa una contraseña cifrada usando el métodoConvertFrom-SecureStringde PowerShell. Esta cadena no se puede descifrar directamente sin el perfil de usuario que la cifró originalmente, ya que está protegida usando el DPAPI (Data Protection API) de Windows
Sin embargo al poseer la sesión del usuario que creó este archivo podemos usar el siguiente script de PowerShell para revertirlo y obtener la contraseña en texto plano
Esto nos imprime la contraseña desencriptada, porque el sistema tiene acceso al DPAPI necesario para descifrar el SecureString.
$cred = Import-Clixml -Path "C:\Users\lvetrova\Documents\lvetrova.xml"
Import-Clixml→ es un cmdlet que lee un archivo XML serializado por PowerShell (generalmente conExport-Clixml) y reconstruye el objeto original.-Path→ especifica la ruta al archivo.xmlque contiene el objeto a importar.
Resultado: este comando importa y recrea en la variable $cred un objeto del tipo PSCredential que incluye el nombre de usuario y la contraseña (codificada como SecureString).
$cred.GetNetworkCredential().Password
$cred→ hace referencia al objetoPSCredentialimportado..GetNetworkCredential()→ convierte el objetoSecureStringde PowerShell a un objeto más accesible del tipoNetworkCredential..Password→ accede directamente al campo de texto plano (string) de la contraseña.
Nota: si quieres aprender más sobre cómo funcionan las SecureString y las PSCredentials te recomiendo el siguiente artículo:
Kerberoasting con impacket-GetUserSPNs
Kerberoasting es una técnica que permite obtener la contraseña en texto claro de un usuario de dominio con un SPN asociado, sin necesidad de privilegios elevados. Siempre que obtenemos el hash ntlm de un usuario del dominio del ad podemos implementar este tipo de ataques con scripts de la suite de impacket. En este caso voy a usar impacket-GetUserSPNs.py para enumerar los Service Principal Names (SPNs) asociados a cuentas de usuario. Cuando usamos este script lo que ocurre es que el Kerberos responde con un ticket de servicio (TGS) perteneciente a algún otro usuario del dominio que mantiene un SPN registrado. Luego este ticket lo almacenamos en un archivo para descifrar la contraseña con John the Ripper
Una vez que obtuvimos las nueva credenciales vamos a chequear a qué servicios nos permiten acceder para realizar nuestro próximo movimiento
Credential Harvesting
Los resultados de la validación de servicios nos indica que podemos acceder al winrm con estas credenciales, asique lo que haremos será establecer una conexión remota con EvilWinRM
Explorando el directorio personal del usuario xyan1d3, vamos a encontrar un archivo de nombre xyan1d3.xml. Al ver su contenido con type, vamos a ver un objeto serializado de PowerShell del tipo PSCredential, con datos cifrados utilizando el cmdlet Export-Clixml al igual que nos pasó con el usuario lvetrova. Entonces para descifrar este mensaje vamos a utilizar los mismos comandos que usamos con lvetrova:
Bingo! ( ͡• ͜ʖ ͡•)
El siguiente movimiento es recolectar información sobre los grupos y los permisos del usuario xyan1d3 en el sistema
En PRIVILEGES INFORMATION vamos a encontrar el permiso SeBackupPrivilege habilitado y en GROUP INFORMATION vamos a ver que el usuario pertenece al grupo BUILTIN\Backup Operators
¿Qué significa todo esto?
El grupo BUILTIN\Backup Operators es un grupo local predefinido en sistemas Windows. Los miembros de este grupo reciben automáticamente los privilegios:
SeBackupPrivilege (copiar archivos en modo backup)
SeRestorePrivilege (restaurar archivos con privilegios elevados)
Este grupo existe para permitir que usuarios no administradores realicen tareas de respaldo y restauración de datos críticos
Por otra parte el SeBackupPrivilege es un derecho de usuario que permite leer cualquier archivo del sistema, sin importar las listas de control de acceso (ACLs) que normalmente restringirían el acceso. Este privilegio está diseñado para que las cuentas de respaldo (como operadores de copia de seguridad) puedan realizar tareas de respaldo completas, incluso si no tienen permisos explícitos sobre cada archivo o carpeta. Un usuario con este privilegio puede copiar archivos como ntds.dit, SAM, o SYSTEM sin ser administrador.
En esta etapa voy a desarrollar dos formas de obtener las credenciales NTLM del usuario Administrator, la primera es con utilidades nativas de los sistemas windows (diskshadow y robocopy) y la segunda es utilizando impacket-reg, esta última es la más rápida y fácil de replicar.
El procedimiento que vamos a seguir para la obtención de credenciales de dominio a partir de Volume Shadow Copy es el siguiente:
En el directorio raíz vamos a crear el directorio
/tempdonde volcaremos las copias de los archivosntds.ditySYSTEMSubimos al directorio
/tempel archivo de configuración (script) llamadodiskshad0w.dsh, el cual contiene las instrucciones para la utilidaddiskshadowCopiar el disco del sistema (volumen C:): ejecutamos el comando
diskshadow /s diskshad0w.dsh, para generar una copia sombra del volumen C: del sistema. Esto se logra utilizando la funcionalidad Volume Shadow Copy Service (servicio de copias sombra) de Windows, la cual está diseñada para realizar respaldos coherentes de archivos en uso. A través del alias definido en el script (diskshad0w), la copia sombra se expone como una unidad lógica (Z:\), lo que permite su navegación y lectura.Copiar el
ntds.dit: utilizamos la utilidadrobocopycon el parámetro/b, para copiar archivos en modo de respaldo, ignorando las restricciones de ACL. De esta forma, accede az:\windows\ntds\ntds.dity lo copia exitosamente al directorioC:\temp.Copiar el SYSTEM: guardamos una copia del archivo de registro del sistema (
HKLM\SYSTEM) con el comandoreg save hklm\system SYSTEMDescargamos los archivos
ntds.ditySYSTEMen el kali para extraer los hashes con impacket-secretsdump
Nota: la tool unix2dos convierte los finales de línea del archivo de formato UNIX () a formato DOS/Windows (\r). Esto es necesario porque los intérpretes de comandos en Windows pueden fallar al procesar archivos que no estén en el formato de fin de línea correcto. Por otro lado, el término "copia sombra" (shadow copy) se refiere a una instantánea del estado de un volumen de disco en un momento específico del tiempo. En sistemas Windows, esta funcionalidad es provista por el Volume Shadow Copy Service (VSS).
Si te interesa aprender más sobre esta técnica te recomiendo que leas los siguientes artículos:
Extracción de hashes NTLM con impacket-secretsdump
Una vez que ya tenemos los archivos SYSTEM y ntds.dit podemos extraer los hashes con impacket-secretsdump
Pass the hash con EvilWinRM para el usuario administrator
Por último nos conectamos con las credenciales del usuario Administrador y extraemos su flag
La flag está cifrada en hexadecimal por lo que vamos a copiarla y descifrarla en la consola de kali con el siguiente comando:
Bonus track: Extracción de hashes NTLM con impacket-reg
La segunda opción para extraer los hashes NTLM es usando impacket-reg, el procedimiento es el mismo, nos conectamos con las credenciales del usuario xyan1d3 y tenemos que crear el directorio /temp donde impacket-reg volcara los archivos SAM y SYSTEM que luego descargáremos en nuestro kali
Una vez que impacket-reg copia y guarda los archivos SAM y SYSTEM los podemos listar en la sesión de EvilWinRM y descargarlos con download
Y la extraccion la hacemos con impacket-secretsdump
Pass the hash con xfreerdp3
Las últimas flags las vamos a buscar desde powershell conectándonos por RDP. Aprovechando que tenemos acceso a la cuenta del Administrator vamos a habilitar la conexión por RDP desde EvilWinRM con el siguiente comando:
Este comando modifica el registro de Windows para crear o actualizar una clave que controla el comportamiento del modo "Restricted Admin" (Administrador Restringido) en RDP (Remote Desktop Protocol).
New-ItemProperty: crea una nueva entrada de registro o modifica una existente.-Path 'HKLM:\System\CurrentControlSet\Control\Lsa': apunta a una clave crítica del sistema bajo Local Security Authority (LSA).-Name 'DisableRestrictedAdmin': define el nombre del valor de la clave.-PropertyType 'DWORD': establece el tipo de dato (número de 32 bits).-Value '0': fija el valor de esa clave en0, lo que habilita el uso del modo Restricted Admin.-Force: sobrescribe el valor si ya existe.
El modo Restricted Admin permite a un usuario conectarse vía RDP sin enviar sus credenciales reales al sistema remoto. Activarlo permite a herramientas como mimikatz o secretsdump usar hashes NTLM válidos para autenticación remota (Pass-the-Hash), sin requerir la contraseña en texto claro.
Ahora le pasamos las credenciales a xfreerdp3 y nos conectamos
Bingo! ( ͡• ͜ʖ ͡•)
