Page cover

🟢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 node es 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

  1. Permisos de Ejecución con sudo:

    • El usuario bob puede ejecutar el script /opt/ghost/clean_symlink.sh con permisos de superusuario (sudo) sin contraseña.

    • El script acepta un argumento que debe ser un archivo con extensión .png.

  2. Vulnerabilidad en el Script:

    • La variable CHECK_CONTENT se lee del entorno y se usa sin validación. Si se define como true, el script ejecuta el comando /usr/bin/cat en un archivo específico.

    • Existe un uso inseguro de $LINK, que se pasa directamente a comandos como /usr/bin/mv y /usr/bin/cat, sin validación adicional.

  3. Punto Crítico:

    • Puedes controlar la variable de entorno CHECK_CONTENT y 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?