6 апреля в Екатеринбурге состоялся первый на Урале CTF для школьников. Напомню, что CTF (Capture The Flag) - соревнования по защите информации.
В итоге, участвовало 20 команд, численностью от 1 (в одной команде) до 4 человек (в основном).
Соревнования проходили очно в стиле task-based, где командам было предложено решить 10 задач из различных категорий.
Если интересно, как происходила подготовка и с какими трудностями мы столкнулись - добро пожаловать под кат.
Как бы ни было неожиданно, но первой и самой главной проблемой стала неизвестность. Незнание уровня школьников и их познаний. Очевидно, что нам не хотелось делать банальные и простые задания, но с другой стороны, имея опыт разработки заданий для RuCTF, мы боялись сделать такой контест, в котором никто ничего не решит и все уйдут недовольными.
Мы знали пару-тройку школьников, которые могут выступить на уровне студентов, но этого так мало, что некоторые таски были намеренно упрощены.
Как оказалось, не зря. И кроме того, за месяц до соревнований была открыта предварительная регистрация на сайте, которая помимо названия и состава команды включала в себя пункт о том, с какими языками программирования знакомы участники.
- Как оказалось, статистика по ЯП внесла самое главное ограничение на разработку: запрет на таски, решение которых подразумевало излишнее программирование, и строжайший запрет на те, которые требовали сетевого программирования (Паскаль в школе, к сожалению, пока процветает и не сдаётся. А другие языки изучаются самостоятельно и далеко не всеми).
- Вторым запретом мы решили отстраниться от работы с БД (инъекции, проверки пароля и прочее). С одной стороны - это часть певрого ограничения, с другой - требует изучения SQL хоть на начальном уровне, а за те 7,5 часов, что шло соревнование это сделать проблематично.
- Третье и главное ограничение - таски не должны требовать какой-то определённой платформы для своего решения, то есть должны одинаково решаться на Linux/Windows/Mac при наличии определённого софта (ssh например, или wireshark).
В итоге был сформирован список из категорий, которые можно реализовать без какой либо головной боли для школьников, но в которых можно как-то развернуться, чтобы было не просто, и интересно:
- Forensics
- Reverse
- Network
- Shell - то есть немного полазить внутри linux по ssh
Но строгого разделения по категориям мы решили не делать, поэтому в некоторых заданиях были смешаны различные методики (в принципе, сейчас на многих соревнованиях происходит то же самое).
Перед тем, как перейти к рассказу о самом дне соревнований, приведу краткое описание всех 10 заданий (решать их уже не надо, поэтому в некоторых будут комментарии по решению).
Описание тасков
A. Дана ссылка на ssh до сервера.
При соединении, пользователь попадает в очень урезанный шелл (использовался lshell для реализации), в котором доступны лишь ls, cd, date, cat, less, xargs, find, man.
Дерево директорий выглядит примерно так ( […] - директория. Файл - md5 от случайного числа):
-[enter]
--b1934abfdbbaga453469235235346
--[left]
--[forward]
--[right]
При этом, каждая из директорий [left], [right], [forward] - также содержит три пути и файл.
Можно заметить, что глубина этого третичного дерева - 10, следовательно, получаем 3^10 файлов. (Хотел больше - inode закончились).
В каждом из файлов, кроме одного написана одна и та же строчка
THANK YOU MARIO, BUT YOUR PRINCESS IS IN THE ANOTHER CASTLE.
Очевидно, необходимо найти отличную строку.
B. Дан дамп трафика с клиентского компьютера. Дамп.
Пользователь сначала общается в IRC, обещая отправить файл, потом закачивает файл на ifolder, отправляет ссылку в чат, потом удаляет файл с ifolder’a. Внутри файла порядка 1000 страниц, на каждой по 2 символа.
И подсказка
2^6 <-> 2^7
2^6 - Base64. Раскодируем - получаем штрихкод Code128 (2^7).
C. Даётся ссылка на веб страничку с психологическим тестом.
- Только сервер знает, какой ответ верный.
- Если отвечаешь правильно - +1 очко.
- Если неверно - очки сбрасываются на начало.
- Вопросы не перемешиваются.
- Надо правильно ответить на 450 вопросов,
D. Дан образ дискеты, на котором лежит calc.exe. Найти ответ))) Дискета####
Калькулятор необычный, при делении на ноль он всегда выдаёт разные ответы. Если найти строку, которую поделить на 0, калькулятор выдаст верный ответ. Во всём остальном - он обычный.
E. Дан BMP32 с 4 изображениями. ответ - 4 строки. Картинка
BMP32 отличается от 24 наличием альфа-канала. Не все редакторы или просмотрщики его видят, но он есть. Вытаскиваем альфу, считываем qr-коды, вводим ответ.
F. Выдаётся картинка и запароленный архив. Картинка Архив
В архиве ответ. Пароль надо выцепить из картинки. Решение не даю.
G. Выдаётся картинка и просьба - сказать, кто тут изображён или хотя бы, где это. Картинка
Думали, что это самый простой таск будет. Но его долго не могли решить….
H. Выдаётся ссылка на pop3 сервер.
Известно, что ящик зарегистрирован на владельца севера, а пароль - его телефон. Какое слово пропущено в письме? Владельца можно посмотреть в WHOIS. Скачиваем письмо - там pdf. Письмо
I. Снова ssh. У нас есть лог входов и выполнявшихся команд за период с 1941 года по 2013.
Известно, что когда нас похакали, время на сервере остановилось. Укажите имя пользователя, который это сделал.
date показывает: Fri Aug 29 02:14:00 GMT-5 1997. Открываем лог, ищем, отвечаем. Тривиальнейше.
J. Есть файл с паролями
Мы знаем, что правильный пароль вида
Pass:*********
, где среди ** есть хотя бы одна цифра и буквы в обоих регистрах. Let’s find it!
День соревнований
Все сервисы крутились на одной виртуалке с 3,5 ГБ ОЗУ, одним CPU Xeon X5660 2.8Ghz, Ubuntu 12.04.2
Сервер находился внутри сети университета и участники были внутри университета, поэтому проблем с сетью не возникало.
Первая проблема всплыла, когда оказалось, что ulimit на количество процессов для игрового пользователя на сервере был выкручен слишком жестоко для такого количества соединений. В итоге кого-то перестало пускать. Пришлось ещё немного урезать lshell, запретив почти все известные способы запуска скриптов, форкбомб и прочей деструкции, и выключить ulimit вообще))) После этого всё стало отлично! Кстати, лабиринт оказался самым посещаемым таском.
Потом оказалось, что из-за различий перла при разработке и при деплое на сервер - то и дело возникали предупреждения о deprecated функции. Логи росли, нагрузка из-за этого тоже не падала. Пришлось на живую по-быстрому искать решение и дописывать сервис, пока ничего не рухнуло.
На будущее: если используется FCGI.pm, то вместо
use FCGI.pm
sub showPage(){
....
return print $html;
}
Необходимо писать:
use FCGI.pm;
use Encode;
sub showPage(){
....
return print Encode::encode('utf8', $html);
}
И ещё одно наблюдение, если вы знаете как решать А
интересный факт:
find enter -type f -exec cat | less
Работает до 20 раз дольше, чем
find enter -type f -print | xargs cat | less
Вероятно, find в первом случае сначала строит список, а во втором - отдает результат по мере поступления.
По окончанию соревнования школьники были очень довольны. Разработчики тоже.
По результатам оказалось два первых места - решивших по 7 задач из 10.
Нерешёнными задачами остались D и E.
Ждём желающих на следующий год!
В разработке участвовала команда ХакерДом, при организационной поддержке компании СКБ Контур.