Как стать автором
Обновить

Как рассуждать, чтобы проходить Capture The Flag игры

Время на прочтение6 мин
Количество просмотров5.7K

Capture The Flag - название ряда соревнований в информатике, чаще всего - в информационной безопасности. Как веб-разработчик, я интересуюсь только CTF в области web'а - поиск уязвимостей, атаки, сетевое взаимодействие. На старте решения первого CTF было трудно понять, как же именно рассуждают проф. игроки, участвующие в турнирах, и я решил написать несколько статей о том, как можно искать зацепки в исходных данных и как раскручивать их до победы.

Картинка для красоты. Источник: https://habr.com/ru/post/535140/
Картинка для красоты. Источник: https://habr.com/ru/post/535140/

Рассказывать это я буду на живых примерах от простого к сложному. В качестве первой игры рекомендую пройти CuriositY - "любопытство", как достаточно простой, приятный и не требующий глубоких/широких познаний в Computer Science квест. Если вы хотите попробовать себя до прочтения статьи, то вот ссылка на игру.

Источник: https://shark.fish/curiosity/level001/index.html
Источник: https://shark.fish/curiosity/level001/index.html

Начальная настройка:

Во-первых, необходимо открыть браузер без расширений, т.к. некоторые из них добавляют ненужные фреймы, скрывают блоки и прочее. Нам нужно видеть документ в нормальном состоянии (утверждение не всегда верно). Во-вторых, открыть девтулз и выставить Desktop режим, чтобы видеть, когда и как меняется курсор. Это пригодится в первой же задаче.

Далее текст скрыт под спойлеры для удобства) Вышло достаточно многословно. Первые 10 задач достаточно простые, поэтому снова рекомендую попробовать сначала самостоятельное решение.

Задача 1.

Превью, рассуждения и решение
Задача 1.
Задача 1.

Здесь всё достаточно просто. До того, как открыть код страницы, можно нажать на каждый видимый блок, вернуться в исходное состояние, и провести мышкой между блоками. Так, по изменившемуся на указатель курсору, заметим, что в центре есть ссылка без бекграунда, ведущая нас на второй этап.

Задача 2.

Превью, рассуждения и решение
Задача 2.
Задача 2.

В качестве подсказки мы получаем переменную lvl и инкремент) В данном случае легко заметить, что в адресной строке у нас есть level и номер, пробуем увеличить на один и переходим на следующий этап. Пока всё просто, но это начало))

Кстати, если вы продолжите увеличивать номер, то увидите маленькую пасхалочку от автора.

Задача 3.

Превью, рассуждения и решение
Задача 3.
Задача 3.

Здесь мы не можем ничего прожать, нет никаких видимых элементов, кликабельных ссылок. Значит, открываем код страницы и смотрим HTML, т.к. в подсказке как раз скобки, характерные в т.ч. для языков разметки.

Страничка простая, поэтому сразу находим в комментарии applause.html и вставляем в адресную строку для перехода на следующий этап.

Задача 4.

Превью, рассуждения и решение
Задача 4.
Задача 4.

Подсказка тоже достаточно простая, сразу видно обычную консоль, поэтому до того, как начнём думать "а вдруг что-то сложнее", пробуем проверить вывод консоли на странице - и, бинго! Находим iso.html. Вставляем в адресную строку, идём дальше.

Задача 5.

Превью, рассуждения и решение
Задача 5. Пробуем консольные команды, уже становится интересно)
Задача 5. Пробуем консольные команды, уже становится интересно)

Задачи усложняются. Мы видим терминал, можем вводить туда команды, базовое в таком случае - посмотреть, что есть ( ls ), посмотреть, есть ли скрытые файлы ( ls -a ), сменить директорию ( cd ) и прочие. Чем сложнее CTF, тем лучше нужно ориентироваться в консольных командах и понимать, какие параметры можно передать команде.

Итак, сначала посмотрим, что у нас в папке. Вводим ls -a и видим, что есть субдиректория curiosity. Переходим в неё с помощью команды cd и снова смотрим, что у нас есть.

В текущей директории есть ряд файлов и субдиректорий. Мы сейчас находимся на пятом уровне, поэтому попробуем перейти в 005 и посмотреть, что там:

А вот и ответ
А вот и ответ

Так как все предыдущие ответы сводились к поиску html файла, то и тут не будет исключений. Вводим в адресную строку quiff.html и переходим на шестой уровень

Задача 6.

Превью, рассуждения и решение
Задача 6. Нередко подсказки зашиты в url
Задача 6. Нередко подсказки зашиты в url

Что ж, раз на странице ничего не кликается, а подсказка в урле означает "слой", то сразу идём в девтулз. Ожидать можно многого: div с pointer-events:none, z-index и position: absolute, нужно внимательно смотреть возможные варианты. Однако, в данном случае, всё проще: изображение - svg, значит, нужно открыть его в новой вкладке и так же посмотреть в девтулз.

У свг могут быть атрибуты или метаинформация, которые в других задачах могут содержать подсказки, но у нас всё ещё проще: достаточно удалить <rect>, чтобы увидеть ответ на задачу.

