Совсем скоро пройдет IT’s Tinkoff CTF для ИТ-специалистов. У нас уже готов сайт, где вы можете узнать подробности и зарегистрироваться, но это еще не все. Для тех, кто пока не знаком с таким форматом соревнований, мы подготовили эту статью. В ней мы расскажем, что такое CTF, и разберем тестовое задание. Если вы любите интересные задачи, приглашаем под кат.
Что такое CTF
Традиционный СTF, Capture The Flag, — это соревнование по спортивному хакингу. Но мы сделали соревнование для тех, кто не специализируется на информационной безопасности. Поэтому ждем разработчиков, SRE- и QA-инженеров, аналитиков и других ИТ-специалистов.
На CTF командам нужно решать задания на разные темы. Они рассчитаны на мидл- и сеньор-специалистов. Решив задание, команда получает флаг — секретную строчку вида its{17s_71nKoFF_c7F}. За каждый флаг начисляются очки. Побеждает команда, которая набрала максимум очков.
Вас ждут задания:
— на безопасность веб-приложений;
— безопасность инфраструктуры;
— безопасность мобильных приложений;
— криптографию;
— общехакерскую находчивость.
В IT’s Tinkoff CTF есть две лиги: Лига новичков и Лига опытных. Если вы не до конца уверены в своих силах, советуем начать с Лиги новичков.
Для тех, кто еще не играл в CTF, мы сделали разбор демозадания. Это поможет понять механику.
Спасаем пользователя, который поверил документалке о плоской земле
Представьте, что к вам подбегает испуганный мужчина со смартфоном и просит помочь: «Я написал тред в одной соцсети, и он завирусился. Вот наутро перечитал, чуть не сгорел со стыда и все удалил. Но тред сохранился архивом на одном сайте. Можем его как-нибудь удалить? Его же потом могут найти и прочитать мои дети». В адресной строке виднеется: https://its-cringe-archive-997wqau.spbctf.ru/archive/dmzvwk9d75. Итак, наша задача — удалить архив с сайта.
Если перейти на главную страницу https://its-cringe-archive-997wqau.spbctf.ru/, нас встретит интерфейс сервиса для архивирования веб-страниц. Разберемся, как он работает и получится ли у нас помочь впечатлительному пользователю.
Инструментарий Burp Suite. Proxy. Исследовать веб-сервисы на безопасность удобно в Burp Suite — это комбайн инструментов для работы с вебом на уровне протокола HTTP, по которому браузер связывается с сервером.
Он позволяет:
заглянуть в сырые данные, которые передаются веб-серверу и обратно;
менять эти данные руками, чтобы посмотреть, как приложение справится с чем-то неожиданным;
автоматизировать запросы на сервер.
Нам хватит бесплатной версии Burp Suite Community Edition. Если у вас есть под рукой Kali Linux — дистрибутив для пентестеров, — комьюнити-редакция Burp в нем ставится прямо из репозиториев и, скорее всего, у вас уже есть.
В Burp Suite легко запутаться. Для начала нам понадобится всего пара вкладок.
Начнем с того, чтобы сразу ходить на тестируемый сайт только через встроенный браузер Burp. Так он сможет записывать все наши действия на сайте, и это нам здорово поможет в пентесте веб-приложения. Вкладка Proxy → Open browser.
Встроенный браузер — это обычная версия Chromium, которая настроена пропускать весь трафик через Burp. Например, сходим на Хабр и посмотрим на вкладку HTTP history.
Все запросы, которые отправил браузер при открытии страницы, видны нам целиком — и сырой HTTP-запрос со всеми полями и заголовками, и сырой ответ от веб-сервера.
Осматриваемся. Site map. Для начала зайдем в каждый закоулок веб-сайта, чтобы понять, что вообще на нем можно делать.
Заархивировав страничку, тут удаляем ее. Наша цель — протыкать все кнопочки в веб-приложении и провзаимодействовать с сайтом всеми возможными способами.
Burp тем временем записывает все запросы, которые при наших действиях отправляются на сервер. Мы можем полистать их на той же вкладке Proxy → HTTP history, но есть и более удобное представление, чтобы охватить всю картину целиком.
Посмотрим на вкладку Target → Site map.
Здесь Burp собрал все адреса, по которым обращался браузер, в удобную древовидную структуру — как будто это не отдельные запросы и API-эндпоинты, а структура папок на диске. На одном экране мы видим все устройство веб-приложения под капотом и можем смотреть детали конкретных запросов. Например, мы видим, как ручка /api/last_archives
отдала браузеру JSON с ненавистной ссылкой.
Пробуем ломать. Repeater. В сайтмапе можно заметить, что нам в том числе доступен эндпоинт /api/delete_archive
. Мы дернули его, когда удаляли только что собственноручно заархивированную страничку. Он принимает ID архива, и мы знаем ID архива ссылки с кринж-постом (dmzvwk9d75).
У чужой заархивированной странички нам, естественно, не покажут кнопку «Удалить», но давайте перехитрим веб-приложение и отправим запрос на удаление вручную.
Везде, где в Burp виден HTTP-запрос, его из меню по правой кнопке можно отправить в Repeater — инструмент для ручного редактирования и отправки запросов.
В репитере мы можем менять запрос, как нам захочется, и тут же послать его на сервер и увидеть ответ. В пылу ручного тестирования вместо кликов по оранжевой кнопке Send экономит время сочетание «Ctrl + пробел».
Увы, сервер распознал подмену. Вместо ответа 302 Found
, который мы получали, удаляя собственный архив, на попытку удалить чужой нам прилетело 500 Internal Server Error
, и архив остался лежать на сервере. Получается, здесь приложение проверяет переданный ID.
Теперь давайте обратим внимание еще на одну API-ручку — /api/user
, которая используется при заглядывании в свой профиль на сайте.
Во-первых, она принимает от клиента какой-то ID, у нас 12. Во-вторых, кроме тех данных, которые мы видим на странице, сервер возвращает в ответе еще и пароль, точнее, его хеш. Судя по 32 hex-символам, это должен быть алгоритм MD5.
И действительно, находится много результатов, что это MD5-хеш от пароля 12345678, с которым мы и регистрировались. Похоже, мы нашли первую уязвимость в приложении! Ее можно отнести к Information Disclosure — сервер присылает браузеру больше информации, чем нужно для отображения, в том числе хеш от нашего пароля.
Теперь вспомним про параметр к этому запросу, который у нас был равен 12. Посмотрим, что будет, если отправить другое число.
Ого! Мы поменяли номер пользователя, и сервер выдал нам чужие данные: чужой e-mail, имя и хеш пароля. Мы нашли уязвимость Insecure direct object reference, IDOR: сервер не проверяет, имеем ли мы право запрашивать данные пользователя № 11, и легко отдает их.
Просто пользуясь сайтом в браузере, мы бы не наткнулись на эту ошибку: при просмотре профиля запрос всегда отправляется с нашим собственным ID. Но стоило нам начать посылать запросы вручную и посмотреть, как веб-сервер будет реагировать на неожиданные данные, выяснилось, что в этом месте разработчик забыл проверить, чей профиль мы запрашиваем.
Кстати, если бы у нас получилось удалить кринж-пост, подставив его ID, это тоже была бы уязвимость вида IDOR. Однако в той API-ручке разработчик это учел и добавил проверку.
Перебираем пользователей. Intruder. Мы всего лишь 12-й пользователь, и, в принципе, нам не составило бы труда вручную поподставлять предыдущие числа в параметр ID и позапрашивать данные других учеток. Но давайте попросим это сделать сам Burp.
Так же как любой запрос можно отправить в Repeater, по правой кнопке всегда доступен пункт Send to Intruder — инструмент автоматизации, который отправляет много запросов. Таких, какие нам нужны.
На вкладке Positions мы настраиваем место, где будут меняться данные от запроса к запросу. Таких мест в тексте запроса можно настроить несколько, каждое обрамляется §параграфами§.
Нам же сейчас нужно изменять только ID. Нажмем Clear §, чтобы сбросить все автоматически проставленные места, если они были. Выделим наш номер 11 в запросе и нажмем Add §. Номер обрамится в параграфы, что будет означать, что меняться будет именно он.
Теперь на вкладке Payloads настраиваем, что на это место будет подставляться. Burp Suite умеет брать значения из разных мест (Payload type), но нам пригодится самый простой тип — Numbers. Например, переберем ID от 1 до 100. From: 1, To: 100, Step: 1.
Все настройки готовы, можно начинать — Start attack.
Открывается список, который Burp заполняет ответами на автоматически сгенерированные HTTP-запросы. Мы можем отсортировать результаты по длине ответа или просто пролистать их подряд — и пользователь № 5 окажется искомым cringe_catcher, который заархивировал злополучную ссылку.
Сервер отдал нам его почту cringe_catcher@gmail.com и хеш от пароля: 64d1d1b4028f97e9d5648532ec21ffad
.
Теперь от того, чтобы зайти под этим пользователем и удалить наконец архивный пост, нас отделяет только незнание его пароля. Мы знаем хеш, но для входа нужно ввести пароль, который ему соответствует.
Взламываем MD5-хеш. К сожалению, этот хеш не гуглится — похоже, он от пароля посложнее, чем 12345678. Придется взламывать хеш самим.
Хеш можно взломать только перебором: пробовать хешировать много разных паролей, пока не угадаем. Хороший инструмент для быстрого перебора разных хешей — hashcat. Воспользуемся им.
Чтобы перебирать немного умнее, мы проведем атаку по словарю с правилами. Возьмем очень популярный словарь паролей rockyou.txt, в котором 14 млн частых паролей из утечки 2009 года, и применим к нему набор правил dive.rule, который идет в комплекте с Хешкатом. Каждое правило будет применяться к каждому паролю из rockyou, немного его мутируя. Так мы сможем быстро попробовать не только пароли, которые уже кто-то использовал в той утечке, но и их адекватные вариации.
Запускаем: hashcat 64d1d1b4028f97e9d5648532ec21ffad rockyou.txt -r rules\dive.rule -O.
Буквально за секунду hashcat наткнулся на пароль, который соответствует хешу, — kucing33. Кстати, его действительно не было в самом словаре, правила помогли.
Также попробовать найти хеш можно на разных сайтах, которые составляют базы соответствия хешей с паролями. Их можно нагуглить, например, по md5 lookup online
.
Один из таких с первой страницы выдачи Google действительно знает наш хеш.
Также полезен платный сервис cmd5.org, в котором удобно проверять, реалистично ли вообще взломать определенный хеш. Если сервис сразу предлагает купить у него результат, значит, пароль не чересчур сложный и можно попробовать подбирать самому или поискать на сайтах.
Достигаем цели. Итак, собираем воедино. Мы нашли две уязвимости, благодаря которым сервер подсказал нам почту cringe_catcher@gmail.com и хеш пользователя, а также успешно смогли найти пароль, соответствующий этому хешу: kucing33.
Заходим на сайт, зная данные для входа.
Мы внутри, и у нас права пользователя cringe_catcher!
Осталось нажать пару кнопок, чтобы удалить кринжовую страничку и получить в благодарность флаг.
Что еще важно знать про IT’s Tinkoff CTF
Если задание показалось любопытным и вы хотите участвовать в соревновании, поделимся подробностями.
Насколько сложными будут задания? Как мы уже сказали, на соревновании будут две лиги: Лига новичков и Лига опытных. Для каждой из них 30 заданий разных уровней сложности — от простых до сложных. Тем, кто пока не играл в CTF, советуем регистрироваться в Лиге новичков. Если задания покажутся слишком простыми, вы сможете перейти в Лигу опытных, но вернуться обратно будет уже нельзя.
Кто может участвовать? Команды из 1—3 человек. Если пока не знаете, с кем играть, можете поискать сокомандников [в нашем чате.]
Какие призы получат команды? В Лиге новичков и Лиге опытных будет по три призовых места. Победителям подарим денежные призы.
Лига новичков:
1-е место: 180 000 ₽ на команду.
2-е место: 150 000 ₽ на команду.
3-е место: 120 000 ₽ на команду.
Лига опытных:
1-е место: 360 000 ₽ на команду.
2-е место: 240 000 ₽ на команду.
3-е место: 180 000 ₽ на команду.
Можно ли участвовать офлайн? Да, мы организовали офлайн-площадки в следующих городах:
— Воронеже;
— Екатеринбурге;
— Ижевске;
— Иннополисе;
— Минске;
— Нижнем Новгороде;
— Новосибирске;
— Омске;
— Рязани;
— Самаре;
— Санкт-Петербурге;
— Саратове;
— Сочи;
— Челябинске.
На площадках вас будет ждать общение с другими экспертами, настолки, квиз и даже турники, на которых можно будет размяться в перерывах между заданиями. Укажите свой город при регистрации, и мы пришлем приглашение.
На этом все. Регистрируйтесь, соревнуйтесь и побеждайте! Желаем удачи.