CTF Дорога в космос! Первый опыт в CTF соревнованиях

road CTF.jpg

Введение
Любое испытание, которое проходит человек, обычно сопровождается паникой и адреналином в крови. И этого нельзя избежать. Если спортсмены соревнуются в физической силе, то специалистам по ИБ приходится задействовать большую часть мозга. Испытания в стиле "захват флага" хорошо тренируют знания по разным аспектам. Начиная от обычной стенографии и
заканчивая реверсом PE-файлов. Сегодня же речь пойдет о первом опыте в таких соревнованиях.


План статьи
Худший план - это его отсутствие! Поэтому в этой статье я планирую рассказать тебе о том, что из себя представляет CTF-соревнование. Разберем как оно проходит, что нужно знать, а главное - как подготовиться к такому мероприятию. Если ты читал новостную ленту, то вероятнее всего слышал, что для такого события нужна команда. В связи с этим, я постараюсь рассказать тебе, как все правильно организовать.

Предыстория
Началось все еще в середине октября, когда в моем городе устраивали CTF мероприятия между учебными заведениями. Тогда мне, как новичку в этом деле, выпал шанс проявить себя в боевых условиях. Я это видел как очередное испытания и повод улучшить свои знания. Единственное, что мешало мне до этого посещать такие мероприятия - это команда. Ее просто не было. В этот раз все было иначе, и под моим крылом оказались 3 человека, а я стал капитаном судна с новичками. До подготовки оставалось еще много времени и можно было не спешить с обучением команды. За несколько дней до начала соревнований нам объявили, что большинство участников, в том числе и мы, были исключены из списка под предлогом "угрозы срыва соревнований". Проще говоря это был быстрый способ избавиться от конкурентов. Но после нам объявили о внутренних CTF-соревнованиях, цель которых - установить сотрудничество с учебным заведением из другого города. Тогда и началась паника: до дедлайна оставалось несколько дней, а моя команда почти не готова к этому.

С этого момента и начинается веселье. На соревновании было 4 команды в одной аудитории и 2 руководителя, которые направляли нас в решении некоторых таск, за что им огромное спасибо. Если ты представлял себе большой зал и огромную сцену по центру, то спешу тебя разочаровать. В реальности это просто комната достаточных размеров в которой расположено несколько столов, стульев и розеток для зарядки. Но чтобы это все организовать потребовалось огромное количество усилий и лишних бумажек.

После того, как был дан сигнал начался мозговой штурм у каждой команды. Первые минуты в твоей крови бурлит адреналин, а мозг не понимает за что взяться, ведь таск огромное множество. Также тебя может охватить волнение, ведь некоторые команды спустя 5 минут вбивали флаги и получали баллы. Но через какое-то время приходит осознание и ты начинаешь двигаться.

Первые шаги
Вспоминается одна из великих цитат: "Умный учится на своих ошибках, мудрый учится на чужих, а дурак не учится никогда". Поэтому, чтобы не допускать своих ошибок будем становиться мудрецами и учиться на чужих. Первым делом ты должен понимать, что это командная игра и все зависит не только от тебя. Тем более если ты лидер, твоя главная цель сделать команду сильнее. Распределяй роли между участниками на основе их сильных сторон. Никогда не пытайся решить все в одного. Это одно из главных правил такого соревнования.

Также твоим из главных врагов в таком деле становиться страх и паника. Чтобы этого избежать помни свои сильные стороны. Если ты хорошо знаешь реверс хватай таски такого типа и решай. Здесь важна не скорость, а внимательность и точность. Сами таски имели уровень легкий-средний. Никакого хардкора и сложных решений. Само соревнование называется . На сайте ты можешь увидеть все таски и попробовать решить их на своем ПК.

Охота на флаг
Начну я с самой простой задачи, она называется space kitty. Чтобы ее решить тебе потребуется программа Audacity и любой удобный HEX редактор. Для начала прочтем описания и посмотрим, куда следует копать.

"Милота этого земного зверька бывает обманчива. Внутри он хочет погрызть твои провода...расцарапать стены...двери... Хорошо, что у нас на нексусе нету таких чудовищ!"

Выделяем главные слова внутри и понимаем, что нужно искать флаг в глубине файла. Самый простой и очевидный способ сокрытия данных в картинке это вшить в нее архив. Отталкиваясь от этого пробуем открыть файл при помощи WinRAR. Отлично, у нас получилось. Внутри нас ждет еще один архив и аудиофайл. С форматом MP3 легко справиться. Открываем Audacity и включаем спектрограмму. Видим текст, но к сожалению это не флаг. Для чего же он нужен? Здесь уже поможет еще один архив, который лежал рядом с файлом. При попытки его открыть выйдет ошибка. Чтобы это исправить открываем в HEX редакторе все это дело и видим некорректную сигнатуру. Вместо известного Rar в начале файла написано Cat. Исправляем это и открываем все по новой. Все прошло успешно и перед тобой должен появиться txt файл с паролем. Вот здесь и нужно применить тот текст из аудиофайла. После этой процедуры ты увидишь заветную цель. Таска решена и в казну команды поступает 300 поинтов.

