🟢LinkVortex
En esta ocasión vamos a hacer el writeup de la máquina LinVortex de Hack the Box, una máquina Linux de dificultad easy.

Primer acceso
Añadimos la IP 10.10.11.47 a nuestro /etc/hosts y accedemos través del navegador.

Parece un blog sobre componentes de hardware. Solamente vemos 3 páginas a simple vista:
Home: Con enlaces a los posts
About: Texto hablando sobre la empresa
Páginas de post: puro contenido de texto
En el footer nos encontramos "Powered by Ghost" con un link a la siguiente web, lo que nos indica la tecnología sobre la que está construído:
Al parecer no encontramos nada que nos llame la atención, por lo que vamos a ver los puertos que tiene abiertos.
Escaneo de puertos
Solo encontramos 2 puertos abiertos, el 22 y el 80, los típicos. Por el momento el puerto 80 es nuestro principal vector de entrada.
Enumeración
Al ejecutar whatweb contra la web encontramos un plugin Ghost 5.58 bastante interesante:
Fuzzing
Haciendo fuzzing con dirsearch no encontramos nada relevante y que podamos acceder:
En este punto parece que estamos en un Rabit Hole, por lo que vamos a probar a enumerar subdominios.
Enumeración de Vhosts
En este momento puede parecer que no podemos hacer nada, pero vamos a usar ffuf para enumerar subdominios dentro de este host:
Bingo! Obtenemos el subdominio dev.linkvortex.htb. Vamos a añadirlo a /etc/hosts y entrar para ver su contenido.

Parece que la web está en construcción y no hay ningún link ni comentario en el código fuente. Vamos a volver a hacer fuzzing contra este subdominio a ver si encontramos algo interesante:
Encontramos un directorio .git interesante, al cual podemos acceder a todos los archivos:

Explotación del directorio .git
Para dumpear el contenido del repositorio .git y extraer información relevante podemos utilizar git-dumper, un script de Python diseñado para reconstruir un repositorio a partir de un directorio .git.
Esto nos descarga en local el repositorio para analizarlo mejor, dentro del directorio .git:
Haciendo un poco de enumeración en el repo encontramos un archivo interesante: authentication.test.js
Al leer este archivo nos encontramos unas credenciales que parecen de un usuario administrador:
Tenemos 2 posibles credenciales:
Acceso al directorio ghost
Si accedemos al directorio /ghost llegamos a un panel de login donde podríamos probar a loguearnos:

Probamos las siguientes credenciales y accedemos sin problema:

Tenemos acceso de administrador al CMS. Ahora vamos a buscar la manera de explotar esto.
Explotación
Buscando en internet encontramos un CVE asociado a la versión de Ghost 5.58:
En este script debemos editar la línea donde se referencia al host. El script también indica que ha sido probado contra una imagen de Ghost usando Docker:
Lo podemos ejecutar de la siguiente manera para extraer el contenido de cualquier archivo, como el /etc/passwd:
Solamente encontramos un usuario interesante:
node: Probablemente el usuario bajo el cual se ejecuta la aplicación Ghost, ya que Ghost está desarrollado en Node.js. El usuario
nodees relevante porque podría tener acceso a los archivos de configuración y credenciales del sistema.
User flag
Volviendo a revisar el dump del repositorio git, nos encontramos el archivo Dockerfile.ghost, que contiene un archivo de configuración interesante: config.production.json:
Vamos a utilizar el script de nuevo para leer este archivo de configuración:
Buuuum! Obtenemos las credenciales del usuario bob:
Nos conectamos por SSH correctamente con estas credenciales y obtenemos la flag:
Escalada de privilegios
Vamos a ver los permisos de ejecución que tenemos en la máquina:
Vamos a ver el script:
Este escenario presenta una vulnerabilidad de escalada de privilegios debido al uso de un script que se ejecuta como sudo sin requerir contraseña y que puede ser manipulado. Vamos a desglosar cómo explotar esta configuración para elevar privilegios:
Análisis de la Configuración
Permisos de Ejecución con
sudo:El usuario
bobpuede ejecutar el script/opt/ghost/clean_symlink.shcon permisos de superusuario (sudo) sin contraseña.El script acepta un argumento que debe ser un archivo con extensión
.png.
Vulnerabilidad en el Script:
La variable
CHECK_CONTENTse lee del entorno y se usa sin validación. Si se define comotrue, el script ejecuta el comando/usr/bin/caten un archivo específico.Existe un uso inseguro de
$LINK, que se pasa directamente a comandos como/usr/bin/mvy/usr/bin/cat, sin validación adicional.
Punto Crítico:
Puedes controlar la variable de entorno
CHECK_CONTENTy proporcionar un enlace simbólico (symlink) malicioso que apunte a un archivo crítico del sistema, como/etc/shadow.
Procedimiento de Explotación
Paso 1: Definir la Variable de Entorno
Antes de ejecutar el script, establece la variable CHECK_CONTENT como true para habilitar la lectura del contenido del archivo objetivo:
Paso 2: Crear un Enlace Simbólico
Crea un enlace simbólico que apunte a un archivo crítico, por ejemplo, /etc/shadow:
Paso 3: Ejecutar el Script
Ejecuta el script con sudo, pasando el enlace simbólico como argumento:
El script implementa una comprobación que evita la lectura de archivos críticos (como aquellos en /etc o /root) al detectar patrones específicos en la ruta del enlace simbólico. Esto limita directamente el acceso a archivos sensibles. Sin embargo, el comportamiento del script todavía deja una posible vulnerabilidad que puede ser explotada con un enfoque alternativo.
Paso 1: Crear una Carpeta Temporal
Usa una carpeta temporal para alojar el enlace simbólico que apuntará al archivo crítico.
Paso 2: Crear el Enlace Simbólico
Apunta el enlace simbólico principal al archivo dentro de la carpeta temporal:
Paso 3: Ejecutar el Script
Ejecuta el script como antes, usando fake.png:
Tenemos el /etc/shadow, con lo que podemos acceder a cualquier archivo del sistema! En nuestro caso vamos a usarlo para obtener la flag en /root/root.txt
Tenemos la root flag!
Última actualización
¿Te fue útil?