Robust Writeup - Proving Grounds
Created October 8, 2026 • Last updated October 8, 2026 • 3 min read
Robust runs a PHP employee management application gated by an IP allowlist. Spoofing the trusted address with an X-Forwarded-For header unlocks a hidden employee search page vulnerable to UNION-based SQL injection, which leaks a user's password straight out of the database. On the box, that account's AppData folder holds a Windows Sticky Notes database with the Administrator's password written in plain text.
Reconnaissance
Nmap
Scan all TCP ports.
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH for_Windows_8.1 (protocol 2.0) 80/tcp open http PHP cli server 5.5 or later (PHP 7.3.33) 7680/tcp open pando-pub?
Explain command
| -p- | Scan all 65535 TCP ports. |
Windows SSH, a PHP development server on 80, and Windows Update Delivery Optimization on 7680 (not exploitable). Port 80 is the only real surface.
Web enumeration
Browsing to the root redirects to login.php, which shows an access-denied message naming one specific allowed IP address.
Exploitation
X-Forwarded-For header bypass
The IP check trusts a client-supplied header instead of the real connection source. Add it in Burp Repeater.
HTTP/1.1 200 OK ... <title>Robust Employee Manager</title>
Spoofing the trusted address renders the real login page instead of the access-denied message.
Directory discovery
Fuzz for other PHP pages while keeping the bypass header set.
home.php [Status: 302, Size: 0]
Explain command
| -H | Add the IP-bypass header to every fuzzed request. |
| --sc 302 | Only show responses with this status code. |
home.php redirects back to login.php, but the response body still carries the full page behind that redirect. Stripping the Location header (or following the redirect) in Repeater renders a Manage Employees page: an employee table with Id, First name, Last name and Birth date columns, plus a name-based search form.
UNION-based SQL injection
The search form is injectable. Determine the column count first.
No error -> 5 columns
Five columns render with no error, one more than the four visible in the table, so a hidden password column sits in position five. Place it into a column that is actually displayed to read it.
First name column for Jeff's row: $JEFF_PASSWORD
Jeff's password comes back in the "First name" display position. Try it over SSH.
SSH as jeff
jeff@$TARGET_IP's password: jeff@ROBUST C:\Users\Jeff> whoami robust\jeff
Shell as jeff. WinPEAS turns up minimal attack surface, so enumerate AppData by hand.
Privilege Escalation
Windows Sticky Notes credential leak
The Sticky Notes app stores its content in a local SQLite database.
Credentials: Administrator:$ADMIN_PASSWORD
The binary SQLite file still contains readable plaintext strings, and one note stores the Administrator's password outright. Windows Sticky Notes (plum.sqlite) is a well-known credential-hunting location on Windows post-exploitation. Try the leaked password over SSH.
administrator@$TARGET_IP's password: administrator@ROBUST C:\Users\Administrator> whoami robust\administrator
The Sticky Notes leak hands over a shell as Administrator.