Новости Сервисы и чекеры. Курс молодого бойца

dmitrisimus
, 04 June 2008

В связи с тем, что большое количество человек изъявило желание написать сервис к одной из тренировок, даю краткую инструкцию о том, как должен выглядеть чекер.

Всё описанное здесь применимо к проверяющей системе gameserver, написанному Lexi Pimenidis (http://www.nets.rwth-aachen.de/~lexi/) и применяющемуся на соревнованиях CIPHER (http://www.cipher-ctf.org/cipher4.php?edit=0&include=cipher4.php).

Сначала повторю слова, которые каждый уже не раз слышал ;)

1. Каждой команде перед игрой выдаётся образ виртуальной машины. Как правило, эмулятор для запуска этой виртуальной машины - VMWare. На виртуальной машине установлена какая-либо сетевая ОС с набором сервисов, подготовленных жюри.

2. Сервис - это приложение, взаимодействующее с пользователем (клиентом) посредством компьютерных сетей. Сервисы для игры CTF содержат намеренно оставленные жюри (типовые) уязвимости.

3. Флаги. Одной из отличительных особенностей сервисов является (предусмотренная жюри) возможность оставлять т.н. флаги (строки определённого, заранее оговоренного вида). Задачи участников (как помните ;)): исследовав сервис, модифицировать его таким образом, чтобы соперники не могли получить флаги, оставленные жюри; используя найденные уязвимости пытаться получить флаги с сервисов других команд.

4. Проверки жюри. Очевидно, самый простой способ уберечь флаги от соперника - удалять их ;) (или не запускать сервис). Если игрокам было бы позволено делать это безнаказанно, то игра была бы скучной и неинтересной. Поэтому жюри периодически производит проверку работоспособности сервисов. Оставляя флаги на сервисах команд, жюри ассоциирует с каждым из них другую строку - идентификатор флага, причём таким образом, чтобы (используя функциональность сервиса) зная идентификатор, можно было бы запросить у сервиса флаг, соответствующий этому идентификатору. Если проверка жюри заключает, что команда жульничает (или просто плохо администрирует сервис ;)), то такой команде присваивается 0 очков, в противном случае - X очков (где X может отличаться от игре к игре). Таким образом у команд появляется стимул держать сервис в работоспособном состоянии ;)

5. Автоматизированная система проверки сервисов. Если бы жюри пришлось проверять доступность флагов вручную, то оно от отчаяния перестало бы проводить соревнования ;) Поэтому была разработана автоматизированная система проверки работоспособности (и флагодержания) сервисов (и не одна!). Вообще говоря, на такой системе лежит куча обязанностей: нужно переодически производить проверку, на основе собранных данных начислять очки командам, заносить изменения в базу данных, а потом ещё всё это отобразить на веб-страничке. Ах, да, ещё такая система должна принимать захваченные флаги от комманд, отслеживать состояние отправленных флагов (чтобы не было дубликатов, чтобы появлялась "испорченность" флагов от времени и пр.).

В тот момент, когда игровой сервер хочет проверить состояние сервиса X команды Y, он производит следующие действия:

1. Смотрит в базу данных. Находит там IP-адрес (виртуального) сервера команды Y.

2. Ещё раз смотрит в базу данных. Находит там один из оставленных ранее у команды Y флагов (и соответствующий идентификатор).

3. Третий раз смотри в базу данных. Находит там запись о сервисе X. Точнее, где лежит т.н. чекер - специальная программка для проверки сервиса.

4. Запускает чекер следующей командой: CHECKER ACTION IP ID FLAG, где CHECKER - имя программы-чекера, IP - адрес сервера команды (на нём запущен проверяемый сервис), ID - идентификатор флага, FLAG - собственно флаг. ACTION - это одна из двух строк store или retrieve.

5. В зависимости от того, с каким кодом возврата завершился чекер, система делает выводы о работоспособности сервиса.

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

Lexi Pimenidis выпустил свой gameserver под GPL, что даёт возможность его поисследовать и поиспользовать ;) В архиве находится файл DOCUMENTATION, который раскрывает особенности работы проверяющей системы. Нам наиболее интересен раздел 5 (в котором указывается, что нужно сделать, чтобы начать игру), а также (возможно ;)) 4.1 (в котором описываются правила начисления очков).

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

Так вот, чекер - это консольная программа, написанная на любом языке программирования. В качестве параметров командной строки она получает ACTION, IP, ID и FLAG. Если ACTION - это store, то чекер сохраняет флаг FLAG с идентификатором ID на сервере с адресом IP (на сервисе, для которого, собственно, написан ;)). Если же ACTION - это retrieve, то чекер проверяет, а доступен ли флаг FLAG с идентификатором ID на сервере с адресом ID (в доме, кторый построил Джек ;)).

В зависимости от результатов, чекер должен установить код возврата (return из функции main или exit() - на языке C; sys.exit() на Python; System.exit() на Java, exit на Bash и т.д.), равный:

0 - если сервис не доступен в принципе (сеть упала, сервис упал); признаки тому: невозможно установить соединение с сервисом, невозможно послать ему данные; невозможно получить от него данные и пр.;

1 - если сервис находится в состоянии corrupted, т.е. позволяет соединиться, работает по установленному протоколу, но напрочь не помнит, какой флаг соответствует переданному ему ID;

2 - если сервис функционирует правильно;

3 - если в чекере (или игровом сервере) ошибка.

Как пишет Lexi, чекер ДОЛЖЕН возвращать 3, если:

1. ему передано не 4 параметра;

2. первый параметр - не store/retrieve;

3. второй параметр - не IP.

Дополнительные комментарии по поводу того, какие символы могут содержать флаг/идентификатор - см. документацию.

Собственно, с вас - если захотите написать сервис - собственно сервис и чекер. Настоятельно рекомендую проверить работоспособность получившейся у вас системы. Исходный код gameserver'а доступен с домашней страницы Lexi: http://www.nets.rwth-aachen.de/~lexi/gameserver.php

Прямая ссылка: http://www.nets.rwth-aachen.de/~lexi/download/gameserver.tgz

Кстати, если я правильно понял, на CIPHER не будет блендера. То есть, жюри не будет прятать свой трафик от команд. Поэтому фильтрация трафика (собственно, как и на наших тренировках, пока ;)) запрещена. За продробностями: http://www.cipher-ctf.org/CaptureTheFlag.php

Также в файлы группы выкладываю чекер для сервиса harder с одной из тренировок. Если помните, сервис был прост, насколько этом можно ;) Отправленный мною чекер можно взять за основу для написания своих.

Удачи в написании сервисов (и чекеров)!

С наилучшими, Д.А. Стефанцов!