
Laboratorio basado en Docker que demuestra la explotación de CVE-2017-8291 (GhostButt) mediante el procesamiento de imágenes EPS con Python PIL/Pillow, con una aplicación web vulnerable y exploit de prueba de concepto.
Python PIL (Pillow) es una popular biblioteca 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), lo pasa 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 la opción -dSAFER está configurada (modo seguro), una vulnerabilidad de evasión del sandbox en GhostScript (GhostButt CVE-2017-8291) permite eludir este mecanismo de seguridad, habilitando la ejecución arbitraria de comandos.
A fecha de redacción de este documento, incluso la última versión oficial de GhostScript, la 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 iniciarla, visite http://your-ip:8000/ para acceder a la página de subida.
La funcionalidad normal de esta aplicación permite a los usuarios subir 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, la comprobación de la extensión del archivo puede ser eludida.
Por ejemplo, podemos subir poc.png, que ejecutará el comando touch /tmp/aaaaa en el servidor. Modificando el comando en el POC a un comando de shell inversa, podemos obtener acceso de shell al servidor:
