
Лабораторная среда на основе Docker для демонстрации эксплуатации CVE-2017-8291 (GhostButt) через обработку EPS-изображений с использованием Python PIL/Pillow, включающая уязвимое веб-приложение и эксплойт для подтверждения концепции.
Python PIL (Pillow) — это популярная библиотека обработки изображений для Python. Она поддерживает различные форматы изображений и предоставляет мощные возможности для манипуляции изображениями.
Модуль обработки изображений Python PIL (Pillow) подвержен уязвимости GhostButt (CVE-2017-8291), поскольку он внутренне вызывает GhostScript для обработки EPS-изображений. Эта уязвимость позволяет злоумышленникам выполнять произвольные команды на целевой системе.
Когда PIL обрабатывает изображение, он определяет тип изображения по заголовку файла (Magic Bytes). Если идентифицируется EPS-файл (заголовок начинается с %!PS), файл передается в PIL/EpsImagePlugin.py для обработки.
В этом модуле PIL вызывает системную команду GhostScript (gs) для обработки файла изображения:
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)
Хотя установлен флаг -dSAFER (безопасный режим), уязвимость обхода песочницы в GhostScript (GhostButt CVE-2017-8291) позволяет обойти этот механизм безопасности, что приводит к возможности выполнения произвольных команд.
На момент написания данной статьи даже последняя официальная версия GhostScript 9.21 все еще подвержена этой уязвимости. Таким образом, если GhostScript установлен в операционной системе, PIL уязвим для выполнения команд.
Ссылки:
Выполните следующую команду, чтобы запустить веб-приложение, уязвимое к CVE-2017-8291:
docker compose up -d
После запуска перейдите по адресу http://your-ip:8000/ для доступа к странице загрузки.
Обычная функциональность этого приложения позволяет пользователям загружать PNG-файл. Бэкенд использует PIL для загрузки изображения и вывода его размеров. Однако мы можем воспользоваться этим, изменив расширение исполняемого EPS-файла на PNG и загрузив его. Поскольку бэкенд определяет тип изображения по заголовку файла, а не по расширению, проверка расширения файла может быть обойдена.
Например, мы можем загрузить poc.png, который выполнит команду touch /tmp/aaaaa на сервере. Изменив команду в POC на команду обратной оболочки, можно получить доступ к оболочке сервера:
