/ctf-exploit-farm

Asynchronous exploit farm for attack-defence CTF

Primary LanguagePythonMIT LicenseMIT

Это «ферма» для Attack-Defence CTF-соревнований. Подробнее о соревнованиях можно прочитать здесь.

Ферма занимается тем, что регулярно запускает написанные эксплойты на все команды, парсит результат работы, достаёт оттуда флаги и отправляет их в проверяющую систему. Главное отличие этой фермы от остальных — её асинхронность и умение работать в одном потоке даже при большом количество команд. Кроме того, ферму можно легко расширять: добавлять поддержку новых проверяющих систем, систем хранения флагов и так далее.

Ферма написана на третьем питоне, поддерживает версии 3.6 и выше.

Запуск

  1. Установите зависимости: pip install -Ur requirements.txt
  2. Настройте всё необходимое в файле settings.py. Список команд положите в teams.csv (или другой файл, указанный в настройках)
  3. Запустите ферму: ./farm.py в линуксе или python farm.py в винде

Как написать свой эксплойт

По умолчанию эксплойты лежат в папке exploits/. Ферма автоматически заберёт оттуда эксплойт, если вы оформите его как класс, унаследованный от farm.exploits.AbstractExploit. Примеры эксплойтов лежат в папке exploits.examples/.

Все эксплойты должны быть асинхронными

Это значит, что вы должны использовать асинхронные библиотеки для сетевых запросов: aiohttp для HTTP-запросов, asyncio для TCP и так далее. Нельзя использовать синхронные библиотеки (например, requests или pwn).

Не выводите ничего на экран

Скорее всего этот вывод потеряется в бесконечности терминала. Если нужно что-нибудь вывести во время работы эксплойта, используйте методы у self.logger: например, self.logger.info(message), self.logger.error(message, [exception]) и другие.

Сообщения будут выведены на экран и сохранены в логе (по умолчанию в папке logs/).

Давайте классам-экслойтам понятные имена

По именам этих классам эксплойты различаются в логах. Файлы с логами тоже называются по-разному в зависимости от названий классов.

Что должен возвращать эксплойт

Ваша единственная задача при написании эксплойта — реализовать асинхронный метод attack(hostname). Результатом выполнения этого метода должна быть строка (str или bytes) или массив строк.

Возвращайте всё, что угодно. Не запрещается возвращать много лишней информации. Главное, чтобы внутри него были флаги. Флаги будут находиться по регулярному выражению, задающемуся в настройках (FLAG_FORMAT в settings.py).

Как отладить свой эксплойт

Положите файл с эксплойтом в корень папки с фермой, добавьте в него следующие строки:

if __name__ == '__main__':
    from farm.farms import Farm
    Farm.debug_exploit(ExploitName(), '127.0.0.1')

и запустите.

Вместо '127.0.0.1' укажите адрес сервера, на котором надо тестировать эксплойт. Вместо ExploitName() — имя вашего класса с эксплойтом.