Linkvortex

Publicado: 07 de Junio de 2025 Autor: Josรฉ Miguel Romero aKa x3m1Sec Dificultad: โญ Easy

๐Ÿ“ Descripciรณn

Linkvortex es una mรกquina Linux de dificultad Easy de HackTheBox que presenta un CMS Ghost vulnerable (versiรณn 5.58) con una vulnerabilidad de lectura arbitraria de archivos (CVE-2023-40028). La escalada de privilegios se realiza mediante la explotaciรณn de un script personalizado que procesa enlaces simbรณlicos de forma insegura.

๐ŸŽฏ Objetivos de Aprendizaje

  • Enumeraciรณn web y descubrimiento de subdominios

  • Explotaciรณn de repositorios Git expuestos

  • Aprovechamiento de vulnerabilidades en Ghost CMS

  • Lectura de archivos sensibles del sistema

  • Escalada de privilegios mediante manipulaciรณn de enlaces simbรณlicos

๐Ÿท๏ธ Categorรญas

  • Web Exploitation

  • Information Disclosure

  • Git Repository Enumeration

  • Privilege Escalation

  • Symlink Attack

๐Ÿ› ๏ธ Herramientas Utilizadas

  • nmap - Escaneo de puertos y servicios

  • dirsearch / feroxbuster - Fuzzing de directorios

  • ffuf - Fuzzing de virtual hosts

  • git_dumper - Extracciรณn de repositorios Git

  • Exploit CVE-2023-40028 para Ghost 5.58

๐Ÿ”ญ Reconocimiento

Ping para verificaciรณn en base a TTL

๐Ÿ’ก Nota: El TTL cercano a 64 sugiere que probablemente sea una mรกquina Linux.

Escaneo de puertos TCP

Enumeraciรณn de servicios

โš ๏ธ Importante: Detectamos durante la fase de enumeraciรณn con nmap que se estรก realizando virtual hosting. Debemos aรฑadir el siguiente vhost a nuestro fichero /etc/hosts


๐ŸŒ Enumeraciรณn Web

80 HTTP (linkvortex.htb)

No encontramos gran cosa al enumerar el sitio de forma manual. La opciรณn de registro no estรก implementada ni tampoco hay formularios en la web.

๐Ÿ‘ป Identificaciรณn de Ghost CMS

Revisando el cรณdigo fuente encontramos una etiqueta meta que hace referencia a Ghost 5.58

Buscando informaciรณn sobre este software encontrรฉ que es una aplicaciรณn para crear contenido, un CMS: https://ghost.org/

Al buscar informaciรณn sobre este software tambiรฉn encontrรฉ que habรญa tenido vulnerabilidades y en concreto parece que tuvo una vulnerabilidad de tipo Arbitrary File Read en la versiรณn 5.58:

https://github.com/0xDTC/Ghost-5.58-Arbitrary-File-Read-CVE-2023-40028

Pero echemos un ojo primero a ver si encontramos algo realizando fuzzing.

๐Ÿ“‚ Fuzzing de directorios

Tras probar a realizar fuzzing de directorios con dirsearch y ferxobuster encontramos algunos recursos que aรฑadir a nuestro scope:

Uno de ellos nos permite saber que hay un usuario admin, ya todos los post son de este usuario.

๐Ÿ” Panel de autenticaciรณn

Revisando el panel de login, nos pide una cuenta de correo como usuario. Si probamos con el nombre de usuario encontrado y el dominio vemos que parece ser vรกlido, ya que si introducimos otro distinto el mensaje de error es diferente:

http://linkvortex.htb/ghost

Una opciรณn a valorar serรญa usar hydra y un ataque de diccionario para ver si logramos la contraseรฑa, pero como este probablemente serรญa un proceso largo, continuemos primero enumerando para ver si existen tambiรฉn otros subdominios.

๐Ÿ”ง Subdominio de desarrollo (dev.linkvortex.htb)

Fuzzing de vhosts

Al realizr fuzzing de vhosts encontramos un subdominio llamado dev que procedemos a aรฑadir a nuestro fichero /etc/hosts

Al acceder encontramos que el sitio parece estar todavรญa en construcciรณn

๐Ÿ“‚ Fuzzing del subdominio dev

Al realizar fuzzing sobre este subdominio encontramos un repositorio en git:

โฌ‡๏ธ Extracciรณn del repositorio Git

Podemos usar la herramienta git_dumper para descargar el repositorio a nuestro host de ataque.

El repositorio estรก en un estado un poco extraรฑo:

