Buscar en BreakSecure

Contenido recomendado

Vulnversity

Vulnversity es una máquina de TryHackMe enfocada en practicar las principales etapas de un pentest. El laboratorio abarca enumeración de servicios y directorios web, explotación de una carga insegura de archivos para obtener acceso inicial y escalamiento de privilegios en Linux mediante un binario SUID.

Portada de Vulnversity
Plataforma
TryHackMe
Sistema operativo
Linux
Dificultad
Fácil
Publicado
Autor
Pedro Vargas
Temas
  • Enumeration
  • Gobuster
  • File Upload
  • Reverse Shell
  • SUID
  • Systemctl
  • Escalamiento de Privilegios
En esta página

Resumen

Vulnversity es una máquina Linux de TryHackMe orientada principalmente a la enumeración web, explotación de una funcionalidad insegura de carga de archivos y escalamiento de privilegios. Durante la resolución de la máquina se identificó una aplicación web ejecutándose sobre un servidor Ubuntu. Mediante enumeración de directorios se encontró un endpoint que permitía cargar archivos al servidor. Analizando las restricciones implementadas en el formulario de subida fue posible identificar una extensión PHP alternativa permitida por la aplicación. Esto permitió cargar un archivo PHP y obtener acceso inicial al servidor con el usuario utilizado por el servicio web. Posteriormente, durante la enumeración local del sistema se identificó un binario systemctl con el bit SUID configurado. Esta configuración fue aprovechada para escalar privilegios y obtener acceso como root.

Enumeración

Descubrimiento de puertos

El primer paso fue realizar un escaneo inicial sobre la máquina para identificar los puertos disponibles. Durante esta fase se identificaron seis puertos de interés:

  • 21
  • 22
  • 139
  • 445
  • 3128
  • 3333

Una vez identificados, se realizó un segundo escaneo específicamente sobre estos puertos para obtener información más detallada sobre los servicios y versiones disponibles.

Identificación de servicios

Para realizar una enumeración más profunda se utilizó Nmap con los scripts por defecto y detección de versiones: bash nmap -p 21,22,139,445,3128,3333 10.66.183.160 -n -sVC -oA vulnversity_scan -T4 -vvv Con este escaneo fue posible obtener mayor información sobre los servicios expuestos por la máquina.

Debido a que uno de los objetivos principales del laboratorio estaba relacionado con la aplicación web, decidí continuar la enumeración centrándome en este servicio.

Enumeración web

Identificación del sistema operativo

Inicialmente intenté obtener información sobre el sistema operativo mediante Nmap, pero el resultado no permitía identificarlo claramente.

Al analizar posteriormente la aplicación web utilizando Wappalyzer, fue posible identificar que el servidor estaba utilizando Ubuntu.

Sistema operativo identificado: Ubuntu

Enumeración de directorios

El siguiente paso fue buscar directorios y recursos adicionales dentro de la aplicación web. Para ello utilicé Gobuster, realizando fuerza bruta de directorios sobre el servidor. Durante la enumeración apareció un directorio particularmente interesante: /internal

Al acceder a esta ruta se encontró un formulario que permitía cargar archivos al servidor.

Análisis de la carga de archivos

La funcionalidad /internal implementaba determinadas restricciones sobre las extensiones de los archivos que podían ser cargados. El siguiente paso fue analizar cómo funcionaba esta validación.

Para ello intercepté una petición de carga utilizando Burp Suite y observé tanto la petición enviada como la respuesta generada por el servidor.

Al intentar cargar directamente determinados archivos PHP, la aplicación rechazaba la solicitud.

Por este motivo, envié la petición a Burp Intruder y probé diferentes extensiones asociadas a archivos PHP para determinar cuáles eran aceptadas por la aplicación. Entre las extensiones probadas se identificó que:

.phtml

era aceptada por el servidor.

Esto resultaba especialmente interesante porque el servidor web podía interpretar este tipo de archivo como código PHP.

Obtención de acceso inicial

Una vez identificada una extensión permitida, preparé un archivo PHP para establecer una conexión hacia mi máquina Kali (Este archivo lo encuentras en kali, prueba con locate php-reverse-shell.php).

El archivo original: php-reverse-shell.php

fue modificado con los parámetros correspondientes a mi entorno y posteriormente renombrado utilizando la extensión permitida: php-reverse-shell.phtml

Después de cargar correctamente el archivo, fue necesario determinar dónde almacenaba la aplicación los archivos subidos.

Durante la enumeración se encontró el directorio: /internal/uploads/

Desde este directorio era posible acceder al archivo previamente cargado.

En Kali dejé un listener preparado para recibir la conexión y posteriormente accedí al archivo .phtml desde la aplicación web.

La ejecución del archivo permitió obtener acceso al servidor. Al comprobar el usuario actual: whoami se observó que la sesión se estaba ejecutando como: www-data

Enumeración local

Con acceso al sistema, el siguiente objetivo fue identificar usuarios y recursos disponibles. Una de las primeras comprobaciones fue revisar los usuarios registrados en:

cat /etc/passwd

Durante esta enumeración se identificó un usuario llamado:

bill

Posteriormente accedí a su directorio personal:

/home/bill/

Dentro de este directorio fue posible localizar la primera flag de la máquina.

Escalamiento de privilegios

El siguiente objetivo era obtener privilegios de root. La propia máquina orientaba esta fase hacia la búsqueda de binarios que tuvieran configurado el bit SUID.

Para identificarlos utilicé:

find / -perm -4000 2>/dev/null

Entre los resultados apareció un binario especialmente interesante:

/bin/systemctl

La presencia de systemctl con SUID resultaba relevante porque podía permitir ejecutar determinadas operaciones con privilegios superiores.

Investigación de systemctl

Para investigar posibles técnicas de escalamiento asociadas al binario consulté GTFOBins. https://gtfobins.org/ La técnica consistía en crear un servicio controlado por el usuario y posteriormente utilizar systemctl para enlazarlo y habilitarlo.

Preparé entonces un archivo en la máquina víctima llamado:

root.service

configurándolo para establecer una conexión hacia mi máquina Kali.

Antes de ejecutar el servicio dejé preparado el listener correspondiente en Kali. Posteriormente utilicé:

systemctl link /path/to/root.service
systemctl enable --now /path/to/root.service

La ruta /path/to/root.service debe corresponder con la ubicación real en la que se haya creado el archivo.

Al ejecutarse el servicio se recibió una nueva conexión en Kali.

Finalmente comprobé los privilegios obtenidos:

whoami

Resultado:

root

Con acceso como root fue posible localizar la última flag y completar la máquina.

Conclusiones

Vulnversity permite practicar un flujo bastante completo de pentesting sobre Linux:

  1. Enumeración de puertos y servicios.
  2. Enumeración de aplicaciones web.
  3. Descubrimiento de directorios.
  4. Análisis de restricciones en cargas de archivos.
  5. Bypass de validaciones mediante extensiones alternativas.
  6. Obtención de acceso inicial.
  7. Enumeración local de Linux.
  8. Identificación de binarios SUID.
  9. Escalamiento de privilegios mediante systemctl.

Herramientas utilizadas

  • gobuster
  • nmap
  • burpsuite
  • netcat

Referencias

https://www.youtube.com/watch?v=e3j1cHzTEdw