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, которая детектит такие файлы.
Обычно его даже не прослушивают
(продолжение в комментарии к посту, потому что у Телеграма есть ограничение по размеру