Еще одна из самых забавных таск по моему мнению имела название Never gonna give you up. Сразу в голову всплывает та самая песня и это не совпадения, потому что именно с ней было все связанно. А ее описание звучит следующим образом.

"Мы получили странное послание с "Планеты троллей". После его просмотра аналитики сходили с ума и начинали смеяться без умолку. У нас больше не осталось трудоспособных сотрудников, поэтому передаём данное сообщение под вашу юрисдикция Капитан Name. Надеемся, что под вашим командыванием получится расшифровать послание."

Суть заключается в том, что перед нами есть файл с текстом. Кто-то решил очень древним способом передать информацию с использованием Азбуки Морзе. Декодируем все это дело . Получаем еще одну путаницу, но уже с использованием шестнадцатеричной системы счисления. Перемещаемся и вставляем наши данные. Опять непонятный текст! К счастью для нас это не проблема, так как это всеми любимая кодировка base64. Для этого воспользуемся любимым гуглом и расшифруем все это дело в . Получается непонятная ситуация и ссылка на ютуб. Переходим по ней и видим любимый клип. Пересмотрев его моя команда нашла кадр с флагом. Сейчас его там возможно нет так как на соревнованиях у нас возникали трудности с этим. Но сама задумка очень необычная и интересная. Получаем плюс 100 ̶s̶o̶c̶i̶a̶l̶ points.

Перейдем к более сложной части, а именно Web. Здесь нам удалось решить ровно половину, но получилось все достаточно интересно. Первая задача называется CosmoGame и исходя из названия ты уже понимаешь, что это такое. Но я все равно оставлю описание, чтобы было понятнее.

"У нас ежедневно происходит заруба в космоигру. Недавно наш капитан дошёл до тысячного уровня! Нас всех не успокаивают легенды, говорят, что при достижении миллионого уровня, открывается скрытое послание...."

Сразу стало ясно где надо искать. В самой игре имеется три JavaScript кода. Разберемся в их работе. Листая весь код ты должен наткнуться на условный цикл в файле script.js. Выглядит он примерно следующим образом:

