Специально для паблика SMARTRHINO.

0000. Может, CTF устроим?

Ночь, улица, фонарь, ТЕЛЕГА!

Эта история началась так же неожиданно, как и сообщение от Паши в предверии долгожданного отпуска после дурной сессии:

“Саша, привет!

если предположить, что мы будем делать свой CTF вместе с
конфой, для старших школьников и младших студентов, то…
ты умеешь в таски по вебу?

в смысле сделать их”

23.01.2020

К сожалению или к счастью в таски по вебу я не умею, да и вообще не люблю его, но над предположением всё-таки подумал и сразу же согласился (про себя).
На следующий день вопрос был поставлен ребром:

“вопрос глобальный - как ты относишься к тому, чтобы сделать свой CTF?”

Тут я уже не смог сдерживать свой восторг и немедленно дал согласие на участие в орагнизации данного события.

P.S. Позже мерзкий КОВИД 👾 внесёт свои коррективы.. Поэтому читателю предлагается немного абстрагироваться и представить мир, где нет вот этой бяки и всё идёт по плану.

0001. Начинаем подготовку

Для начала нужно определиться.. с категориями тасков? А вот и нет - с местом и временем проведения, а также с инфраструктурой.
Первой проблемой озадачился Паша, ну а вторая перепадёт чуть позже мне.

Как это обычно бывает, CTF решили проводить в два этапа: первый - отборочный, проводится онлайн; второй - финал, в нём принимают участие 10 лучших команд отборочного этапа, проходит параллельно с нашей конференцией SMARTRHINO.

Пока я отмокал в купальнях, Паша с Леной не сидели без дела и планировали мероприятие, расписывали нагрузку.
Разумеется, времени на подготовку было немного, точнее его вообще не было, задумывались даже о целесообразности проведения, потянем ли. Ведь конференция запланирована на конец апреля, до неё необходимо провести отборочный этап CTF.
Для него надо подобрать время в соответствии с сеткой соревнований на CTFtime.org, чтобы не пересечься с другими соревнованиями в Москве/России.
Поэтому был установлен жёсткий срок - к началу марта всё должно быть готово, о чём все причастные были уведомлены через YouTrack.


Лучшее начало дня, согласитесь)

Буквально через несколько дней, а точнее на пятый, ребята определились с локацией для проведения конфы и финала - #tceh. О чём Паша радостно сообщил мне и скинул фоточки оттуда, а также небольшой видеоотчёт.
Кстати, место и правда классное, в 2019 году там проходил CTF.MOSCOW.

0002. А что с инфраструктурой-то?

Неделя отпуска пролетела незаметно, и пора приниматься за работу и подготовку CTF.

С выбором борды было всё просто, как два байта переслать. Либо CTFd, либо.. CTFd, ибо времени на поиски чего-то другого или разработку своего не было от слова совсем. К тому же данная платформа довольно часто используется различными командами при проведении соревнований.

Чтобы хоть как-то представлять аппетиты CTFd и прикинуть, какие серверы нам понадобятся, пришлось отыскать VirtualBox и раскать виртуалку с Ubuntu Server 18.04.
По заявлениям разработчиков платформы самый простой способ развернуть CTFd - воспользоваться Docker, но не тут-то было (об этом чуть позже). Ну ладно, Docker, так Docker, разворачиваем и видим следующее:

Из переписки с Пашей:

“Небольшой отчёт по борде

Поставил на VirtualBox Ubuntu Server 18.04, туда docker и ctfd
Виртуалку сконфигурил на два ядра и 1ГБ памяти.
В холостом режиме 400-500 МБ памяти отжирает.
Когда перехожу по ссылкам в панели админа, где есть запросы к БД, процессор загружается до 20-25%”

Ага, значит надо.. а чёрт его знает! С этой мыслью я обратился к гуглу за помощью и начал искать реальные примеры проведения CTF с использованием CTFd.
Для начала стоит понять, что у нас вообще должно работать, залезаем в docker-compose.yml и смотрим на зависимости:

  • mariadb:10.4
  • redis:4
  • +reverse proxy на nginx, нужен же HTTPS 💪

Итого: Docker + Python + Flask + MariaDB + Redis + Nginx, уууух..

После сёрфинга, издевательств над виртуалкой, магических расчётов и общения со знакомыми было решено, что серверы должны удовлетворять следующим требованиям:

  • RAM: 8ГБ
  • CPU: 4 ядра
  • ОС: Ubuntu Server 18.04
  • SSD/HDD: 40+ ГБ
  • Сеть: хотя бы 100Мб/с

В итоге у нас появились 2 VPS’ки (для борды и удалённых тасков соответственно) от 1cloud. Не скажу, что это было оптимальным решением, но что есть, то есть.

0003. Что-нибудь ещё?

Ага, почтовый сервер. CTFd из коробки поддерживает работу с почтовыми серверами по различным протоколам, не забывая и про SSL и TLS.
Почта используется для восстановления доступа к аккаунтам, отправки писем для подтверждения регистрации и др.

Нередко во время застоев со сдачей решений организаторы прилагают к соответствующим таскам подсказки (Hints), которые стоят некоторое количество баллов. Поэтому верификация регистрации несколько спасает от создания фейковых пользователей для покупки этих самых подсказок, ведь каждый балл на счету, особенно ближе к окончанию соревнования!

Не мудрствуя лукаво, выбрали сервис Яндекс.Коннект, на сайтиках же работает для регистрации их почтовый сервер, чем CTFd плох? Чтобы воспользоваться услугами данного сервиса, необходимо зарегать ящик на Яндексе (продаём душу дьяволу), добавить MX- и TXT-записи на сервере. Последней подтверждаем, что являемся владельцем сервера. Profit!

Пишем тестовый скрипт на Python и удостоверяемся, что почта работает.
Добавляем настройки почты и креды в панель CTFd на нашей виртуалке, проверяем, и…

А что случилось дальше, мы с Вами узнаем в следующей статье)