Raz0rBlack

Dificultad: medium - OS: Windows

¯\_( ͡° ͜ʖ ͡°)_/¯ Machine info

El CTF RazorBlack de TryHackMe simula un entorno corporativo basado en Active Directory sobre sistemas Windows, lo que representa un escenario ideal para poner en práctica técnicas comunes de pentesting orientadas a infraestructuras empresariales. Desde el inicio, el análisis de servicios accesibles en la máquina revela vectores clásicos como NFS y SMB, lo que permite la enumeración de archivos y usuarios. Este entorno inicial permite acceder a información clave, como listas de empleados y posibles credenciales, que posteriormente son aprovechadas en ataques específicos del protocolo Kerberos.

A medida que se avanza, el uso de técnicas como AS-REP Roasting y Kerberoasting se vuelve central para obtener y descifrar hashes sin necesidad de interacción directa con contraseñas en texto claro. Estas técnicas permiten la escalada progresiva a través de diferentes cuentas de usuario, accediendo a archivos compartidos y documentos internos que contienen configuraciones sensibles o credenciales almacenadas de forma insegura.

Finalmente, la escalada de privilegios se logra mediante el aprovechamiento de permisos mal configurados, como el pertenecer al grupo de Backup Operators, que permite extraer información de registros críticos del sistema. A través de herramientas de post-explotación como impacket-secretsdump, se extraen hashes del sistema para acceder como administrador.

Enumeración de puertos/servicios

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# nmap -sCV --open -T4 -v -n 10.10.18.112
📌 Parámetros
  • sCV:

    • -sCEjecuta 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.

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

  • -nNo resuelve nombres de dominio (reduce el tiempo del escaneo).

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

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

  • -vModo verbose → Muestra más detalles sobre el progreso del escaneo.

Resultado:

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: -9m06s

En 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 Kerbrute o impacket cuando 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-info y 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/hosts del 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 caso 10.10.18.112) y muestra los directorios que están siendo exportados (compartidos) a través del servicio NFS. El parámetro -e en el comando showmount significa "exports", y su función es mostrar los directorios que el servidor NFS está exportando (compartiendo).

  • mount -t nfs 10.10.18.112:/users ./NFSmonta el recurso compartido /users del 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.

📌¿Qué relevancia tienen este tipo de archivos para una auditoría de seguridad?

En una auditoría de seguridad o ejercicio de pentesting, los archivos .xlsx pueden representar una fuente crítica de información sensible debido a su uso común en entornos corporativos para organizar datos internos. Estos documentos suelen incluir listas de empleados, roles, correos electrónicos, nombres de usuario, credenciales débiles, rutas de red o descripciones de recursos compartidos. Su estructura tabular facilita la acumulación de datos que, si no están adecuadamente protegidos, pueden ser utilizados por un atacante para preparar ataques de ingeniería social, suplantación de identidad, o acceso inicial al sistema mediante técnicas como brute-force o AS-REP Roasting.

Además, los metadatos embebidos en archivos .xlsx pueden revelar detalles valiosos como el nombre del creador del documento, el software utilizado, la organización o usuarios internos del sistema. Esta información puede ser correlacionada con otros vectores de ataque, especialmente en entornos Active Directory, donde conocer nombres reales y estructuras de nomenclatura de usuario permite una enumeración más efectiva. En resumen, estos archivos no solo contienen datos útiles directamente, sino que también sirven como puntos de partida para mapear el contexto organizacional de un objetivo y optimizar la fase de reconocimiento y explotación.

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 a IPC$ 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:

  1. El usuario existe y las credenciales son correctas.

  2. El login no falla por contraseña inválida, sino por una política de expiración de contraseñas.

  3. 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 PasswordChangeUserPassword sin 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.

📌¿Qué son los ntds.dit y SYSTEM y como podemos extraer los hashes NTLM?

El archivo ntds.dit contiene la base de datos del Active Directory, incluyendo los objetos del dominio, entre ellos los usuarios y sus hashes de contraseñas. Sin embargo, esos hashes no están almacenados en texto plano ni directamente accesibles: están cifrados utilizando una clave derivada de una estructura llamada bootKey.

El archivo SYSTEM, que es parte del registro de Windows (concretamente el hive del sistema), contiene esa bootKey. Esta clave es necesaria para descifrar los secretos del ntds.dit. Sin el archivo SYSTEM, no es posible obtener la bootKey y por lo tanto no se puede descifrar correctamente la información contenida en ntds.dit.

En resumen, ntds.dit proporciona los datos cifrados y el archivo SYSTEM proporciona la clave para descifrarlos. Por eso, ambos son requeridos para que secretsdump.py pueda extraer con éxito los hashes NTLM de un controlador de dominio.

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étodo ConvertFrom-SecureString de 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 con Export-Clixml) y reconstruye el objeto original.

  • -Path → especifica la ruta al archivo .xml que 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 objeto PSCredential importado.

  • .GetNetworkCredential() → convierte el objeto SecureString de PowerShell a un objeto más accesible del tipo NetworkCredential.

  • .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

📌Parámetros de impacket-GetUserSPNs
  • -request → indica que se soliciten los TGS (Ticket Granting Service) para las cuentas con SPNs (Service Principal Names).

  • -dc-ip 10.10.18.112 → dirección IP del Controlador de Dominio (Domain Controller).

  • raz0rblack.thm/lvetrova → nombre del usuario y dominio con el que se autentica para hacer la solicitud.

  • -hashes LMHASH:NTHASH → se emplea la autenticación mediante hash NTLM, sin necesidad de conocer la contraseña en texto claro.

  • -outputfile kerberoast → archivo donde se guarda el hash Kerberos obtenido, susceptible a crackeo offline.

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 /temp donde volcaremos las copias de los archivos ntds.dit y SYSTEM

  • Subimos al directorio /temp el archivo de configuración (script) llamado diskshad0w.dsh, el cual contiene las instrucciones para la utilidad diskshadow

  • Copiar 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 utilidad robocopy con el parámetro /b, para copiar archivos en modo de respaldo, ignorando las restricciones de ACL. De esta forma, accede a z:\windows\ntds\ntds.dit y lo copia exitosamente al directorio C:\temp.

  • Copiar el SYSTEM: guardamos una copia del archivo de registro del sistema (HKLM\SYSTEM) con el comando reg save hklm\system SYSTEM

  • Descargamos los archivos ntds.dit y SYSTEM en el kali para extraer los hashes con impacket-secretsdump

📌diskshad0w.dsh

set context persistent nowriters Este comando establece el contexto de la sesión de copia sombra como persistente, lo que significa que la copia no se eliminará automáticamente una vez finalizada la sesión. El modificador nowriters evita que los writers (como SQL Server o Exchange) interfieran o intenten sincronizar el estado de los archivos.

add volume c: alias diskshad0w Indica que se va a incluir la unidad C: como volumen de origen para la copia sombra y se le asigna un alias (diskshad0w) que facilita su referencia en los pasos posteriores.

create Inicia la creación de la copia sombra del volumen especificado. Una vez ejecutado, se genera una snapshot (copia puntual y en tiempo real) del disco C:.

expose %diskshad0w% z: Expone la copia sombra como una nueva unidad lógica accesible desde el sistema, en este caso Z:\. Esto permite navegarla como si fuese una unidad más del sistema, incluyendo rutas protegidas como C:\Windows\NTDS.

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

impacket-reg

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 en 0, 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! ( ͡• ͜ʖ ͡•)