
6 апреля в Екатеринбурге состоялся первый на Урале CTF для школьников. Напомню, что CTF (Capture The Flag) — соревнования по защите информации.
В итоге, участвовало 20 команд, численностью от 1 (в одной команде) до 4 человек (в основном).
Соревнования проходили очно в стиле task-based, где командам было предложено решить 10 задач из различных категорий.
Если интересно, как происходила подготовка и с какими трудностями мы столкнулись — добро пожаловать под кат.
Как бы ни было неожиданно, но первой и самой главной проблемой стала неизвестность. Незнание уровня школьников и их познаний. Очевидно, что нам не хотелось делать банальные и простые задания, но с другой стороны, имея опыт разработки заданий для RuCTF, мы боялись сделать такой контест, в котором никто ничего не решит и все уйдут недовольными. Мы знали пару-тройку школьников, которые могут выступить на уровне студентов, но этого так мало, что некоторые таски были намеренно упрощены. Как оказалось, не зря. И кроме того, за месяц до соревнований была открыта предварительная регистрация на сайте (http://school.uralctf.ru), которая помимо названия и состава команды включала в себя пункт о том, с какими языками программирования знакомы участники.
Как оказалось, статистика по ЯП внесла самое главное ограничение на разработку: запрет на таски, решение которых подразумевало излишнее программирование, и строжайший запрет на те, которые требовали сетевого программирования (Паскаль в школе, к сожалению, пока процветает и не сдаётся. А другие языки изучаются самостоятельно и далеко не всеми).
Вторым запретом мы решили отстраниться от работы с БД (инъекции, проверки пароля и прочее). С одной стороны — это часть певрого ограничения, с другой — требует изучения 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. Очевидно, необходимо найти отличную строку.
- [enter]
- B. Дан дамп трафика с клиентского компьютера. (http://school.uralctf.ru/static/quest/task2 ) Пользователь сначала общается в IRC, обещая отправить файл, потом закачивает файл на ifolder, отправляет ссылку в чат, потом удаляет файл с ifolder'a. Внутри файла порядка 1000 страниц, на каждой по 2 символа. И подсказка 2^6 <-> 2^7
А дальше2^6 — Base64. Раскодируем — получаем штрихкод Code128 (2^7).
- C. Даётся ссылка на веб страничку с психологическим тестом. Только сервер знает, какой ответ верный. Если отвечаешь правильно — +1 очко. Если неверно — очки сбрасываются на начало. Вопросы не перемешиваются. Надо правильно ответить на 450 вопросов,
- D. Дан образ дискеты, на котором лежит calc.exe. Найти ответ))) (http://school.uralctf.ru/static/quest/floppy.img )
КраткоКалькулятор необычный, при делении на ноль он всегда выдаёт разные ответы. Если найти строку, которую поделить на 0, калькулятор выдаст верный ответ. Во всём остальном — он обычный.
- E. Дан BMP32 с 4 изображениями. ответ — 4 строки. (http://school.uralctf.ru/static/quest/wallpaper.bmp )
КраткоBMP32 отличается от 24 наличием альфа-канала. Не все редакторы или просмотрщики его видят, но он есть. Вытаскиваем альфу, считываем qr-коды, вводим ответ.
- F. Выдаётся картинка и запароленный архив. В архиве ответ. Пароль надо выцепить из картинки. Решение не даю.
Картинка school.uralctf.ru/static/quest/Question.jpg
Архив: school.uralctf.ru/static/quest/whosaidthat.zip
- G. Выдаётся картинка и просьба — сказать, кто тут изображён или хотя бы, где это. school.uralctf.ru/static/quest/bro.jpg
КомментарийДумали, что это самый простой таск будет. Но его долго не могли решить....
- H. Выдаётся ссылка на pop3 сервер. Известно, что ящик зарегистрирован на владельца севера, а пароль — его телефон. Какое слово пропущено в письме?
КраткоВладельца можно посмотреть в WHOIS. Скачиваем письмо — там pdf. Вот письмо: school.uralctf.ru/static/quest/message.txt
- I. Снова ssh. У нас есть лог входов и выполнявшихся команд за период с 1941 года по 2013. Известно, что когда нас похакали, время на сервере остановилось. Укажите имя пользователя, который это сделал.
Комментарийdate показывает: Fri Aug 29 02:14:00 GMT-5 1997. Открываем лог, ищем, отвечаем. Тривиальнейше.
- J. Есть файл с паролями: school.uralctf.ru/static/quest/passwords.docx. Мы знаем, что правильный пароль вида 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);
}
И ещё одно наблюдение, если вы знаете как решать А
интересный факт:
Работает до 20 раз дольше, чем
Вероятно, find в первом случае сначала строит список, а во втором — отдает результат по мере поступления.
find enter -type f -exec cat | less
Работает до 20 раз дольше, чем
find enter -type f -print | xargs cat | less
Вероятно, find в первом случае сначала строит список, а во втором — отдает результат по мере поступления.
По окончанию соревнования школьники были очень довольны. Разработчики тоже.
По результатам оказалось два первых места — решивших по 7 задач из 10.
Нерешёнными задачами остались D и E.
Ждём желающих на следующий год!
В разработке участвовала команда ХакерДом, при организационной поддержке компании СКБ Контур.