Actualmente no estรก en una rama, pero tiene dos archivos modificados pendientes de confirmaciรณn. Puedo ver la diferencia en cada uno de ellos usando git diff --cached. El Dockerfile.ghost es completamente nuevo:

Vemos que hay un archivo de configuraciรณn en /var/lib/ghost/config.production.json

๐Ÿ—๏ธ Descubrimiento de credenciales

Revisemos primero las diferencias del otro archivo que habรญamos visto:

La cosa se pone interesante porque aquรญ encontramos una contraseรฑa. Vamos a probar esta contraseรฑa OctopiFociPilfer45 con la cuenta del usuario admin@linkvortex.htb y comprobemos si mereciรณ la pena seguir enumerando en lugar de intentar el ataque de fuerza bruta con hydra:

Estamos dentro! Esto se pone interesante, ya que el exploit que vimos para

๐Ÿ’ฅ Explotaciรณn

Ahora probemos con la ruta del fichero que habรญamos descubierto en el archivo de configuraciรณn del repositorio en git: /var/lib/ghost/config.production.json

๐Ÿ” Acceso SSH

Encontramos una nueva credencial: bob@linkvortex.htb:fibber-talented-worth en lo que parece ser un servicio SMTP. Pero tal como vemos, este servicio no estรก expuesto.

Lo รบnico que nos queda verificar es si se puede estar reutilizando esta credencial en algรบn otro servicio, por ejemplo el servicio ssh:

Ganamos acceso a la mรกquina como usuario bob y obtenemos la primer flag en su directorio de usuario.

๐Ÿš€ Escalada de privilegios

Verificamos si bob puede ejecutar algรบn comando como root:

๐Ÿ“‹ Anรกlisis del script vulnerable

El script bรกsicamente lo que hace es analizar un enlace simbรณlico (symlink) a una imagen .png, determinar si apunta a un archivo crรญtico (como algo en /etc o /root), y en ese caso eliminarlo o moverlo a cuarentena.

Vamos paso a paso:

Se define el directorio de cuarentena donde se moverรกn los enlaces sospechosos.

Comprobaciรณn de variable opcional.

  • Si la variable de entorno CHECK_CONTENT no estรก definida, se le asigna el valor false.

  • Esta variable indica si se debe imprimir el contenido del archivo al que apunta el symlink.

Captura del argumento introducido por el usuario

En este if se valida la extensiรณn del archivo que ha introducido el usuario.

  • Se verifica, usando sudo, si el archivo es un enlace simbรณlico (-L).

  • Si no lo es, no hace nada (fin del script).

Se analiza el enlace simbรณlico.

  • LINK_NAME: obtiene solo el nombre del archivo (sin ruta).

  • LINK_TARGET: obtiene a quรฉ archivo apunta realmente el enlace.

Se comprueba si el enlace apunta a ficheros crรญticos del sistema:

  • Si el destino del enlace contiene etc o root (ej. /etc/passwd o /root/.ssh/id_rsa), lo considera peligroso.

  • Imprime una advertencia y elimina el enlace simbรณlico con unlink.

Si no apunta a un archivo sensible, se mueve a la carpeta de cuarentena (/var/quarantined).

  • Si CHECK_CONTENT estรก activado, intenta leer el contenido del archivo al que apuntaba el enlace.

Primero, creamos un enlace simbรณlico (symlink) que apunte al archivo /root/root.txt:

Con esto lo que estamos haciendo es crear un enlace simbรณlico llamado x3m1sec.txt que apunte al fichero /root/.ssh/id_rsa.txt

Recordemos que el script requiere que el archivo que le indiquemos tenga extensiรณn .png, por lo que creamos otro enlace simbรณlico

  • ln -s /home/bob/x3m1sec.txt x3m1sec.png โ†’ Creamos un segundo symlink (x3m1sec.png) que apunta a x3m1sec.txt, el cual a su vez apunta a root.txt logrando de esta forma evadir el filtro del script.

Nos falta un paso todavรญa, ya que necesitamos que la variable estรฉ inicializada. CHECK_CONTENT=true

ยฟQuรฉ pasa aquรญ?

  • CHECK_CONTENT=true โ†’ Hace que el script muestre el contenido del archivo despuรฉs de moverlo a /var/quarantined/.

  • /opt/ghost/clean_symlink.sh /home/bob/x3m1sec.png โ†’ El script moverรก el symlink y leerรก su contenido.

Obtenemos la clave ssh de root. Ahora podemos copiarla en nuestro host de ataque, darle permisos 600 y ganar acceso como root para leer la flag:

Last updated