tgoop.com/cxx95/93
Last Update:
#story
Как я решал задачи по CTF
CTF (Capture The Flag) это соревнования, где участники решают веселые задачки "типа" по кибербезопасности.
Задачи разделяются на несколько категорий.
Дается какая-то сущность (адрес сайта, архив, бинарник, изображение) и из этой сущности надо вытащить "флаг" - строку наподобии flag{w0w_y0u_ar3_c00l_h@cker}
, которая может находиться в неожиданных местах.
На мой взгляд, умение решать такие задачи никуда не конвертируется. Это очень сильно "вещь в себе". Рекламируется, что подобные задачи сделаны типа для "хакеров", но это жесткий развод, потому что по-моему хакеры не этим занимаются.
Кроме того, многие задачи никогда не догадаешься как решать, если не решал что-то подобное раньше (с подсказками), поэтому прямо на смекалочку задач не так много.
Какие типичные задачи попадаются и как их решать?
Некоторые форматы изображений поддерживают "комментарии" (и прочие метаданные), находим флаг там. "Комментарий" можно увидеть в GIMP или других редакторах (открыв там картинку), но проще всего запустить команду в терминале.
При запуске ./hack_me
выводит хреновню. Однако где-то в нем в открытом виде (не обфусцированном) спрятан флаг. Запускаем strings hack_me
(оно ищет человекочитаемые строки) и видим флаг.
По дизассемблеру видим, что требуется "типа" ввести какую-то правильную строку, чтобы показать флаг.
Вообще если где-то в коде есть const char* f = "flag{...}";
то этот flag{...}
попадает в бинарь в виде человекочитаемой строки, однако авторы просто обфусцируют этот флаг, чтобы он вычислялся по переусложненной схеме.
Решением является заменить руками несколько байт в бинарнике на инструкцию jmp
до вывода флага (чтобы он вывелся без условий).
Теперь флаг не выводится сам, а просто есть намертво обфусцированные функции. Предлагается вручную восстановить "на бумаге" алгоритм в этих функциях. Такие задачи можно решать до трёх часов (у меня было так), сидя в gdb
и дизассемблере.
Видел, что иногда бывает дизассемблер Python или Java, по идее это должно быть в 100500 раз проще C/C++, но мне такие задачи не встречались.
Нужно написать запрос, который покажет ключ. Обычно делается в виде SQL-инъекции, типа вводишь 1" OR «1» = «1»
и получаешь все записи. Напоминаю, что это никак не относится к хакерству, потому что даже самые тупые веб-фреймворки умеют обезопасиваться от этих школьных приемов.
Однако бывают ублюдские задачи, например в одной из них надо было по-моему знать специфические команды MySQL (которых ни в какой другой СУБД нет), которые покажут все доступные таблицы, и вывести данные из "тайной" таблицы.
Теперь флаг реально зашифрован в изображении, а не в его метаданных. Это называется "стеганография".
Часто оказывается, что флаг можно увидеть, скажем посмотрев только зеленую маску (из пикселей (r,g,b)
сделать (0,g,0)
).
Если это картинка типа "помехи телевизора", можно отзеркалить картинку и наложить на исходную, тогда наложение покажет ключ.
Есть целые тулзы для классов задач(!) Для стеганографии это zsteg.
Часто нужный файл/файлы "спрятан" сразу после первого. То есть грубо говоря взяли файл картинки и сразу после последнего байта картинки приписали файл архива.
Прикол в том, что просмотрщик картинки игнорирует "лишние" байты, и обнаружить спрятанный архив можно только из терминала.
Это детектится по сигнатурам - например архив начинается с человекочитаемых байтов Rar!
. По-моему тоже есть тулза специально для CTF, которая детектит такие файлы.
Обычно его даже не прослушивают
(продолжение в комментарии к посту, потому что у Телеграма есть ограничение по размеру