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 serviciosdirsearch/feroxbuster- Fuzzing de directoriosffuf- Fuzzing de virtual hostsgit_dumper- Extracciรณn de repositorios GitExploit 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_CONTENTno estรก definida, se le asigna el valorfalse.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
etcoroot(ej./etc/passwdo/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_CONTENTestรก activado, intenta leer el contenido del archivo al que apuntaba el enlace.
๐ Explotaciรณn mediante Symlink Attack
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 ax3m1sec.txt, el cual a su vez apunta aroot.txtlogrando 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