Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Preapre services pages #24

Merged
merged 1 commit into from
Jun 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 162 additions & 0 deletions CONCEPT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
# ctf01d training platform

Платформа для тренировок команд CTF в режиме attack-defence заточенная под журейную систему ctf01d.


Основные функции:
- Каталог сервисов с чекерами
- Список команд
- Автоматическое развертывание игры AD на базе ctf01d в каком либо виртуальном пространстве.

Система должна будет работать в двух режимах:

1. Это как каталог сервисов - публично развернутый архив
2. Это как локальная система для тренировок (которая сможет стянуть сервисы из публичного каталога)

## Технологический стек

- Сервер: golang
- База данных: postgre
- Клинет: фронт на vanila + jquery

## Авторизация и пользователи (общее)

Каждый пользователь имеет такие поля:

- uuid пользователя
- Имя для входа (login) - *должно быть ограничение на символы, англ + цифры + _, так как он будет использвоаться в url, Уникальное и не изменяемое*
- Видимое имя - *То как будет отображается пользовательдля всех, например: Иван Петров*
- Пароль для входа (password) - *есснно в базе храниться хеш*
- Аватар - *Ссылка на аватарку*
- Рейтинг - *Пока просто каеие то абстрактные очки*

Cписок ролей пользователей (надо бы что бы была возможность создавать новые роли при необходимости - место для костылей и прочего):

- user - пользователь, роль по-умолчанию
- moderator - пользователь, который может апрувать часть данных
- admin - администратор

профиль пользователя:

- История по командам, в каких играл и в какой сейчас состоит

### Функции

- Авторизация - *простая по логин/пароль*
- Регистрация - *Закрытая, пользователь вводит свои креты, и только администратор в ручном режиме будет активировать пользователей*
- Создать пользователя - *Администратор может создавать пользователей самостоятельно*
- Удалить пользователя - *Администратор может удалить пользователя навсегда*
- Сброс пароля - *Администратор может установить пароль для любого пользователя*
- Изменить пароль - *Пользователь может изменить свой пароль при использовании предыдущего*
- Обновить аватар - *Пользователь может загрузить свою новую аватарку*
- Удалить аватар - *Пользователь может удалить свою аватарку, либо админ может сбросить у любого пользователя*

*пароль должен именть не менее 6 символов*

## Каталог сервисов

Каждый сервис имеет такие поля:

- uuid сервиса
- Уникальное имя
- Публичное описание - *То есть то которое будут видеть все так что там должна быть только общая информация, например: аналог Инстаграм или чат*
- Приватное описание - *Описание уязвимостей, на какие портах работает, какие технологии применялись*
- Автор - *что бы знать в кого писать и для соблюдения авторских прав*
- Копирайт - *для соблюдения авторских прав*
- Аватарка - *для того чтобы интересенее отображалось в списке*
- Архив с сервисом - *Непосредственно то что будет разворачиваться в уязвимомо образе* (должно быть версионирование файлов на стороне сервера)
- Валидный ли архив с сервисом - *Поле обозначает что прошел ли сервис проверки*
- Архив с чекером - *То что будет использоваться журейной системой* (должно быть версионирование файлов на стороне сервера)
- Валидный ли архив с чекером - *Поле обозначает что прошел ли чекер проверки*
- Публичный ли сервис - *то есть доступный ли он для пользователей*
- Дата создания сервиса - *Указывается пользователем*
- Дата последнего изменения полей - *Автоматичеки со стороны сервера*
- Райтап(ы) - ?
- Валидация - *Прошел ли сервис валидацию*
- Рейтинг сервиса

На текущий момент добавлять/изменять/удалять сервисы может только пользователи с ролью админ.


### Функции

- Добавить сервис - *администратор*
- Изменить сервис - *администратор*
- Установить аватарку - *администратор*
- Удалить аватарку - *администратор*
- Залить архив сервиса - *формально убедиться что в архиве все файлы есть какие надо*
- Залить архив чекера - *формально убедиться что в архиве есть все файлы какие надо*

