Magic

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

๐Ÿ“ Descripciรณn

Magic es una mรกquina Linux de dificultad media que presenta un portal web para un portfolio fotogrรกfico con un panel de administraciรณn vulnerable. La explotaciรณn inicial se logra mediante una inyecciรณn SQL en el formulario de login, seguida de una subida de archivo maliciosa que permite la ejecuciรณn remota de comandos. Para el movimiento lateral, se aprovechan credenciales encontradas en archivos de configuraciรณn de la base de datos. La escalada de privilegios se consigue mediante un ataque de PATH hijacking en un binario SUID personalizado que ejecuta comandos del sistema sin especificar rutas absolutas.

Tรฉcnicas utilizadas:

  • SQL Injection (UNION-based)

  • File Upload Bypass

  • Web Shell Upload

  • Database Enumeration

  • Credential Reuse

  • PATH Hijacking

  • SUID Binary Exploitation

๐Ÿ”ญ 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

Enumeramos el servicio web para descubrir un sitio web para un portfolio que aloja imรกgenes como contenido desarrollado con Magic (https://github.com/once-ui-system/magic-portfolio). Hay un formulario de Login, aunque a priori no vemos ninguno de registro:

Fuzzing de directorios

Tras probar a realizar fuzzing de directorios con dirsearch, gobuster y feroxbuster, no logramos enumerar nada que podamo usar como un potencial vector de ataque:

๐Ÿ’‰ SQLi en Panel de login

Nos queda por analizar el panel de login y ver si es vulnerable a una posible inyecciรณn SQL. Probando con credenciales por defecto de tipo admin:admin admin:Admin123 o admin:Password1 obtenemos una alerta de javascript indicando que las credenciales no son vรกlidas:

Sin embargo, si probamos a introducir un carรกcter ' para verificar una posible inyecciรณn sql, no obtenemos ningรบn error, lo cual nos hace pensar que algo estรก ocurriendo el backend a la hora de procesar la solicitud.

Probamos con una SQLi de tipo uniรณn usando el siguiente payload:

Y tampoco obtenemos error, por lo que parece funcionar. Lo รบnico que debemos es ajustar el nรบmero de columnas en el payload hasta encontrar el nรบmero correcto. que tenga la tabla. Probamos con 3 valores y bingo! estamos dentro!

Hemos logrado acceder y tenemos acceso al mรณdulo de carga de archivos. Analicemos quรฉ tipo de extensiones estรกn permitidas de cara a una posible subida de una webshell para explotar una RCE

Una alerta javascript ya nos deja claro que solo se admiten archivos con las extensiones de imagen que se indican.

๐Ÿ“ค File Upload Bypass y RCE

Procedemos a crear una imagen dummy pero cuyo contenido sea vรกlido

A continuaciรณn embebemos una php shell en la imagen que hemos creado anteriormente

Verificamos el tamaรฑo y el mime type para asegurarnos de que cumpla con las condiciones necesarias para pasar los filtros de validaciรณn:

Renombramos el archivo

Interceptamos la peticiรณn con burp y cambiamos el nombre del archivo shell.jpg por shell.php.jpg

Obtenemos un mensaje de que la imagen se ha subido correctamente.

Ahora nos queda saber donde se ha almacenado la imagen. Revisando el cรณdigo fuente del home de la aplicaciรณn vemos la ruta donde estรกn almacenadas las imรกgenes que ya existen actualmente:

Usamos esa ruta para referenciar nuestra imagen de la siguiente forma y probar la ejecuciรณn remota de comandos:

Ahora, cambiamos el payload para tratar de ganar acceso a la mรกquina de Magic. En primer lugar iniciamos un listener:

NOTA: Tuve que volver a subir la webshell ya que cada vez que ejecutaba un comando me borraba el archivo de la mรกquina.

Ganamos acceso a la mรกquina Magic

๐Ÿ”„ Movimiento Lateral

Encontramos un usuario llamado theseus en la mรกquina aunque no podemos leer la flag que se encuentra en su directorio

Continuamos enumerando la mรกquina en busca de un potencial vector que nos permita realizar un movimiento lateral para ganar acceso como usuario theseus. Encontramos credenciales en el archivo db.php5 del directorio /var/www/Magic

En primer lugar comprobamos si theseus estรก reutilizando esta contraseรฑa con su usuario del sistema pero verificamos que no.

๐Ÿ—ƒ๏ธ Enumeraciรณn de Base de Datos

Vemos si hay una base de datos ejecutรกndose de forma local y podemos ganar acceso a ella:

Tratamos de conectarnos a la base de datos y encontramos un problema, el cliente mysql no estรก instalado en la แธฟaquina:

Valorรฉ la opciรณn de usar chisel para realizar port forwading, pero se me ocurriรณ realizar una bรบsqueda en el sistema para ver quรฉ opciones aparecรญan buscando mysql:

Buscando informaciรณn en la red, encontrรฉ que se puede usar mysqldump usando la siguiente sintaxis para realizar un dump de la base de datos

Obtenemos una nueva credencial Th3s3usW4sK1ng. Veamos si esta sรญ estรก siendo reutilizada por el usuario theseus, tal como parece indicar por el nombre.

Ahora sรญ, logramos movernos lateralmente y ganar acceso como theseus y capturar la primera flag:

๐Ÿš€ Escalada a root

Comprobamos que theseus no puede ejecutar nada como root

๐Ÿ” Enumeraciรณn de binarios SUID

Enumeramos binarios con permisos SUID:

Entre los resultados, hay uno que no es habitual

๐Ÿ› ๏ธ Anรกlisis del binario sysinfo

Ejecutar Sysinfo con Ltrace imprime las llamadas realizadas fuera del binario. La salida es enorme pero hay una lรญnea que destaca:

Popen es otra forma de abrir un proceso en Linux. El binario estรก haciendo una llamada a fdisk, lo cual estรก bien, excepto que lo estรก haciendo sin especificar la ruta completa. Esto deja al binario vulnerable a un ataque de PATH hijacking.

๐ŸŽฏ PATH Hijacking

Creamos nuestro payload en /dev/shm (todo lo que hay en รฉl se borra al reiniciar la mรกquina) con una bash shell one liner

NOTA: importante darle permisos de ejecuciรณn al binario que usamos como payload.

Ahora modificamos el path para que cuando el script busque la herramienta fdisk con la ruta de forma relativa encuentre en primer lugar lo que hay en /dev/shm y se ejecute primero:

Iniciamos un listener con netcat

Lanzamos el binario /bin/sysinfo y ganamos acceso como root

Last updated