Решение: https://shark.fish/curiosity/level006/behind.html
Решение: https://shark.fish/curiosity/level006/behind.html

Задача 7.

Превью, рассуждения и решение
Задача 7. Перевод с латыни
Задача 7. Перевод с латыни

Это задание примечательно тем, что представляет собой целый класс подсказок: отсылки на цитаты, личности, события. Для решения подобных вопросов необходимо развивать кругозор не только в технических рамках, но и читать о развитии науки в целом, узнавать людей, их высказывания и прочее. Я предпочитаю всё же более hard skills задачи, а не эрудицию, но всё же.

Школьных познаний латыни достаточно, чтобы сопоставить: vita = жизнь, universum = вселенная, omnia (больше от Gitlab Omnibus триггернуло) - что-то типа "всё вместе". Похоже, что тут "Главный вопрос жизни, вселенной и всего такого" с ответом "42" - и 42.html действительно является ответом.

Задача 8.

Превью, рассуждения и решение
Задача 8. Явно преобразование числа из десятичной системы в двоичную
Задача 8. Явно преобразование числа из десятичной системы в двоичную

Здесь тоже всё достаточно просто:
- имеем число
- необходимо конвертировать его в двоичное
- после попробуем вставить число + '.html' в адресную строку

Чтобы быстро сконвертировать число из десятичной в двоичную систему нам нужно открыть консоль браузера и ввести Number(42).toString(2), что вернёт нам '101010'.

Задача 9.

Превью, рассуждения и решение
Задача 9. Название файла наводит на мысль
Задача 9. Название файла наводит на мысль

Подсказка явно требует подстановки пути до файла в урл. Вставив эту строку вместо csv.html, мы получаем файл, похожий на координаты в трёхмерном пространстве: 3 столбца и множество строк, во всех ячейках - цифры.

После достаточно долгих поисков сумел отыскать сервис, позволяющий залить csv и сгенерировать модель: http://bl.ocks.org/phil-pedruco/9913243

Модель можно вращать, осматривать с разных сторон
Модель можно вращать, осматривать с разных сторон

Похоже на полый цилиндр. Попробуем подставить названия в адресную строку

https://shark.fish/curiosity/level009/cylinder.html
https://shark.fish/curiosity/level009/cylinder.html

Что ж, придётся угадывать. Пробовал переводить трубу, бочку, кольцо - безрезультатно. Признаюсь, залез на гитхаб проекта, чтобы увидеть ответ. Оказалось, что это donut.html - то есть пончик. Не согласен с автором, но, возможно, нужно было использовать не онлайн генерацию, а какое-то более известное средство, возможно, MatLab.

Задача 10.

Превью, рассуждения и решение
Задача 10. Упоминание в соцсетях
Задача 10. Упоминание в соцсетях

Изначально по подсказке я подумал, что это упоминание на гитхабе, и нужно найти такой профиль. Сразу скопировал всю строку и отправил в гугл, оказалось, что это профиль в твиттере с единственным постом: fever.html

Задача 11.

Превью, рассуждения и решение
Задача 11. Репозиторий
Задача 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.

Превью, рассуждения и решение
Задача 12. Буквы или символы?
Задача 12. Буквы или символы?

Странное задание. Изначально искал подвох, но глаза зацепились за res, our, попробовал ввести resource и прокатило. Иногда задачи проще, чем кажутся.

Задача 13.

Превью, рассуждения и решение
Задача 13. Подсказка в адресной строке
Задача 13. Подсказка в адресной строке

Cразу гуглим ISO 10646, вспоминаем, что это стандарт символов Unicode, и теперь у нас два варианта:
- посчитать сумму и найти символ в таблице юникода
- найти символы в таблице юникода и посчитать сумму

Как оказалось, под 2609 в таблице символов юникода находится солнце, а 26С6 - дождь. Сложив дождь и солнце, мы получаем радугу, и, введя в адресную строку rainbow, получим ошибку:

Значит, нужен юникод
Значит, нужен юникод

Символ радуги в юникоде - 1f308. Вбиваем его в урл и переходим на следующий уровень.

Задача 14

Превью, рассуждения и решение
Задача 14. Выглядит просто
Задача 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 меняем на число, копируем и вставляем в консоль, смотрим ответ:

https://shark.fish/curiosity/level014/cartel.html
https://shark.fish/curiosity/level014/cartel.html

Задача 15

Превью, рассуждения и решение
Задача 15. Координаты
Задача 15. Координаты

Что ж, очень сильно похоже на координаты для GPS. Открываем Google Maps, вбиваем строку as is - не удаётся найти. Пробуем сменить местами аргументы - видим фотографию Hollywood, вводим в адресную строку и финишируем!

Спасибо за внимание! Надеюсь, у меня удалось заинтересовать подобными контестами пару-тройку новых людей :)

Теги:
Хабы:
Всего голосов 5: ↑5 и ↓0+5
Комментарии11

Публикации

Истории

Работа

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань