
PoC educativo para CVE-2017-8291 (GhostButt) que demuestra ejecución remota de comandos a través del procesamiento de imágenes EPS con Python PIL/Pillow y evasión del sandbox de GhostScript.
Python PIL (Pillow) es una biblioteca popular de procesamiento de imágenes para Python. Soporta varios formatos de imagen y proporciona potentes capacidades de manipulación de imágenes.
El módulo de procesamiento de imágenes de Python PIL (Pillow) está afectado por la vulnerabilidad GhostButt (CVE-2017-8291) porque internamente llama a GhostScript para procesar imágenes EPS. Esta vulnerabilidad permite a los atacantes ejecutar comandos arbitrarios en el sistema objetivo.
Cuando PIL procesa una imagen, determina el tipo de imagen basándose en la cabecera del archivo (Magic Bytes). Si identifica un archivo EPS (cabecera que comienza con %!PS), pasa el archivo a PIL/EpsImagePlugin.py para su procesamiento.
En este módulo, PIL llama al comando GhostScript del sistema (gs) para procesar el archivo de imagen:
command = ["gs",
"-q", # quiet mode
"-g%dx%d" % size, # set output geometry (pixels)
"-r%fx%f" % res, # set input DPI (dots per inch)
"-dBATCH", # exit after processing
"-dNOPAUSE", # don't pause between pages,
"-dSAFER", # safe mode
"-sDEVICE=ppmraw", # ppm driver
"-sOutputFile=%s" % outfile, # output file
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# adjust for image origin
"-f", infile, # input file
]
# Code to check if GhostScript is installed is omitted
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)
Aunque se establece el indicador -dSAFER (modo seguro), una vulnerabilidad de omisión del sandbox en GhostScript (GhostButt CVE-2017-8291) permite eludir este mecanismo de seguridad, habilitando la ejecución de comandos arbitrarios.
Al momento de escribir esto, incluso la última versión oficial de GhostScript 9.21 sigue afectada por esta vulnerabilidad. Por lo tanto, mientras GhostScript esté instalado en el sistema operativo, PIL es vulnerable a la ejecución de comandos.
Referencias:
Ejecute el siguiente comando para iniciar una aplicación web vulnerable a la vulnerabilidad CVE-2017-8291:
docker compose up -d
Después de iniciar, visite http://your-ip:8000/ para acceder a la página de carga.
La funcionalidad normal de esta aplicación permite a los usuarios cargar un archivo PNG. El backend utiliza PIL para cargar la imagen y mostrar sus dimensiones. Sin embargo, podemos explotar esto cambiando la extensión de un archivo EPS ejecutable a PNG y subiéndolo. Dado que el backend determina el tipo de imagen basándose en la cabecera del archivo en lugar de la extensión, se puede omitir la verificación de la extensión del archivo.
Por ejemplo, podemos cargar poc.png, que ejecutará el comando touch /tmp/aaaaa en el servidor. Modificando el comando en el POC a un comando de reverse shell, podemos obtener acceso a la shell del servidor:
