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, вводим в адресную строку и финишируем!

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

Комментарии (11)


  1. hMartin
    17.08.2022 00:03
    +1

    Ну это прям какие-то детские игры!
    Участвовал пока только в одном CTF, который проводился среди нескольких компаний, отсекая секьюрити-отделы.

    Настоящее веселье - это SQL инъекции, переполнение буффера в программе на C, XXE, эксплуатация какой-нибудь недавней серьезной уязвимости в библиотеке.

    Сидишь и потеешь после работы, удивляясь как какие-то гении щелкают эти задачки за час :)


    1. DreamShaded Автор
      17.08.2022 10:10

      За час не щёлкаю, но да, такое в разы интереснее) но когда сбрасывал друзьям "вот, попробуй для начала", то получаю "да блин, сложна"

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


  1. sunnybear
    17.08.2022 08:55
    +1

    По Vita, universum, omnia гуглится полный репозиторий. Как то совсем просто.. :)


    1. DreamShaded Автор
      17.08.2022 10:27

      по многим гуглятся статьи с решениями даже) но смысл - мозг поломать, а не получить решение)

      я над ними сижу иногда неделями (после работы, вечерком, далеко не каждый день), зато потом такое удовлетворение, если смог решить до конца)


  1. Kreont
    17.08.2022 11:42
    +1

    В 10 задаче подходит ещё torus


  1. xi-tauw
    17.08.2022 12:56
    +1

    Задача 12 просто описывает что надо нажимать на клавиатуре вместе с стрелочками.


    1. DreamShaded Автор
      17.08.2022 13:19

      а, вот в чём соль! спасибо


  1. Urub
    17.08.2022 16:22
    +1

    Для начинающих - очень интересно


    1. DreamShaded Автор
      18.08.2022 01:36

      спасибо) стараюсь собрать задачки или бокс посложнее, чтобы была всё же поплавнее кривая захода. Учебники по CTF в сети таки есть, ноо я после них не мог сразу погрузиться, было много болезненных моментов, надо решать как-то, сглаживать это)


  1. nice17
    18.08.2022 09:14
    +1

    Спасибо! Очень понравилась - и игра, и разбор. Может посоветуете ещё что-нибудь такого же уровня, чтобы чисто в браузере можно было решать? Например то, что будет в следующей статье :)


    1. DreamShaded Автор
      18.08.2022 11:40

      Спасибо!) Да, постараюсь в течение пары недель продумать адекватный переход) уже была грешным делом мысль самому собрать из готовых задач и составить, но закопаюсь, да и вроде были с конференций прикольные CTFки без излишне глубоких познаний в атаках