### Фичи

- Если админов много то возможно нужно реализовать защиту от перезаписи данных путем: клиент отправляет данные как было и как стало и сервер уже проверяет что если поля соответсвуют то обновляет, если же изменилось какое либо поле то отправить ответ какое поле изменилось клиенту.
- При загрузки zip для сервиса необходимо проверить корректно ли работает чекер (проверить все коды и состояния)

## Команды

Поля:

- uuid команды
- Имя команды
- Аватарка
- Университет
- Описание
- Ссылка на оффициальный сайт
- Текущий капитан

Отдельной таблицей по отношению к пользователям (многие ко многим? - да владеть двумя командами это возможно):
- команда uuid - *уникальный идентификатор*
- Роль в команде - (четыре захаркоженные роли: owner, captain, vice-captain, player)
- Название роли в команде - *роли придуманные капитанами и замами команд*
- публичный комментарий - *виден всем*
- приватный коментарий - *виден только владельцу капитану и зам капитана*

Отдельной таблицей:
- Запрос на создание команды (имя, университет, описание) - *Принимает заявку администратор*

Также нужна таблица историческая, по изменению состава команды + изменению ролей в команде:

Пишем туда но ничего не удаляем.

### Функции

- Запрос создания команды - *От пользователя*
- Подтверждение создания команды - *Администратор*
- Создание команды - *Администратор*
- Удаление команды - *Администратор*
- Редактирование команды - *Администратор либо владелец*
- Добавление участников в команду *Администратор*
- Приглашение в команду - *Владелец команды, капитан или зам капитана*
- Запрос в состав команды - *Пользователь*
- Установка капитана/зам капитана/Участника - *Владелец команды и администратор*
- Установка зам капитана/Участника - *Капитан команды и администратор*
- Установка "Название роли в команде"/"публичный комментарий"/"приватный коментарий" для учатников команды - *Владелец команды и администратор*


### Логика

- Владельцев команды может быть несколько.
- Капитан команды может быть только один.
- Зам капитанов команды может быть несколько (потом можно будет сделать ограничение).
- Участников команды может быть много.
- Владеть можно несколькими командами
- Капитаном можно быть только в одной команде.
- Участвовать можно в нескольких камандах одновременно (Но во время игры надо будет проверять на уникальность списка учатников).


## Игры

Поля:
- Название
- Дата начала
- Дата окончания
- Кто проводит


### TODO

- Создание игр по расписанию (какие сервисы какие команды и когда)
- Список кто с кем и когда
- Когда игру открывают - то опенвпн (или какой то там будет доступ) для соответсвующих команд и пользователей.
- Где находиться scoreboard
- По завершению игры - надо сохранять результат скоребоарда.
5 changes: 5 additions & 0 deletions html/assets/css/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,9 @@ body,html{

.btn-menu-top-left {
margin-left: 10px;
}

.services-card {
display: inline-block;
margin: 10px;
}
39 changes: 39 additions & 0 deletions html/assets/js/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,42 @@ window.ctf01d_tp_api.auth_session = function (auth_data) {
data: JSON.stringify(auth_data),
});
}

window.ctf01d_tp_api.services_list = function() {
return $.ajax({
url: '/api/services',
method: 'GET',
});
}

window.ctf01d_tp_api.service_create = function(service_data) {
return $.ajax({
url: '/api/services',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify(service_data),
});
}

window.ctf01d_tp_api.service_update = function(service_id, service_data) {
return $.ajax({
url: '/api/services/' + service_id,
method: 'PUT',
contentType: 'application/json',
data: JSON.stringify(service_data),
});
}

window.ctf01d_tp_api.service_delete = function(service_id) {
return $.ajax({
url: '/api/services/' + service_id,
method: 'DELETE',
});
}

window.ctf01d_tp_api.service_info = function(service_id) {
return $.ajax({
url: '/api/services/' + service_id,
method: 'GET',
});
}
Loading
Loading