что нужно знать для ctf
Как стать специалистом по кибербезопасности, играя в CTF
руководитель направления исследования новых киберугроз BI.Zone
Профессия кибербезопасника — одна из самых высокооплачиваемых в сфере IT. Но, несмотря на большие оклады, таких специалистов не хватает: глобальный дефицит составляет 3 млн, по оценкам Сбербанка.
Высокий спрос предъявляет и высокие требования. Чтобы им соответствовать, нужна не столько хорошая теоретическая подготовка, сколько большой практический опыт.
Хорошая новость в условиях самоизоляции: получить этот опыт можно не выходя из дома. В этом помогает участие в CTF — соревнованиях по кибербезопасности. О том, как все устроено, как подготовиться и где проверить свои силы, рассказывает Никита Вдовушкин, руководитель направления исследования новых киберугроз BI.Zone.
Правила игры
Что такое CTF. В переводе с английского capture the flag означает «захватить флаг». Так и есть, CTF — это соревнования, где команды решают прикладные задачи в области кибербезопасности, чтобы получить флаг — уникальную последовательность символов. Флаг (его отправляют в специальную платформу) подтверждает, что участники действительно взломали систему, нашли уязвимость алгоритма генерации ключа или выполнили какую-либо другую задачу.
Где проходит. CTF-турниры проводят как очно, так и онлайн. Очные встречи длятся не меньше семи часов, а онлайн-соревнования могут идти и сутки напролет — чтобы команды из разных часовых поясов были примерно в равных условиях.
Форматы часто совмещают: отборочные этапы проводят в сети, а в финале участники собираются на одной площадке. Именно так организован, например, американский DEF CON CTF, а в России — CTFZone.
Как соревнуются. CTF бывают двух видов. Первый — jeopardy: участникам предлагают набор задач разной «стоимости», как в телевикторине Jeopardy! на американском ТВ (наш аналог — «Своя игра»). За верное решение начисляют очки: чем сложнее задача, тем она дороже. Участники должны находить и эксплуатировать уязвимости в веб-приложениях и бинарных сервисах, администрировать операционные системы, разбираться в криптографии, программировании и уметь много чего другого.
Второй вид CTF-соревнований — attack/defense. На старте команды получают одинаковое количество очков и выделенный сервер с ресурсами. Задача — взламывать серверы соперников и защищать свои. Чтобы доказать взлом, нужно украсть с чужого сервера флаг — их загружает туда подготовленная организаторами автоматизированная платформа, которая эмулирует поведение обычного пользователя.
Зачем участвуют в CTF
CTF-турниры популярны среди людей самого разного возраста — от старшеклассников и студентов первого курса до состоявшихся профессионалов.
И неудивительно — участие в CTF, кроме удовольствия, дает немало возможностей:
Как подготовиться
На каких площадках себя проверить
CTF-соревнования проходят каждую неделю, а то и чаще. Расписание турниров удобно отслеживать на сайте CTFtime. Здесь же можно зарегистрироваться.
Самое авторитетное соревнование — DEF CON CTF. Первый турнир серии был проведен на хакерской конференции без малого 30 лет назад и дал начало всем CTF. Чтобы попасть на DEF CON, нужно выстоять в жестком онлайн-этапе или выиграть одно из престижных международных соревнований — сейчас в мире 6 таких отборочных турниров.
С 2019-го официальным отборочным турниром DEF CON CTF стал CTFZone, который в этом году прошел в конце апреля онлайн. Среди участников были команды из России, Китая, Италии, США, Польши, Японии. Обладатели первых трех мест получили денежные призы, а победитель, которым стала команда mslc из нашей страны,— еще и место в финале DEF CON CTF.
Еще два крутых российских соревнования — RuCTF и Volga СTF. Они собирают команды со всего мира, но с одним условием: в отборочном турнире могут принять участие все, а в финале — только студенты и вчерашние выпускники.
Как получить максимум
Киберспортивное хобби может стать отличным источником профессионального опыта. Чтобы все удалось, попробуйте следующее:
1. Как следует подготовьтесь к CTF-турниру:
2. Зайдите на сайт CTFtime и выберите выходные, которые вы готовы просидеть за компьютером.
3. После соревнований обязательно посмотрите разборы заданий, которые вы пытались, но не смогли решить.
Как стать настоящим хакером или Capture The Flag
Как правило, этот стиль CTF делится на подкатегории (они различаются в зависимости от того, кто ведет, но есть несколько констант, таких как криптография и анализ пакетов) и каждая подкатегория содержит набор задач, которые пользователь должен решить, чтобы найти флаг. Флаг обычно представляет собой строку текста, которую пользователь вводит в игровое поле, чтобы получить свои очки. Чем больше очков стоит задача, тем труднее ее решить.
7,5 часов, тарелка картошки, 2 ломтика пиццы и две таблетки аспирина, после чего я выключила свой компьютер, получив 3,250 очков и 6-е место. Я решила держаться категории, для которой у меня было достаточно навыков. Я закончила решение всех 7 задач по Network Forensics, 2 из 8 задач, связанных с Host Forensics, и 3 из 6 задач Crypto. Многие из этих задач я решила первой, либо была в первой тройке. Не так плохо для первого CTF.
Это был хороший старт для новичка, он помог мне почувствовать свою принадлежность к сфере. Временами, особенно в технической специальности, легко стать жертвой синдрома самозванца. Этот CTF развеял все сомнения на счет моих навыков. Я знаю, что мне еще многое предстоит узнать, но я также знаю, что не притворяюсь. Также это было хорошей тренировкой для ума и помогло мне расширить мои знания по информационной безопасности. Несмотря на то, что мои фундаментальные знания увеличились незначительно, я все равно многому научилась, решая задачи, о которых не знала раньше или знала, но не знала, как их решить. Чтобы изучить новые технологии, разработчики создают приложения, с этой же целью специалисты по безопасности конкурируют друг с другом и занимаются взломами.
Crypto
Стеганографическая задача
Эта картинка выглядит абсолютно обычной? Но если мы посмотрим на командную строку:
Ничего особенного. давайте попробуем hexdump:
Оно возвращает кучу вывода, который я не буду вставлять сюда, но вот соответствующие биты:
Теперь мы знаем, что флаг находится в текстовом файле и по последней строке мы можем сказать, что в jpg есть скрытый файл.
Если мы попытаемся распаковать его:
Теперь у нас есть подсказка для пароля. Если мы попробуем использовать «wordshavepower» (слова на изображении):
Потрясающе! Давайте посмотрим с чем этот файл:
Cipher Challenge
Другие задачи в этой категории требовали перевода из двоичной системы, Base64, Base32 или Base16 в ascii или дешифрирования файла, зашифрованного с помощью AES.
Host Forensics
Для решения задач, нужно было, чтобы игрок загрузил дамп MS Host и проанализировал его, а затем узнал имя запущенного вредоносного ПО и адрес, и порт C2 (Command & Control).
Я никогда не работала с аварийной дамп, но поиск в Google привел меня к Volatility и командам, которые мне нужно было запускать. (еще я нашла запись с другого CTF с похожим заданием).
Я начала с просмотра сетевых подключений в дампе. Так я знала, что, возможно, смогу определить соединение для ботнета C2.
Я заметила, что серверу был предоставлен странный внешний IP-адрес с несколькими исходящими соединениями. Я отфильтровала этот IP и начала искать подключения к нестандартному порту (в этом случае не к порту 80 или 433, потому что это веб-порты и обычно не используются для управления бот-сетью).
Из этого я поняла, что вредоносное ПО называется jrat.io и что это также флаг. Я начала работать в этой категории чуть позже в тот же день. Хотелось бы, чтобы у меня было больше времени, чтобы попытаться решить другие задачи, потому что я думаю, что смогла бы их решить. Две вышеперечисленные задачи стоили больше всего очков в категории Host Forensics.
Network Forensics
Я покажу сложную задачу. Нам пришлось загрузить файл pcap и единственным словом в его описании было «сломан».
Heartbleed
Глядя на pcap в Wireshark, я знала, что это будет атака с heartbleed из-за запросов и ответов, похожих на сердечный ритм. Я посмотрела, как работает heartbleed, и мне стало понятно, где искать. (Посмотрите графическое объяснение, которое я нашла)
Если вы посмотрите heartbleed вывод и скопируете Payload как текст, то в итоге обнаружите:
Попробуйте
Интересны утилиты командной строки, которые я использовала?
Я выполнила большинство задач на Ubuntu 16.04 Digital Ocean Droplet.
Если вам особенно интересна разработка веб-приложений, то предлагаю попробовать WebGoat. Я использовала его, чтобы продемонстрировать атаки SQL Injection для презентации группе студентов, и его было довольно легко настроить и использовать.
Курс молодого бойца по CTF. Простые задания категории Web. Для самых маленьких
Вы спрашивали как научиться ломать? Мы отвечаем.
Мы уже писали о ресурсах, на которых ты можешь прокачать свои хакерские навыки. А теперь я расскажу тебе о том, как это делать на практике. Начнём с самых простых примеров.
Что важно знать и помнить?
Решение заданий на CTF-соревнованиях — это, по сути, решение некоторой загадки, зачастую не имеющей исключительго тренировочный характер. И даже если ты хорошо справляешься с такими заданиями (может быть даже лучше всех в мире), это не означает, что ты будешь лучше всех ломать реальные системы и находить уязвимости. Не стоит забывать, что все задания на тематических ресурсах и соревнованиях — имеют решение, то есть при их разработке уже продумывалось, что в них есть определённая уязвимость, которую необходимо найти и проэксплуатировать. В реальной жизни это зачастую не так, и это надо знать и помнить. Ресурсы с заданиями и решение задач позволяют «прокачать» свои навыки владения инструментами и не стандартного мышления, что крайне важно при взломе систем и поиске уязвимостей, но зацикливаться на решение «задачек» не нужно. Как говорят йоги — важна только практика.
Тем не менее, в этой статье мы рассмотрим самые простые задачки с известного сайта с различными задачами (CTF и не только) — https://www.root-me.org.
Потренируемся на простейших задачках из категории Web Server.
Пример 1.
Самое первое задание называется HTML. Из названия уже можно понять на что необходимо будет обратить внимание. Ссылка на условие задания: https://www.root-me.org/en/Challenges/Web-Server/HTML
Нажимаем кнопку «Start the challenge» и попадаем на сайт.
Сразу откроем исходный код и смотрим его.
Ничего интересного, но если мы двинем ползунок влево, то увидим следующий закомментированный текст. В нём и будет наш пароль.
Обычно такие задания стоят одними из первых на различных не сложных соревнованиях, и их «стоимость» минимальна. Это задание обращает внимание на то, что иногда в комментариях к коду можно найти что-нибудь интересное, т.к. комментарии оставляют разработчики.
Пример 2.
По названию опять-таки понятно, на что необходимо обратить внимание.
Нажимаем на кнопку «Start the challenge» и попадаем на так называемую «Базовую аутентификацию».
Попробуем ввести одну из самых простых и популярных комбинаций логина и пароля: «admin/admin». И получим сообщение о верном решении задания и о том, что введённый нами пароль «admin» можно использовать в качестве ответа на задание.
Задания такого рода иногда встречаются на CTF-cоревнованиях. Смысл таких заданий заключается в том, чтобы показать, что в форме логина может и не быть уязвимостей, однако администраторы могут использовать слабые или стандартные пароли для входа в систему. Часто во время проведения пентестов происходит брутфорс (полный перебор) паролей по словарю популярных паролей. Однако в CTF’ax брутфорс используется редко, т.к. это не особо интересно и затратно.
Пример 3.
Следующее задание, которые мы решим называется «User-agent». Из его названия опять понятно, на что нужно обратить внимание.
Нажимаем на «Start the challenge» и видим следующее сообщение.
«user-agent» — это одно из полей HTTP-запроса, которое отвечает за описание браузера с которого происходит обращение к ресурсу. Изменим запрос с помощью инструментов разработчика (они открываются в разных браузерах по разному, но обычно достаточно нажать ПКМ на странице и выбрать опцию «Исследовать элемент», после откроется меню и там нужно выбрать категорию «Сеть», если у вас английская версия браузера, то у вас будет «Inspect elements» и «Network» соответственно, после находим запрос, изменяем его и отправляем. Меняем мы только User-Agent)
Смотрим ответ (он будет в самом низу списка запросов)
Данное задание нацелено на основы работы с HTTP-заголовками. Задания такого рода очень часто встречаются на CTF’ах, при этом могут использоваться различные HTTP-заголовки, даже самые редкие, поэтому стоит знать хотя-бы самые базовые.
Пример 4.
Решим задание «Backup file». Из названия видно, что речь пойдёт про бекапы (бекап — резервная копия каких либо данных для экстренных случаев).
Приступаем к заданию и попадаем на форму ввода логина и пароля.
Данное задание по большей части основано на некотором прямом знании, нежели логики и рассуждениям. При создании бекапа часто делается просто копия объекта, однако его наименование нужно немного изменить, для этого могут добавляться различные символы в конец файла (например, чтобы убрать расширение *.php, для того, чтобы файл не исполнялся при обращении к нему).
Можно попробовать скачать файлы, которые потенциально могут быть на сервере. Например, файлы со следующими названиями:
При указании в адресной строке последнего названия (index.php
) произойдёт скачивание файла с исходным кодом.
Открыв данный файл в текстовом редакторе получим исходный код (в том числе и серверную часть) обработчика формы.
И получаем пароль для подтверждения решения данного задания.
Данное задание по большей части зацикливается на некотором прямом знание того, что на серверы могут быть забыты/оставлены бекапы важных файлов.
Пример 5.
Решим ещё одно задание. Название — «HTTP directory indexing». Судя по названию, задание нацелено на индексацию директорий на веб-сервере.
Приступаем к заданию и попадаем на следующее веб-приложение.
Никаких видимых подсказок нет, по этому посмотрим исходный код.
В исходном коде видим, что подключается некоторый файл из локальной папки admin. Так как в названии задание сказано про индексацию, попробуем просто зайти в папку admin.
Отлично, она индексируется (мы видим её содержимое). В данной папке находится файл (который и подключается к предыдущей страничке) и папку. Зайдём в папку и посмотрим её содержимое.
Видим некоторый текстовый файл «admin.txt». Попробуем открыть его.
Это задание акцентирует внимание на таком свойстве, как индексация. Смысл индексации заключается в том, что перед вам предстаёт по сути папка с файлами и другими папками и всё это находится на сервере. Не редкость, когда про индексацию забывают в важных местах веб-приложения, и таким образом любой желающий может получить доступ к конфиденциальным файлам или исходным кодам.
Пример 6.
Решим задание «Command injection».
Из описания и названия берём самое важно и получаем, что речь пойдёт об «внедрении команд», пароль хранится в файле index.php
Заходим на сайт и видим следующую форму.
В описании задания было сказано, что это сервис, предназначенный для пинга. Предположим, что пинг реализуется с помощью системной функции и фильтрация вводимых данных — отсутствует. Данная уязвимость относится к классу RCE, описание уязвимости уже было на канале и пример был практически такой-же. Вот ссылки на описание RCE:
Подаём на вход следующую строку «; cat index.php», суть которой заключается в том, что мы закрываем команду ping и добавляем ещё одну команду, которая прочитает файл index.php и отобразит его.
После выполнения будет отображено 2 формы ввода — это нормально, так как мы прочитали файл и отобразили его, а он содержит не только php-код но и html-код, который повторно отображается. Нам нужно открыть исходный код.
Видим серверную часть кода, в которой и расположен наш флаг/пароль для решения задания.
Пример 7.
Решим задание «PHP filters».
По заданию нам надо получить пароль администратора, обратим внимание на название задания, а также на прикреплённые источники.
Много ссылок на LFI.
Заходим на само задание и видим две ссылки.
Прейдём на login и обратим внимание на строку запроса.
Внимание сразу привлекает параметр «inc» который принимает в качестве значения название скрипта. Похоже на LFI. Только есть проблема, судя по всему данный файл «выполняется», то есть содержащийся в нём php-код выполняется на сервере при загрузке данного файла, то есть по сути файл подгружен, но полный его исходный код не увидеть.
Для решения этой проблемы можно закодировать вывод этого файла в base64 для этого и используются php-фильтры.
Мы получаем большой вывод base64, декодируем его.
Декодируем полученный base64 и получаем ответ.
Задание решено. Оно оказалось не сложным и довольно хорошо демонстрирует базовую концепцию уязвимости LFI с использованием php-фильтров.
Пример 8.
Решим задание «HTTP verb tampering».
Итак по заданию не особо понятно, что надо сделать, но если перейти по ссылке и начать решение, то станет ясно, что нужно обойти базовую аутентификацию.
Попробуем реализовать данную атаку с помощью Burp Suite.
Требует авторизироваться. Меняет тип запроса на PUT.
Получаем ответ. Задание решено.
Пример 9.
Решим задание «HTTP — Open redirect».
Судя по описанию, нам необходимо совершить переход на другой домен, кроме предложенных.
Зайдём на сайт с заданием.
При нажатии на одну из ссылок получаем такой запрос.
Видим, что в параметре url передаётся адрес, по которому будет осуществлён переход. А в параметре h передаётся какой-то хеш, по формату похожий на md5. Правда, не ясно от чего он, поэтому попробуем найти его в базе.
Получается, что это хеш от адреса.
Поменяем адрес на другой и запишем хеш от него в запрос.
Получаем флаг. Задание решено.
Пример 10.
Решим задание HTTP/POST.
Судя по всему речь пойдёт об HTTP-методе POST. Нам надо найти путь получения топовых очков (судя по всему максимальных).
Перейдём по ссылке для начала решения задания.
Видим некоторую игру. В которой мы можем нажимать на кнопку и получать случайный результат. Необходимо, чтобы случайный результат был равен максимальному — 999999.
В задании указывалось что-то про методы, подключим Burp Suite и посмотрим какие запросы идут на сервер.
При нажатии на кнопку отправляется следующий запрос.
Видим, что число в параметре score отображается после запроса на странице и получается, что мы можем его контролировать. Давайте заменим его на максимальное + 1.
Всё верно, мы победили в игру и получили флаг. Задание решено.
Данное задание демонстрирует основы отправки изменяющих запросов на сервер и показывает, что вы можете изменять отправляемые значения в надежде на изменение результата ответа от сервера.
Пример 11.
Решим задание — «Improper redirect»
Задание связано с редиректом, нужно получить доступ к index.
Попробуем перейти по ссылке.
При любом обращении к index.php попадаем на login.php?redirect
Попробуем обратится к index.php и перехватим запрос с помощью Burp Suite и отправим запрос в Repeater.
Теперь просто отправим данный запрос и если будет происходит редирект мы увидим это и пока не нажмём на кнопку принятия он не произойдёт.
Отлично, мы получили флаг и указание на данную проблему безопасности (CWE-698) и небольшое описание в чём заключается её смысл.
Вот такое простое задание, демонстрирующее возможные проблемы при плохой реализации редиректа.
Пример 12.
Зайдём на сайт и увидим, следующее.
Как можно заметить, это действительно похоже на фото-галерею, но это не самое интересное. Мы видим вкладку «upload» в небольшом меню. Давайте попробуем перейти в неё и загрузить какой нибудь файл.
Итак, мы видим, что можно загружать свои фотографии, однако они должны быть строго определённого формата.
Попробуем один из самых простых способов обхода данного фильтра, а именно «файл с двойным расширением».
Создадим такой файл.
Всё дело в том, что при загрузке файл будет распознавать по последнему расширению (то есть как изображение), а при обращении к файлу, сервер попытается изначально открыть его по первому найденному расширению (если это не запрещено в настройках сервера), то есть по расширению «.php».
После отправки этого запроса, получаем результат загрузки файла.
Файл успешно загружен, его тип определился как изображение, а также нам показали путь по которому файл сохранён. Попробуем перейти по нему.
Отлично, мы можем выполнять код на сервере. Теперь просто прочитаем необходимый файл.
И получаем наш пароль. Проверим его.
Пример 13.
Задание снова по загрузке шелла. На этот раз речь (судя по названию) нужно обойти MIME type.
Перейдём на сайт и посмотрим, что нам предлагают.
Есть опция загрузки. Посмотрим как она выглядит.
Не отличается от прошлого задания. Попробуем загрузить шелл, используемый в прошлом решении.
Загрузка прошла, однако немного неясно, где был сохранён файл. Поищем его.
Если обновить страницу загрузки, то можно увидеть ссылку на загруженный ранее файл. Попробуем обратиться к нему.
Запрос выглядит так (поле Content-Type изменяется в процессе запроса с помощь перехвата его в Burp’e).
Файл загружен. Отлично, проверим его.
Всё верно, код отрабатывает. Сделаем «ls», чтобы показать, что сейчас загружено 2 файла и просто прочитаем флаг.
Пароль получен. Задание решено.
Пример 14.
Исходя из описания и названия задания речь пойдёт про куки и скорее всего про их подмену. Перейдём по ссылке (кнопка Start the challenge) и посмотрим, что нам предлагают.
Какая-то форма сохранения email’ов и просмотр сохранённых почт. Попробуем нажать на просмотр почт.
Видим, что нам выдало сообщение о том, что мы не администратор, а также установился некоторый параметр «c» со значением «visiteur». Попробуем поменять его на admin.
Теперь видим, что проблема состоит в куки. Посмотрим на запросы к серверу с помощью Burp Suite.
Видим, что на сервер передаётся некоторая куки переменная ch7 со значением «visiteur», попробуем подменить её на admin.
И получим верный пароль. Ниже представлен запрос в Repeater’e.
Вот такой простой пример подмены куки для получения доступа к другому аккаунта. Данная уязвимость имеет место быть в достаточно плохих веб-проектах, где разработчики совсем не заботяться о безопасности и разграничении доступа у пользователей.
На канале вы можете найти ещё множество подобных постов не только для веб-приложений, но и для бинарных приложений.
Ты спрашивал — мы рассказываем. Это самые простые задачки. Более сложные — впереди.
Админ сайта. Публикует интересные статьи с других ресурсов, либо их переводы. Если есть настроение, бывает, что пишет и что-то своё.