GreenMine

0

Описание

Полностью переработанное идейное продолжение Pentest Collaboration Framework, основная задача которого - агрегация результатов, полученных при исследованиях безопасности.

Языки

  • JavaScript93,7%
  • Python3,7%
  • HTML1,9%
  • CSS0,7%
месяц назад
8 месяцев назад
месяц назад
месяц назад
README.md

GreenMine

Это полностью переработанный проект известного Pentest Collaboration Framework, созданный как отдельный проект для исправления множества архитектурных недочётов и ошибок оригинального проекта, с сохранением основных идей.

Основные преимущества

  1. Полностью переписанная система миграции - теперь внесение изменений в базу данных осуществляется через SQLAlchemy, что позволяет как автоматически перестраивать базу данных при обновлении, так и избежать большинства ошибок оригинала - когда ни одно ошибочно вгесённое значение нельзя было исправить. Кроме того, доработки и обновления должны стать куда проще;

  2. Добавлена и доработана вкладка задач - разработана по примеру большинства приложений для управления проектами;

  3. Для большинства объектов добавлены поля "Описание", куда через WYSIWYG-редактор можно вносить дополнительные данные;

  4. Для объектов добавлены примечания, куда можно сохранять процесс своей работы в текстовом виде;

  5. Добавлена история изменения для большинства объектов - теперь все изменения для большинства объектов логируются и отображаются в отдельной вкладке;

  6. Заменена стандартная таблица отображения списка объектов (служб, хостов, проблем и т.д.) на ajax-таблицу, подтягивающую данные для отображения на странице с бек-энда динамически. Это позволит решить проблему как загрузки всей таблицы на страницу и неоправданного расхода памяти (иногда страницы и вообще не грузились), так и проблему отображения длинных полей - для паролей поле "хэш" не заполнялось именно потому, что в противном случае остальные пароли уезжали за пределы страницы;

  7. Мелкая доработка - теперь при внесении хэша к списку скомпрометированных учётных записей GreenMine сам предлагает его тип. Кроме того, при выборе типа хэша GreenMine предлагает его HashCat и John-режимы;

  8. Для проекта по аналогии с системами управления введены роли пользователей, а также возможности настроить разрешения на действия для соответствующих ролей (например, для наблюдателей - установить возможность только просматривать объекты, но не редактировать их). Введено понятие "администратора" - это человек, обладающий всеми возможными ролями на проекте, и которому доступны все действия (а также доступ к панели администрирования). Также есть лидер проекта - ему доступны все действия, но только на своём проекте.

  9. Добавлена панель администратора, на которой можно добавить объекты перечисления (также называемые "Справочниками"), просмотреть список всех файлов, удалить какие-то файлы, добавить шаблоны отчётов/задач/проблем и т.д;

  10. Вследствие изменения системы миграции переделаны системы отчётов - теперь каждый шаблон отчётов получает переменную "project", представляющую из себя объект типа "Project", внутри которого и находятся все необходиме данные для создания отчёта;

  11. Добавлена поддержка мультиязычности. Приложение переведено на русский и английские языки;

  12. Заметки и редактирование заметок переведены на веб-сокеты - это позволяет избежать проблемы с "Несохраняющимися" заметками;

  13. Для хостов добавлены поля "MAC-адрес" (с автоматическим определением производителя по MAC-адресу), "Тип устройства", "Производитель устройства", "Модель устройства";

  14. Для сервисов добавлено поле "Скриншот веб-интерфейса" - это должно значительно ускорить этап инвентаризации в организации. Кроме того, добавлено поле "техническая информация", которую заполняет импорт из Nmap своими данными из скриптов;

  15. Утилиты для экспорта убраны - теперь экспорт можно делать прямо на странице списка всех объектов. Кроме того, доработана фильтрация - теперь фильтрацию можно производить как по всем полям одновременно, так и по каждому полю индивидуально;

  16. Убраны почти все утилиты по импорту из других систем (осталась только самая основная - импорт из Nmap/Masscan, причём функционал частично переделан для добавления информации из новых полей.) - вследствие полной переработки общей концепции данных утилит. Теперь они представляют из себя бэкграунд-задачи, что должно решить проблему "Зависшего" веб-интерфейса для пользователей при попытке импорта большого файла. Кроме того, добавлена утилита "Инвентаризатор" - она позволяет указать список портов для сканирования, и сделать их скриншоты веб-интерфейсов (как по http, так и по https);

  17. Импорт из Nmap теперь может читать даже файлы незаконченных сканов - если файл невозможно прочитать, он пытается его дописать и прочитать.

  18. Сообщения чата - теперь на веб-сокетах, и, что самое главное - они работают!

  19. Мелкие правки интерфейса - добавлены аватары пользователей, уведомления (идут через веб-сокеты), возможность выбора темы (цветового оформления), автоматическое заполнение БД изначальными значениями, минификация трафика;

  20. Тип хэширования для сохранения паролей - Streebog512;

  21. Доработано логирование - теперь можно вести отдельный лог действий пользователя, а не только стандартный лог Flask.

  22. Добавлена Content Security Policy, что увеличивает безопасность приложения;

  23. Этап инвентаризации сервисов теперь проводится в том числе и через отдельную вкладку в веб-интерфейсе, что позволяет проводить его быстрее;

  24. Доработаны диаграммы состояния - вынесены на отдельную страницу в проекте. Сейчас слегка более информативны, чем в оригинальном проекте;

  25. Добавлен функционал координации действий с отделом ИБ организации через создание событий исследования и событий обнаружения;

  26. Добавлен функционал заводских учётных данных - пока что как просто вкладка модулей автоматизации, в дальнейшем распространится и на карточки объекта с возможностью проверки;

  27. Добавлены команды - это объекты, позволяющие ускорять создание проектов и добавление новых ролей на проект;

  28. Добавлены утилиты для быстрой проверки RDP на отсутствие NLA, модуль для автоматического получения хэшей из IPMI;

  29. Реализован функционал карусели проблем, что позволит ускорить создание визуального отчёта о проделанной работе;

  30. Добавлена поддержка аутентификации на прокси сервере, что позволит не хранить и не запоминать пароли в случае использования, например, mTLS;

  31. Настроена интеграция с MetaSploit Framework, что позволит автоматизировать процессы атаки;

  32. Добавлена возможность создания пользовательских блоков кода - хуков.