JavaScript:
function levelUp(done) {
  count++;
  if (count > 200) {
    level++;

    if (level >= 1000000) {
        alert('ZmFyYXdheXt5MHVfaDRjS2VkXzRuX2F3M3MwTWVfR2FNMyF9');
    }
    clearShips();
    count = 0;
    done();
  }

Отлично, теперь мы знаем, что будет если достичь крайне высокого уровня. Берем эту информацию и переходим в наш любимый base64 decoder. Вставляем данные и на выходе получаем флаг. Таска решена! А цена за нее всего лишь 100 поинтов, что очевидно.

Ну а вторая и не менее интересная задача связана с окном входа. Звучит она как Access Control System. Мне почему то первым делом пришла в голову идея перебрать пароль и войти в учетку. К сожалению метод грубой силы никак не поможет нашему решению. Поэтому давай лучше прочитаем описание.

"Знаете, у нас на борту есть сервис единой аутентификации для последующей авторизации во всех сервисах, предоставляемых системой. И у меня там самый брутальный логин: kingofspace Хотите посмотреть? Да пожалуйста, у Вас всё равно нет доступа, ха!"

Звучит как вызов. Но кроме логина у нас ничего нету. Сразу скажу, что пытаться на его основе найти пароль не выйдет. Здесь придется работать с любимым JS. Первым делом открываем исходный код страницы и ищем импорт скриптов. Нашел? Пролистай в самый низ, там лежит подарок. Распакуй его в новой вкладке и посмотри, что делает код. Наведем прицел на такую функцию:

JavaScript:
fetch("api/check/" + username)
    .then((response) => {
      return response.json();
    })
    .then((data) => {
      let pass = data['password'];

Скажи, что ты видишь? Правильно, наводку на решение. Чтобы получит пароль мы должны подставить в конец ссылку такую часть api/check/никнейм_из_описания. Перейдем по ней и получим пароль. Теперь логинемся в системе и на выходе нас ждет заветный флаг. Задача не из самых простых, поэтому мы за нее получили 200 поинтов.

В части реверса все было относительно непросто. Одна из самых элементарных задач такого типа носит название Graphic password, что в переводе означает графический пароль. Решается она в два действия, но я не стану спойлерить тебе все сразу. Для начала прочти описания.

"У нас есть приложение, там очень интересный контроль доступа, по нему осуществляется доступ в личные каюты членов экипажа. Но выглядит космически не надёжно, проверишь?"

При открытии нас просят ввести пароль используя чекбоксы. Не самый подходящий вариант для ввода таких параметров. Автор таски сразу говорит, что пытаться что-то вводить в программе крайне бессмысленно. Поэтому пробуем разреверсить все это дело. Первым делом посмотрим из чего состоит файл. DiE яро заявляет о том, что у этой программы фундамент состоит из NET библиотеки. Оно и к лучшему, ведь нам не придется работать с ассемблером. Пробуем закинуть PE-файл в dnSpy. К счастью он с легкостью разбирает программу на части и в результате перед нами есть полный исходный код. Чтобы найти флаг тебе нужно найти ветку Form1. Здесь есть все, что тебе нужно. Но если у тебя времени вагон, можешь ввести правильный пароль в приложение и получить ответ. В любом случаи таска решена и 200 поинтов у нас в кармане.

Одна из самых странных задач на соревновании была связана со слиянием кодировки и шифра. Называется такая таска Ceaser64. Представляет она из себя обычный, зашифрованный текст. Что может быть проще? Но не все так просто. Прочтем описание к нашей таске.

"Когда-то, космический грузовик приволок нам 64 порции цезаря! Вот было объеденье, в конце осталось ровно ничего!"

На самом деле чтобы это все решить нам потребовалось всего три ссылки. Одна из них ввела на википедию с шифром Цезаря. Вся проблема была в сдвиге. Никто не знал его, поэтому это вызвало некоторые трудности. Из сайтов было сказано, что стандартный сдвиг в Цезаре является 13. Берем эту информацию и настраиваем все . После получаем наш любимый base64. Как его декодировать ты знаешь. В результате ты получаешь флаг и сверху 100 поинтов.

Что не удалось решить
Здесь всего я оставил всего лишь одну таску, которую мне не удалось решить из-за времени. Всего было дано 7 часов и все решенные таски (кроме osint) я расписал выше. Таска из разряда реверса и называется она Key checker. Одна из главных проблем состоит в условии. Но перед этим давай прочтем описание.

"Это снова Джон. Похоже ты наша последняя надежда. Нам наконец-то нам прислали нормальное оборудование! Но на КПК просит ввести лицензионный ключ, мы обыскали все косморобки и ничего не нашли. Боже я в жизни не читал столько инструкций, поможешь?"

Давай попробуем разреверсить файл через dnSpy. Закидываем его туда и смотрим, что у нас есть. По новой ищем ветку Activation. Здесь создается массив с данными и есть условие. В котором мне так и не удалось разобраться. Связано оно с XOR (исключающее или). Искать следует в этой части кода:

C#:
if (bytes.Length == 33)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    if (((int)array[i] ^ num2) != ((int)bytes[i] ^ num ^ num2))
                    {
                        text = "Ключ неверный!";
                        this.label2.ForeColor = Color.Red;
                        break;
                    }
                }
            }
            else
            {
                text = "Длина ключа 33 символа!";
                this.label2.ForeColor = Color.Red;
            }

Если разобраться в условии можно легко создать ключ. На его основе ты получишь ответ и сможешь решить таску. Также стоит обратить внимание на то, что в коде присутствует функция генерации рандомного числа от нуля до 255. Это говорит о том, что просто подобрать ключ не получиться и придется разбираться в его правильной генерации.

Подводим итоги
Итак, давай кратко разберем итоги нашей статьи. Стоит вернуться к началу и понять основную цель. А именно - правильное решение и подготовка CTF. Чтобы решать такие таски, помимо команды потребуются знания. Я разобрал лишь небольшую часть таск легкого уровня. Также рассказал о первых ощущениях от таких соревнований и своих ошибках, на основе которых ты сможешь учиться. Все таски находятся в открытом доступе и их можно решать на своем устройстве. Скажу, что даже с нулевым опытом моя команда заняла почетное 4-е место в этом соревновании. До тройки лидеров нас отделяли всего лишь 200 поинтов.
 
Последнее редактирование модератором:

nsk

One Level
17.04.2022
5
4
BIT
168
Спасибо. Интересная тема. Хотел посмотреть таски, не получилось. Команду создать уже нельзя.
 
Последнее редактирование:
  • Нравится
Реакции: INPC

Mark Klintov

Grey Team
23.07.2022
151
297
BIT
22
Спасибо. Интересная тема. Хотел посмотреть таски, не получилось. Команду создать уже нельзя.
Вот здесь хранятся все таски, флаг ты увидишь сразу как только решишь. В некоторых задачах это целое слово или выражение
 
  • Нравится
Реакции: INPC и nsk

nsk

One Level
17.04.2022
5
4
BIT
168
Вот здесь хранятся все таски, флаг ты увидишь сразу как только решишь. В некоторых задачах это целое слово или выражение
Спасибо!

Упс! Мы столкнулись с некоторыми проблемами.​

У вас нет разрешения на просмотр этой страницы или выполнение этого действия.
 

Mark Klintov

Grey Team
23.07.2022
151
297
BIT
22
Спасибо!

Упс! Мы столкнулись с некоторыми проблемами.​

У вас нет разрешения на просмотр этой страницы или выполнение этого действия.
Надо подождать одобрения модератора, как только оно будет получено файл откроется для просмотра
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!