Capture The Flag - название ряда соревнований в информатике, чаще всего - в информационной безопасности. Как веб-разработчик, я интересуюсь только CTF в области web'а - поиск уязвимостей, атаки, сетевое взаимодействие. На старте решения первого CTF было трудно понять, как же именно рассуждают проф. игроки, участвующие в турнирах, и я решил написать несколько статей о том, как можно искать зацепки в исходных данных и как раскручивать их до победы.
Рассказывать это я буду на живых примерах от простого к сложному. В качестве первой игры рекомендую пройти CuriositY - "любопытство", как достаточно простой, приятный и не требующий глубоких/широких познаний в Computer Science квест. Если вы хотите попробовать себя до прочтения статьи, то вот ссылка на игру.
Начальная настройка:
Во-первых, необходимо открыть браузер без расширений, т.к. некоторые из них добавляют ненужные фреймы, скрывают блоки и прочее. Нам нужно видеть документ в нормальном состоянии (утверждение не всегда верно). Во-вторых, открыть девтулз и выставить Desktop режим, чтобы видеть, когда и как меняется курсор. Это пригодится в первой же задаче.
Далее текст скрыт под спойлеры для удобства) Вышло достаточно многословно. Первые 10 задач достаточно простые, поэтому снова рекомендую попробовать сначала самостоятельное решение.
Задача 1.
Превью, рассуждения и решение
Здесь всё достаточно просто. До того, как открыть код страницы, можно нажать на каждый видимый блок, вернуться в исходное состояние, и провести мышкой между блоками. Так, по изменившемуся на указатель курсору, заметим, что в центре есть ссылка без бекграунда, ведущая нас на второй этап.
Задача 2.
Превью, рассуждения и решение
В качестве подсказки мы получаем переменную lvl и инкремент) В данном случае легко заметить, что в адресной строке у нас есть level и номер, пробуем увеличить на один и переходим на следующий этап. Пока всё просто, но это начало))
Кстати, если вы продолжите увеличивать номер, то увидите маленькую пасхалочку от автора.
Задача 3.
Превью, рассуждения и решение
Здесь мы не можем ничего прожать, нет никаких видимых элементов, кликабельных ссылок. Значит, открываем код страницы и смотрим HTML, т.к. в подсказке как раз скобки, характерные в т.ч. для языков разметки.
Страничка простая, поэтому сразу находим в комментарии applause.html
и вставляем в адресную строку для перехода на следующий этап.
Задача 4.
Превью, рассуждения и решение
Подсказка тоже достаточно простая, сразу видно обычную консоль, поэтому до того, как начнём думать "а вдруг что-то сложнее", пробуем проверить вывод консоли на странице - и, бинго! Находим iso.html
. Вставляем в адресную строку, идём дальше.
Задача 5.
Превью, рассуждения и решение
Задачи усложняются. Мы видим терминал, можем вводить туда команды, базовое в таком случае - посмотреть, что есть ( ls ), посмотреть, есть ли скрытые файлы ( ls -a ), сменить директорию ( cd ) и прочие. Чем сложнее CTF, тем лучше нужно ориентироваться в консольных командах и понимать, какие параметры можно передать команде.
Итак, сначала посмотрим, что у нас в папке. Вводим ls -a
и видим, что есть субдиректория curiosity. Переходим в неё с помощью команды cd и снова смотрим, что у нас есть.
В текущей директории есть ряд файлов и субдиректорий. Мы сейчас находимся на пятом уровне, поэтому попробуем перейти в 005 и посмотреть, что там:
Так как все предыдущие ответы сводились к поиску html файла, то и тут не будет исключений. Вводим в адресную строку quiff.html
и переходим на шестой уровень
Задача 6.
Превью, рассуждения и решение
Что ж, раз на странице ничего не кликается, а подсказка в урле означает "слой", то сразу идём в девтулз. Ожидать можно многого: div с pointer-events:none, z-index и position: absolute, нужно внимательно смотреть возможные варианты. Однако, в данном случае, всё проще: изображение - svg, значит, нужно открыть его в новой вкладке и так же посмотреть в девтулз.
У свг могут быть атрибуты или метаинформация, которые в других задачах могут содержать подсказки, но у нас всё ещё проще: достаточно удалить <rect>, чтобы увидеть ответ на задачу.
Задача 7.
Превью, рассуждения и решение
Это задание примечательно тем, что представляет собой целый класс подсказок: отсылки на цитаты, личности, события. Для решения подобных вопросов необходимо развивать кругозор не только в технических рамках, но и читать о развитии науки в целом, узнавать людей, их высказывания и прочее. Я предпочитаю всё же более hard skills задачи, а не эрудицию, но всё же.
Школьных познаний латыни достаточно, чтобы сопоставить: vita = жизнь, universum = вселенная, omnia (больше от Gitlab Omnibus триггернуло) - что-то типа "всё вместе". Похоже, что тут "Главный вопрос жизни, вселенной и всего такого" с ответом "42" - и 42.html действительно является ответом.
Задача 8.
Превью, рассуждения и решение
Здесь тоже всё достаточно просто:
- имеем число
- необходимо конвертировать его в двоичное
- после попробуем вставить число + '.html' в адресную строку
Чтобы быстро сконвертировать число из десятичной в двоичную систему нам нужно открыть консоль браузера и ввести Number(42).toString(2)
, что вернёт нам '101010'.
Задача 9.
Превью, рассуждения и решение
Подсказка явно требует подстановки пути до файла в урл. Вставив эту строку вместо csv.html, мы получаем файл, похожий на координаты в трёхмерном пространстве: 3 столбца и множество строк, во всех ячейках - цифры.
После достаточно долгих поисков сумел отыскать сервис, позволяющий залить csv и сгенерировать модель: http://bl.ocks.org/phil-pedruco/9913243
Похоже на полый цилиндр. Попробуем подставить названия в адресную строку
Что ж, придётся угадывать. Пробовал переводить трубу, бочку, кольцо - безрезультатно. Признаюсь, залез на гитхаб проекта, чтобы увидеть ответ. Оказалось, что это donut.html
- то есть пончик. Не согласен с автором, но, возможно, нужно было использовать не онлайн генерацию, а какое-то более известное средство, возможно, MatLab.
Задача 10.
Превью, рассуждения и решение
Изначально по подсказке я подумал, что это упоминание на гитхабе, и нужно найти такой профиль. Сразу скопировал всю строку и отправил в гугл, оказалось, что это профиль в твиттере с единственным постом: fever.html
Задача 11.
Превью, рассуждения и решение
Необязательно сразу клонировать проект, мы можем перейти по ссылке и посмотреть, что находится в репозитории. Видим, что там один .md файл, но есть один нюанс: почти 900 коммитов!
Что ж, клонируем, будем изучать историю изменений файла. Задание так же типовое, и для решения задач данного класса нужно понимать, как работает git, и уметь пользоваться либо консолью, либо графическим представлением. По командам чаще всего нужны:
- log
- log -S
- diff
- show
Также попробуем открыть первый коммит, 11й коммит (номер задачи). Итоговый алгоритм решения задачи оказался достаточно простым: я решил, что нужно искать по строке из .md
файла, и выполнил команду git log -S 'There is nothing here'
Поиск дал 3 коммита, у одного commit message - 'jneq', у второго - 'uokp', у третьего - 'Initial commit'. Чтобы посмотреть изменения, выведем для каждого коммита git show, и увидим простые диффы, у одного из который будет нужный файл - cactus.html
Задача 12.
Превью, рассуждения и решение
Странное задание. Изначально искал подвох, но глаза зацепились за res, our, попробовал ввести resource и прокатило. Иногда задачи проще, чем кажутся.
Задача 13.
Превью, рассуждения и решение
Cразу гуглим ISO 10646, вспоминаем, что это стандарт символов Unicode, и теперь у нас два варианта:
- посчитать сумму и найти символ в таблице юникода
- найти символы в таблице юникода и посчитать сумму
Как оказалось, под 2609 в таблице символов юникода находится солнце, а 26С6 - дождь. Сложив дождь и солнце, мы получаем радугу, и, введя в адресную строку rainbow, получим ошибку:
Символ радуги в юникоде - 1f308. Вбиваем его в урл и переходим на следующий уровень.
Задача 14
Превью, рассуждения и решение
Судя по урлу и ошибки в консоли, нам нужно смотреть JS-код на странице. Для удобства приведу его здесь:
[ -1, -3, 14, 16, 1, 8, -54, 4, 16, 9, 8 ].map(function() { return String.fromCharCode(x) + ONE_HUNDRED; }).join("");
Для тех, кто знаком с JS, очевидно, что в коллбэк для map не передаём переменную, плюс у нас не определена и переменная ONE_HUNDRED. Передаём икс, ONE_HUNDRED меняем на число, копируем и вставляем в консоль, смотрим ответ:
Задача 15
Превью, рассуждения и решение
Что ж, очень сильно похоже на координаты для GPS. Открываем Google Maps, вбиваем строку as is - не удаётся найти. Пробуем сменить местами аргументы - видим фотографию Hollywood, вводим в адресную строку и финишируем!
Спасибо за внимание! Надеюсь, у меня удалось заинтересовать подобными контестами пару-тройку новых людей :)