Что не реализовано из исходного проекта, что планируется реализовать

По текущим доработкам:

  • Добавить WebDAV - для упрощения хранения файлов в проекте. Кроме того, необходимо отключить правую кнопку мыши на файлах - из-за поведения Chrome/Firefox они отображаются некорректно;

  • Доработать безопасность - эндпоинт для CSP-отчётов;

Установка зависимостей

Deb-системы

  1. Google Chrome: Для начала необходимо скачать пакеты зависимостей:

Далее необходимо добавить репозитории и ключи для подписи:

Теперь обновляем кэш пакетов и устанавливаем Google Chrome:

  1. Nmap:

Настройка параметров приложения

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

  • SECRET_KEY
    - указывает на секретный ключ приложения, которым будут шифроваться Cookie-файлы. Желательно указать, поскольку без этого Cookie-файлы не будут валидны между стартом/остановкой приложения;
  • SQLALCHEMY_DATABASE_URI
    - путь до базы данных. Задаётся как
    Тип БД:///URI
    . Например, для использования sqlite значение будет указано как
    sqlite:////opt/test_database.db
    ;
  • REST_FORBIDDEN_ATTRIBUTES
    - атрибуты объектов, которые не будут возвращаться или изменяться при REST-запросах. По умолчанию:
    User.password_hash,User.token,User.token_expiration
    ;
  • TOKEN_EXPIRATION
    - время жизни токена для REST-запросов. По умолчанию - 1 год;
  • CELERY_BROKER_URL
    - адрес БД, выступающей в качестве брокера задач Celery. Желательно использовать Redis. Задаётся в виде:
    redis://username:password@localhost:6379/0
    . Помимо этого, можно указать протокол Redis Over TLS:
    rediss://username:password@localhost:6379/0?ssl_cert_reqs=required
    ;
  • CELERY_RESULT_BACKEND
    - адрес БД, в которую Celery worker'ы будут складывать свои результаты. Задаётся так же, как и
    CELERY_BROKER_URL
    ;
  • CELERY_TASK_IGNORE_RESULT
    - указывает, игнорировать ли результаты выполнения задач или нет. Задаётся в виде
    True
    или
    False
    ;
  • CELERY_WORKERS_COUNT
    - указывает на количество worker'ов, которые будут автоматически запущены вместе с приложением. По умолчанию - 1. Для отключения запуска worker'ов необходимо установить этот параметр в 0. Параметр работает только в Debug-режиме;
  • CELERY_WORKERS_CONCURRENCY_COUNT
    - количество потоков, приходящееся на каждого рабочего Celery. По умолчанию - 4. Параметр работает только в Debug-режиме;
  • DEFAULT_LANGUAGE
    - язык, который будет использоваться для приложения при инициации базы данных. По умолчанию -
    ru
    ;
  • CSP_ENABLED
    - будет ли работать Content Security Policy;
  • PAGINATION_ELEMENTS_COUNT_SELECT2
    - количество элементов пагинации для плагина Select2 (в форму селекта данные загружаются динамически). По умолчанию - 30;
  • USER_ACTION_LOGGING_IN_STDOUT
    - будут ли логироваться действия пользователей на STDOUT. По умолчанию -
    True
    ;
  • USER_ACTION_LOGGING_FILE
    - файл, в который будут дополнительно сохраняться действия пользователей. По умолчанию (для Production-конфига) этот файл отсутствует
  • FLASK_LOGGING_ON_STDOUT
    - будут ли писаться логи Flask на STDOUT. По умолчанию - True;
  • FLASK_LOGGING_FILE
    - файл, в который будут дополнительно сохраняться логи Flask. По умолчанию - отсутствует;
  • ERROR_LOGGING_FILE
    - файл, в который будут сохраняться ошибки приложения (ошибка 500). По умолчанию -
    /logs/error.log
    ;
  • METASPLOIT_HOST
    - адрес хоста, на котором запущен прослушиватель MetaSploit (обычно через
    msfrpcd -P <password> -p 55553
    );
  • METASPLOIT_PORT
    - порт, на котором запущен прослушиватель MetaSploit;
  • METASPLOIT_PASSWORD
    - пароль для доступа к прослушивателю MetaSploit.

