Ghost file read via symlink (CVE-2023-40028)
Ghost es un CMS muy usado para blogs y boletines. Hasta la versión 5.59.1, un usuario autenticado (con permiso de subida de imágenes) podía leer ficheros arbitrarios del servidor abusando de cómo Ghost procesa los adjuntos: la CVE-2023-40028.
La idea. Ghost acepta subir un fichero de imagen y luego lo sirve de vuelta por su URL. El fallo es que no valida que el fichero subido sea realmente una imagen ni que no sea un enlace simbólico. Si en lugar de un .png se sube un symlink que apunta, por ejemplo, a /etc/passwd, al pedir esa "imagen" Ghost devuelve el contenido del fichero apuntado. Es una lectura arbitraria de ficheros (un LFI de servidor) con los privilegios del proceso de Ghost.
Cómo se explota. Hay PoCs que automatizan el proceso (autenticarse contra la API de administración, crear el enlace, subirlo y pedirlo). El flujo es:
git clone https://github.com/0xyassine/CVE-2023-40028.git
./CVE-2023-40028.sh -u <admin@domain> -p <password>
# luego se indica la ruta a leer, con ../ hasta la raíz:
# ../../../../../../etc/passwdPor qué importa el objetivo. No todo fichero es legible: el proceso de Ghost corre como un usuario sin privilegios, así que /etc/shadow o ficheros de root quedan fuera. Lo rentable es leer la configuración de la aplicación (config.production.json), que suele guardar credenciales de base de datos, SMTP o claves de API en claro, perfectas para una reutilización de credenciales contra SSH u otros servicios.
Matiz. Que el endpoint sea autenticado obliga a tener primero una cuenta válida (aquí, una credencial filtrada en un repositorio). La vulnerabilidad eleva un acceso de "usuario del CMS" a "lector del sistema de ficheros", no da por sí sola ejecución de comandos.
Cómo detectarlo. La firma está en el patrón de subida: un usuario autenticado que sube por la API de administración un "archivo de imagen" que en realidad es un enlace simbólico (o cuyo nombre contiene ../ hacia rutas del sistema), y luego lo solicita de vuelta. La respuesta delata el abuso: al pedir esa "imagen", el servidor devuelve texto plano (el contenido de config.production.json, /etc/passwd) en vez de datos binarios de imagen. Lecturas repetidas de la configuración de la app tras subir ficheros anómalos, o un Content-Type de imagen con cuerpo de texto, son la señal.
Defensa. Actualizar Ghost a 5.59.1 o superior; en general, validar que un fichero subido no sea un enlace simbólico y resolver la ruta real antes de servirla.
Máquinas donde se aplica
- LinkVortexHackTheBox