Это «ферма» для Attack-Defence CTF-соревнований. Подробнее о соревнованиях можно прочитать здесь.
Ферма занимается тем, что регулярно запускает написанные эксплойты на все команды, парсит результат работы, достаёт оттуда флаги и отправляет их в проверяющую систему. Главное отличие этой фермы от остальных — её асинхронность и умение работать в одном потоке даже при большом количество команд. Кроме того, ферму можно легко расширять: добавлять поддержку новых проверяющих систем, систем хранения флагов и так далее.
Ферма написана на третьем питоне, поддерживает версии 3.6 и выше.
- Установите зависимости:
pip install -Ur requirements.txt
- Настройте всё необходимое в файле
settings.py
. Список команд положите вteams.csv
(или другой файл, указанный в настройках) - Запустите ферму:
./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()
— имя вашего класса
с эксплойтом.