Привет! В этом посте мы расскажем о том, как провели первый в истории RBK.money CTF (capture the flag). Механика соревнования была примерно такой же, как и на привычных вам CTF, а вот результаты немного удивили. Впрочем, возможно, мы просто перестарались с задачами.
В рамках CTF нужно было в составе команды или, если чувствовал, что справишься сам, единолично получить определенный флаг, заботливо спрятанный нашими ребятами в коде. Чтобы его получить, надо было либо взломать участвующие в CTF сервисы, либо написать программу, либо просто найти в нашем коде уязвимость и не замедлить ею воспользоваться.
Участвовали примерно 100 команд, в некоторых из которых было по 5-7 человек, а в других — по одному. Особенностью CTF стали две вещи. Первая — отчасти соревнование было посвящено Erlang. Штука не самая популярная, да. Вторая — несколько задач решить не осилил никто из участников, одно из заданий было очень типично для Erlang, ещё одно — на извлечение информации из аудиофайла. То ли люди перестали увлекаться стеганографией, то ли мы немного переборщили.
В общем, было всё. Реверс-инжиниринг, фишинг участников со стороны самих участников, слишком сложные задачи и попытки помешать остальным найти флаги. Под катом — подробности и сами задания, если решите попытать силы.
Приложения и сервисы
CTF мы готовили около месяца, хотелось не просто провести yet another соревнование, но и сделать что-то новое, опробовать свежие технологии или особенные подходы к их реализации — и нам интересно, и для участников возможность открыть для себя что-то занятное. Ряд задач был довольно ожидаем, например, у нас было несколько заданий, в которых фигурировали сервисы, написанные на Erlang. Ясное дело, их надо было взломать, чтобы достать флаг. А еще было приложение, код которого надо было исследовать, не имея под рукой самого кода. То есть у ребят не было исходников этого приложения, была только готовая скомпилированная версия, и им нужно было найти инструменты (или написать собственные, да), с помощью которых понять принцип работы приложения, а затем уже достать ключ. В общем, реверс-инжиниринг как он есть.
Потом была задача из области стеганографии. Ну вы знаете, когда в картинку можно зашить какие-то данные, почти криптография, но при которой скрывается сам факт передачи информации. У нас вместо картинки был аудиофайл, в который и зашили флаг.
Некоторые задания решались путем разведки по открытым источникам. Для хранения кода RBK.money используется Github, и именно там мы прятали ряд флагов или же каких-то файлов, которые были ключевыми для решения той или иной задачи. К примеру, один флаг мы спрятали в репозитории, в информации об одном из коммитеров. Для этого надо было сложить 2 и 2 и чуть-чуть покодить. Вот вроде бы всё очевидно, но эту задачу тоже мало кто решил. Народ кинулся вручную перебирать наших сотрудников на предмет совпадения рабочих почт и никнеймов на гитхабе, хотя на самом деле существуют весьма удобные инструменты, с помощью которых можно исследовать публичные репозитории разных организаций на предмет интересной информации.
Инфраструктура и web
Другие задания касались работы веба и инфраструктуры. Для веба мы написали два задания, одно на Python, второе (да-да) на Erlang. В случае с Python была банальная SQL-инъекция, при грамотной эксплуатации которой можно было бодренько выдернуть нужный флаг. А вот веб на Erlang осилил только один человек. В принципе, это отчасти обусловлено тем, что Erlang сложно считать не то что популярным языком, а даже распространенным. А для решения задачи надо было не только знать, что из себя представляет этот язык и его код, но и почитать документацию про модули и функции, поисследовать приложение. Поэтому в общей пропорции задач мы не стали давать более 45 процентов Erlang.
Кстати, еще из специфики, которая вводила участников в замешательство. У нас в продуктовой среде вообще везде используется IPv6. Соответственно, ряд задач тоже был доступен только по IPv6, это был своего рода челлендж. С которым тоже не все справились.
Отдельно стоит отметить смекалку участников, потому что всегда есть люди, которым просто влом что-то делать. На баше была похожая тема (осторожно, нецензурные слова). Так вот, некоторые юзеры принялись просто писать участникам соревнования, представляясь нашей поддержкой и спрашивая решения задач. Остальные, правда, на столь откровенный фишинг не повелись и доблестно зажали флаги и решения.
А в задаче про Harbor registry участники вообще начали вести деструктивную деятельность и стали мешать друг другу проходить этот этап. Надо было взломать Harbor registry для докер-образов, используя последние CVE, которые доступны публично. Иными словами, найти сам harbor registry, где он размещается, определить, какой он версии, и найти на него публичный эксплойт.
Тот, кто проделал это первым (к слову, он пропатчил harbor быстрее наших же девопсов), решил остаться и единственным, начав мешать всем остальным. Пришлось принимать меры. Но соображалку оценили.
Задачи
Список задач можно посмотреть на портале нашем https://dashboard.hq.rbk.mn/ который мы давали ребятам на CTF. Сразу после публикации поста реанимируем там конкурсы, можете регаться, смотреть и решать задачки. Если возьметесь их решать, выберите, пожалуйста, подходящий ответ в опросе ниже. Мы хотим проводить еще CTF, но надо определиться, жестим мы с заданиями, или же стоит продолжать в том же духе.
DrunkBear
Идея с реализацией интересны, но "в общей пропорции задач мы не стали давать более 45 процентов Erlang" — это уже троллинг корпоративного уровня.
Или толстый намёк «учите erlang, товарищи!»
PS c другой стороны, это мог быть fantom, groovy или cow с не меньшим успехом.
chainick Автор
Эрланг и корпораты? Ну такое конечно, спорное. Ну и что мне поделать, если у меня процессинг на нем пишется, не могу же я сказать: "господа вайтхэты, специально для вас переписали микросервисы с эрланга на дотнет".
Ru6aKa
Давно хотелось задать вопрос, почему именно Erlang, а не Elixir?
И как относитесь к go? Может что пробовали на нем делать?
chainick Автор
Исторически с предыдущих работ начинали на на нем. Потом долго хотели перейти на эликсир, но что-то никак, да и в целом эрланг всем устраивает.
На гошечке года три назад хотели писать, даже напилили один микросервис. Все закончилось после того как я открыл несколько вакансий гоферов и понял, что мы их будем закрывать много лет.
grigorov
А разработчика на erlang прям много?! Обычно не найти никого, только те, кто пробовал elixir, но с erlang у них обычно всё плохо...
chainick Автор
Не прям много, но достаточно. Нам хватает.
DrunkBear
Ради интереса посмотрел на соотношение вакансий / резюме на hh по go: много джунов, единицы middle/senior и общее количество вакансий примерно равно количеству резюме.
С Go всё так печально?