ppc ctf что такое
Битвы хакеров: разбор заданий PHDays CTF и CTF Quals
Positive Hack Days CTF — международные соревнования по защите информации, которые проводятся по игровому принципу Capture the Flag. Несколько команд в течение заранее отведенного времени защищают свои сети и атакуют чужие. Основная задача участников — выявлять уязвимости в системах противников и получать доступ к секретной информации (флагам), при этом обнаруживая и устраняя подобные уязвимости в своей системе.
В сегодняшнем топике мы представим разбор некоторых интересных заданий, с которыми сталкивались участники прошедших соревнований.
История и география
В этом году PHDays CTF состоится уже в четвертый раз. Впервые соревнования прошли во время форума Positive Hack Days в 2011 году, тогда победителями стали участники американской команды PPP, в следующем году победила российская команда Leet More, а на PHDays III чемпионами стали Eindbazen из Голландии. Каждый год в PHDays CTF принимают участие команды со всего мира — от США до Японии.
Для участия в отборочных соревнованиях в этом году зарегистрировалось больше 600 команд.
Задания и атмосфера
По сложившейся традиции игровые задания и инфраструктура подготавливаются в соответствии с легендой соревнований — специальной сюжетной линией, которая превращает простой набор задач PHDays CTF в увлекательное состязание, у которого есть цель. Например, в прошлом году участники спасали от гибели вымышленный мир D’Errorim. Предстоящие соревнования продолжат этот сюжет.
Задания соревнований, как правило, основаны на реальных прототипах: уязвимости, заложенные в задания и сервисы CTF, можно встретить в различных системах в реальной жизни. Соревнования PHDays CTF интересны и оригинальными игровыми механиками, которые делают возможной реализацию разных и непохожих друг на друга стратегий ведения игры (подробнее на сайте PHDays).
Обычно организаторы готовят для команд необычные задания, напрямую не связанные со взломом. Например, во время PHDays 2012 дополнительные очки можно было заработать обнаружив бонусные флаги в специальном контейнере с мусором, а во время PHDays III команды должны были быстрее всех преодолеть «хакерский лабиринт» — полосу препятствий с лазерным полем, датчиками слежения, секретными дверьми, комнатой с жучками и другими интересными испытаниями.
Но основные баллы, конечно, зарабатываются исключительно в ходе решения разнообразных задач по информационной безопасности. Давайте разберем некоторые из них.
Разбор
Квалификационный этап соревнования (PHDays CTF Quals) относится к типу task-based CTF, то есть команды должны решать задания и получать за них очки. Задания могут относиться к одной из следующих категорий:
Неочевидные задания
Участникам PHDays IV CTF Quals в рамках одного из заданий нужно было расшифровать сообщение, скрытое в mp3-файле.
Как правило, если в условии задачи упоминается извлечение скрытого в некотором контейнере сообщения, используется одно из готовых решений из области стеганографии. При этом для отыскания ответа обычно нужно подобрать программу для дешифровки и запустить ее с правильными ключами. То есть «ключ к успеху» при решении конкретного задания лежит в поиске подходящего варианта, предварительно прописанного авторами.
В нашем случае все несколько иначе. Если открыть предложенный файл в текстовом редакторе, то он выглядит вот так:
В начале файла располагаются метаданные в формате ID3. Сначала идет тег TRCK (track number), а потом — какие-то куски текста:
RGB7 5,183, NULL RGB6 0,42,159 RGB5 194,244,68 RGB4 47,77,6 RGB3 44,73,141 RGB2 140,207,72 RGB1 120,156,203
Эту информацию можно разбить на семь записей (от RGB7 до RGB1):
RGB7 5,183, NULL
RGB6 0,42,159
RGB5 194,244,68
RGB4 47,77,6
RGB3 44,73,141
RGB2 140,207,72
RGB1 120,156,203
После каждого из RGB-идентификаторов стоит три значения. Обычно это числа, но в одном случае — NULL. Легко предположить, что это массив записей, каждая из которых содержит до трех однобайтовых значений. Можно записи отсортировать, объединить, превратить десятичные коды в символы и вывести в шестнадцатеричном виде, например, при помощи вот такой программы:
>>> a = [120,156,203, 140,207,72, 44,73,141, 47,77,6, 194,244,68, 0,42,159, 5,183]
>>> print «».join(map(chr, a)).encode(«hex»)
В результате получим:
Шестнадцатеричная последовательность начинается с байтов с кодами 0x78 0x9С, а это подсказывает нам, что используется алгоритм сжатия данных zlib. Если использовать zlib в режиме компрессии с параметрами по умолчанию, выходная последовательность будет начинаться именно с этих байтов.
Одним вызовом функции decompress библиотеки zlib в Python можно распаковать упакованное сообщение:
И тогда будет выведен текст:
Именно этот флаг нужно было отослать организаторам соревнований.
Неправильная криптография
Данное задание относится к категории Crypto. По легенде, был перехвачен сеанс связи, и командам нужно расшифровать переданные сообщения.
Прежде всего, ясно виден процесс обмена ключами и затем передача зашифрованных данных. Необходимо понять, на основании какого криптографического базиса можно построить подобное общение.
Задание называется mars, можно предположить, что это означает Modified RSA.
Каждый ключ состоит из двух частей, и вторая часть в обоих случаях равна 0x010001 == 65537 — часто используемая публичная экспонента RSA (e). Значит, в сеансе связи сначала идет обмен открытыми ключами (n1/e1, n2/e2), а затем обмен зашифрованными на них сообщениями (c1, c2).
Если это действительно что-то похожее на RSA, то ci = pow(mi, ei, ni). Требуется найти m1 и m2.
pow — функция модульного возведения в степень, pow(val, еxp, modulus) == val exp % modulus.
Согласно алгоритму RSA:
Воспользуемся реализацией расширенного алгоритма Евклида на Python:
Найдем НОД (наибольший общий делитель) чисел n1 и n2:
НОД(n1, n2) имеет длину 1024 бита. Найдем другие делители чисел n1 и n2:
p1 и p2 — простые числа длиной 512 бит, gcd — составное число длиной 1024 бита (скорее всего 512*512), и оно также слишком велико для факторизации…
Рассмотрим случай, когда искомые сообщения mi могут быть представлены числами, не превосходящими pi.
Пусть ni = pi*q*r, тогда при 0 its_n0t_ab0ut_p4dd1ng ».
Криптографическое задание secc
Дано: архив source.tar.gz, содержащий файлы ecc.py и task.py, в которых содержится схема верификации ключа, реализованная с помощью эллиптической криптографии. Известно, что подключившись по адресу 195.133.87.171 на порт 5555, можно установить соединение с каким-то сервером:
nc 195.133.87.171 5555
password: secch4l*
Поскольку даны исходники, то стоит начать с их анализа. Можно их даже запустить.
Так как у меня не было модуля libnum, пришлось написать его самому. В нем достаточно реализовать уже упомянутую ранее функцию модульной инверсии и используемый ею расширенный алгоритма Евклида:
Итак, функция main из task.py :
Читается строка, SHA-1 от которой должно быть равно заданному значению («secch4l*»).
Потом генерируется случайный 8-байтовый префикс, отправляемый клиенту. Байты кодируются как hex-строка. В ответ клиент должен прислать строку не длиннее 16 байт, при этом чтобы она начиналась с заданного префикса, а первые 3 байт значения SHA-1 от этой строки должны быть нулевыми. Если все этапы пройдены успешно — вызывается функция goflag().
Следующий фрагмент кода соединяется с сервером, отправляет пароль, получает префикс, вычисляет и отправляет ответ:
После выполнения этого кода на стороне клиента сервер выполняет функцию goflag(), выводящей примерно следующий текст:
EC PASSWORD CHECK
R = 572115218124168948525078362547166172445820217705568707355669424304224832114
SHARED SECRET = R ^ PASSWORD
ENCRYPTED MESSAGE: 7a93846a011e0d0382e94f32d705239e6298169dcec20da5d6
Что же происходит в функции goflag из task.py :
Используется асимметричная криптография на эллиптических кривых. Выбрана кривая P-256, рекомендованная NIST. Реализация операций над точками кривой не содержит очевидных уязвимостей.
Мы знаем значение R, но без знания значения PASSWORD (которое читается сервером из файла password.txt) мы не можем вычислить S. Знание S позволило бы нам легко вычислить key. Так может быть шифрование реализовано с ошибкой?
Функция encrypt из task.py :
По коду видно, что зашифрованному сообщению предшествует случайный 8-байтовый вектор инициализации iv, а шифрование выполняется как XOR флага c гаммой, сгенерированной как выход двух вычислений SHA-256. Без знания значения key получить гамму нереально. Но как key получается в программе?
Функция derive из task.py:
Оказывается, значение точки S (состоящее из двух координат — x и y) используется как вход SHA-256. Фактически на вход хеша подается значение str(int(x*1024/y)). Так как x и y имеют близкие значения (это большие целые числа), то результат арифметических действий должен близок к 1024 (хотя может и превышать его в разы).
Таким образом, из-за особенностей реализации функции derive, значение key может принимать совсем небольшое количество состояний. Можно просто перебрать их все, попытаться на каждом ключе расшифровать сообщение, и если оно состоит только из печатных символов — мы достигли успеха.
Таким образом, флагом является строчка «ecc_is_too_s3cure».
Реверс-инжиниринг. Shadelt900
Обратная разработка — еще одна популярная категория заданий. Помимо CTF, в конкурсной программе PHDays присутствует конкурс Best Reverser.
Задание Shadelt900, так же как и три предыдущих, было частью программы PHDays IV CTF Quals, прошедших в январе 2014 года. Команды должны были расшифровать изображение под названием ‘derrorim_enc.bmp’. Было известно средство, примененное для его зашифрования, — оно как раз и называется Shadelt9000.exe, но декриптор обнаружить не удалось. Вот это изображение:
При ближайшем рассмотрении файла Shadelt9000.exe становится ясно, что приложение использует OpenGL. Также есть копирайт inflate 1.2.8 Copyright 1995-2013 Mark Adler, указывающий на то, что в программе используется популярная библиотека компрессии zlib.
Если в дизассемблере посмотреть, откуда идут обращения к функциям zlib, можно довольно быстро найти вот такой кусок кода:
По адресам 0x47F660 и 0x47F7B8 расположены массивы данных, упакованные zlib. Распакуем их:
После распаковки файл 1.txt содержит пиксельный шейдер:
Файл 2.txt содержит вершинный шейдер:
Главная информация о пиксельном шейдере выделена красным:
В переменной t оказывается текущий элемент обрабатываемой текстуры (входного файла),
а в переменной g — текущий элемент гаммы (сгенерированной псевдослучайным образом).
В переменной s мы видим некоторое значение, используемое позже для циклического сдвига s.
Выходное значение фактически вычисляется как
Причем если запускать программу несколько раз с одним и тем же входным файлом, то для каждого элемента значение g будет меняться от запуска к запуску, а t и s будут оставаться одними и теми же.
Найдем, как генерируется гамма:
Видно, что она зависит от текущего времени.
Из исходного архива можно узнать, что файл derrorim_enc.bmp создан 21.01.2014 в 18:37:52.
Получаем значение, которое в тот момент вернула бы функция time():
Теперь копируем файл ShadeIt9000.exe в ShadeIt9000_f.exe и исправляем его.
По смещению 00015557 надо байты
Это эквивалентно замене
Таким образом мы получили версию ShadeIt9000_f, которая будет всегда шифровать с той же гаммой, какая была в момент зашифрования интересующего нас файла.
Теперь нужно подготовить значения, которые помогут расшифровать изображение:
В файле 00_enc.bmp окажется результат зашифрования картинки, состоящий из нулевых байтов. Это и будет гамма в чистом виде.
В файле XX_enc.bmp окажется результат зашифрования картинки, состоящий из байтов со значением 2. Это поможет нам узнать, на сколько битов циклически сдвигался каждый байт.
Наконец, расшифровыванием Shadelt9000:
Выше был описан верный, но не самый эффективный путь решения задания. Есть способ короче.
Сразу за вершинным шейдером по адресам 0x47F848 и 0x47F9A0 лежит упакованный zlib-код пиксельного и вершинного шейдера для выполнения обратного преобразования. Возможно, он был случайно забыт разработчиком задания. А может и оставлен намеренно.
Коды вершинного шейдера для зашифрования и расшифрования идентичны, так что трогать их не имеет смысла. А что будет, если подменить пиксельный шейдер?
Копируем ShadeIt9000_f.exe в ShadeIt9000_d.exe и исправляем его:
00015775: 60 F6 ==> 48 F8
Затем запускаем ShadeIt9000_d.exe derrorim_enc.bmp. И получаем на выходе расшифрованный файл derrorim_enc_enc.bmp, который (за исключением мелких артефактов) совпадает с тем, который мы расшифровали скриптом на Python.
На сегодня все! Всем спасибо за внимание, будем рады ответить на вопросы в комментариях.
Напоминаем, что финал PHDays IV CTF состоится 21 и 22 мая во время проведения форума Positive Hack Days. Следить за ходом соревнований можно будет не только непосредственно на площадке, но и с помощью мобильных приложений. Следите за новостями!
P. S. Архив всех заданий PHDays CTF и CTF Quals можно найти на сайте PHDays. Так что, если есть желание испытать себя — вперед!
Как стать специалистом по кибербезопасности, играя в 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. После соревнований обязательно посмотрите разборы заданий, которые вы пытались, но не смогли решить.
Разбор задач Геккон-клуба в четвёртом этапе Кибертона
Проксимов Прксимович
1. Singularity (web)
Условие:
Эх, когда уже наступит сингулярность. http://45.143.94.76:3004/
Как решать?
переходим на сайт по ссылке из условия:
Внимательно смотрим, что отправляется при нажатии на кнопку:
И это просто локальное время: let t = new Date();
2. well-known song (stego)
Условие:
Как решать?
Скачиваем файл и смотрим свойства:
Обращаем внимание на то, что это не христианский рок имя исполнителя. Догадываемся, что нужно посмотреть спектрограмму. Для этого подойдут программы Sonic Visualizer или Audacity
А вот и флаг!
3. za_pazwardo (web + ppc)
Условие:
Как решать?
Ага, требуется ввести пароль в формате [a-z0-9] (буквы латинского алфавита в нижнем регистре и цифры от 0 до 9)
В html коде замечаем, что пароль почти полностью известен, неизвестно лишь 2 символа. Внимательно прочитав условия задачи понимаем, что нужно пробрутить (перебрать все возможные комбинации) пароль.
Пишем простой скрипт на питоне:
Флаг получаем на 458 итерации.
4. za_pazwardo_requiem (web)
Условие:
Теперь ты знаешь пароль, но никогда не сможешь достичь цели. http://45.143.94.76:3001/
Как решать?
Переходим на веб-страницу:
Пробуем отправить пароль и.
Смотрим, какие запросы отправляются:
Замечаем, что каждый раз отправляется 2 запроса, один на смену пароля, другой на проверку. Тем самым проверяется уже новый пароль, а не старый. Нужно просто отправить один запрос на проверку, вместо двух.
> Для того, чтобы пароль не поменялся между запросами используем сессию: requests.Session()
P.S никогда не парсите html регулярками (трюк выполнен профессионалом)
5. captcha_generator (web + ppc)
Условие:
Как решать?
Опытным путём выясняем, что нужно решить 250 математических примеров. Да еще и распознать их! Используем pytesseract и PIL.
> Использование tesseract OCR разбиралось на мастер-классе перед 4 этапом, все материалы находятся в курсе: Материалы для подготовки к Кибертону
Решаем все 250 примеров руками Пишем код на питоне:
После решения всех 250 примеров получаем флаг.
О разработке предстоящего CTF с оффлайн квестом для всеукраинской битвы хакеров
Привет, Хабровчане! Надеюсь, многие из вас знают и посещают уютные хакерские конференции, форумы и митапы не только ради after-party, но и также для того, чтобы размять ум и смекалку на CTF (Capture The Flag). Организовывая мероприятие, в котором будет совмещено все вышеперечисленное, хотел бы поделиться опытом нашей команды по выбору платформы для СTF и собственно самой разработки.
CTF — соревнования, связанные с поиском уязвимостей и скрытых данных, которые условно разделяются на классические и тасковые. Классические соревнования еще называют Attack-Defence: суть в том, чтобы проанализировать образ системы, найти уязвимости, исправить их и проэксплуатировать на серверах других команд. Речь пойдет о тасковых заданиях.
На Хабрахабре присутствует немало людей, увлеченных CTF играми, поэтому на вопрос: почему существует множество сайтов, с рейтингом команд и участников, scoreboard’ами и аналитическими статьями, уже многие давно нашли ответ. Ведь это чуть ли не единственное занятие, в котором есть дух соперничества и каждый «безопасник» может померятся достоинством, хоть и в искусственных, и лишь в некотором роде приближенных к реальности условиям.
Одно дело участвовать в CTF, совершенно другое, с чем я вас и познакомлю — создавать и организовывать данное мероприятие.
Выбор платформы
Платформы для CTF бывают двух типов: готовые и самописные. Готовые платформы хороши своими «фичами», которые дорабатываются годами и проверены многими соревнованиями. Самописные же фактически гарантируют безопасность сайта т.к. их будут писать люди, которые знают больше о ней, чем среднестатистический программист-верстальщик (чего мы не можем гарантировать в случае с готовыми платформами, тут все зависит от прямых рук). Поэтому лично наш выбор пал на платформу Facebook CTF — интересная система со следующими настройками:
Разные типы тасков:
Платформа Facebook CTF вначале использовалась в таких CTF’ах, как Facebook CTF в Csu San Bernardino и на конференции BruCON 2014. Впоследствии Facebook начал продвигать политику OpenSource ПО. Это также и затронуло их CTF платформу.
И в мае 2016 года они открыли ее исходный код на github. Но, как вы можете догадаться, продукт был недоделанным, но разработчики не спали и к сентябрю сделали уже около 401 правки в их код с момента публикации. Надеемся, что они и дальше будут в таком же темпе апгрейдить их продукт 🙂
Настройка платформы
И вот мы столкнулись с первыми трудностями: оказалось, что платформа находится только в бета-тестировании и имеет множество недочетов. Перед нами встала задача исправить и подкорректировать некоторые баги. Не буду описывать весь процесс исправления и костылей, скажу лишь, что несколько раз хотели менять платформу, но все же решили, что будем одними из первых покорять Facebook CTF.
Все редактирования мы проводили, основываясь на нашем трехлетнем опыте участия в CTF соревнованиях. Учитывались все недочеты, допущенные другими соревнованиями, такие как отсутствие bugbounty и очков за него, связь с создателями тасков и многое другое! Также на это повлияла платформа ctftime, на которой в том числе и выкладываются множество райтапов с отзывами участников о каком-либо проводимом соревновании.
Создание тасков
А это один из самых интересных этапов в разработке CTF’a! Рассмотрим области, которые мы затронули:
Конкурс тасков
Далее про конкурс тасков: это для вас реальная возможность потренироваться в создании своих тасков фактически во всех категориях! В случае, если ваш таск проходит на CTF, то вы получаете бесплатный билет на конференцию, уважение почет. Пока прислали мало тасков, поэтому шанс быть выбранным высокий! Заявки принимаются на почту: ctf@hackit-ukraine.com
Оффлайн тур H4ck1t CTF
Помимо 12 подготовленных категорий с интересными тасками, рассчитаных как для новичков, так и для профи в каждой из областях, 10-ку лучших команд ожидает оффлайн-тур с нестандартными и интересными конкурсами, более развлекательного, но все же не без смекалки, жанра (пока секрет какие 🙂 ).
Проведение соревнований
Проводиться онлайн тур будет с 23 сентября по 2 октября. И в каждый день будут открываться несколько тасков из различных категорий. По его итогам лучшие команды будут приглашены на оффлайн тур 7-ого октября на конференцию HackIT-2016. В финале команды будет ожидать тасковый CTF, но уже в реальной жизни с нестандартными конкурсами, блэкджеком и дамами. Наша команда готовит увлекательные квесты в реальности со взломом веб-камер, RFID, замков и многое другое.
Разбор самых интересных заданий для страждущих будет опубликован после проведения мероприятия.
И скидка на само мероприятие для хабровчан: промокод на 10%, может кому пригодится:
HABR0710