Кроме того, необходимо передавать аргумент

ENVIRONMENT
, устанавливая его в значение
PRODUCTION
, поскольку по умолчанию для целей разработки используется Development-сервер.

Дополнительно можно передать аргумент

APP_PORT
, указывающий на порт, на котором будет слушать приложение. По умолчанию - 5000.

Основные команды

После установки параметров приложения необходимо проинициализировать базу данных приложения. Для этого используются следующие команды:

  • FLASK_APP=GreenMine flask greenmine db-init
    - инициирует новую базу данных (даже если она не существовала ранее, как, например, с sqlite). Этот этап можно пропустить - база данных может быть создана на этапе внесения изменений;
  • FLASK_APP=GreenMine flask db migrate
    - создаёт новые скрипты миграции для записи данных в базу данных. Этот этап можно пропустить - миграции будут идти вместе с приложением;
  • FLASK_APP=GreenMine flask db upgrade
    - вносит изменения в базу данных;
  • FLASK_APP=GreenMine flask greenmine load-default-database
    - загружает данные по умолчанию в базу данных. Если данные по умолчанию не были внесены на этапе обновления - они будут внесены при первом запуске приложения;

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

  • FLASK_APP=GreenMine flask db migrate
    - создаёт новые скрипты миграции;
  • FLASK_APP=GreenMine flask db upgrade
    - вносит изменения в базу данных;
  • FLASK_APP=GreenMine flask greenmine update-database-value
    - заполняет только что созданные таблицы в базе данных значениями из файла
    initial_database_value.yml
    ;

А при пересоздании базы данных:

  • FLASK_APP=GreenMine flask greenmine reset-database
    - полностью пересоздаёт существующую базу данных, заполняя её данными из файла
    initial_database_value.yml
    ;
  • FLASK_APP=GreenMine flask greenmine recreate-table --table <table_name>
    - пересоздаёт указанную таблицу в базе данных (сперва удаляет, потом заново создаёт).

Дополнительно, если были введены новые таблицы с данными по умолчанию, можно использовать команду:

Которая загрузит в пустые таблицы значения из файла

initial_database_value.yml
.

А для пересоздания таблицы и заполнения её значениями из файла

initial_database_value.yml
можно использовать команду:

Значение

<table_name>
задаётся в том виде, в котором таблица описана в файле
default_database_value.yml
.

Для обновления переводов приложения предусмотрены 2 команды:

  • FLASK_APP=GreenMine flask translate update
    - извлекает все переводы из исходных файлов и помещает в файл messages.pot, после чего обновляет po-файлы в директории app/translations;
  • FLASK_APP=GreenMine flask translate compile
    - после того, как исходные po-файлы переводов созданы, данная команда компилирует их в файл .mo. Имеет опцию
    -f
    , которая позволяет включить в конечный скомпилированный файл перевода так же переводы, помеченные как
    fuzzy
    .

Автоматическое исправление ошибок

GreenMine перед самым первым запросом может проводить проверку на наличие минимальных значений в БД, и в случае отсутствия этих значений - автоматически их туда заносить. По умолчанию проводятся следующие проверки:

  • Существует хотя бы один пользователь, который является администратором. Если его не существует - то либо создаётся новый пользователь (Логин/пароль - admin/admin), либо существующему пользователю с логином admin выставляется флаг, указывающий на то, что он является администратором;

  • Существует Роль на проекте, называемая "Анонимная". Если не существует - она автоматически добавляется в БД;

  • В БД присутствует один экземпляр глобальных настроек;

  • В БД присутствует язык приложения, имеющий слаг "auto" - т.е. язык приложения будет определяться на основе предпочтений пользователя.

Логины пользователей

Логины пользователей должны начинаться с буквы, и должны содержать символы алфавита, цифры, символы "-" и "_". Это сделано для того, чтобы их можно было упоминать через CKEditor.

Заводские учётные данные для приложения -

admin/admin
и
worker/worker
.

Запуск в дебаг-режиме

Для ознакомления с проектом без сборки Docker-контейнера его можно запустить в дебаг-режиме следующим образом:

Для того, чтобы в дебаг-режиме работали бэкграунд-задачи, в отдельном окне необходимо запустить Redis и Celery Worker следующим образом:

Далее мы можем

Запуск через Docker

Для запуска приложения через Docker необходимо собрать контейнер:

Далее контейнер со всеми зависимостями можно запустить через

Docker compose
:

После завершения процесса инициализации (когда в БД вносятся начальные значения) проект будет доступен на порту 5000.

Хуки

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

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

  • db
    - база данных;
  • this
    - объект, над которым произошло изменение/добавление/удаление и т.п.;
  • session
    - текущая сессия;
  • app
    - текущее приложение.