GreenMine
Описание
Полностью переработанное идейное продолжение Pentest Collaboration Framework, основная задача которого - агрегация результатов, полученных при исследованиях безопасности.
Языки
- JavaScript93,7%
- Python3,7%
- HTML1,9%
- CSS0,7%
GreenMine
Это полностью переработанный проект известного Pentest Collaboration Framework, созданный как отдельный проект для исправления множества архитектурных недочётов и ошибок оригинального проекта, с сохранением основных идей.
Основные преимущества
-
Полностью переписанная система миграции - теперь внесение изменений в базу данных осуществляется через SQLAlchemy, что позволяет как автоматически перестраивать базу данных при обновлении, так и избежать большинства ошибок оригинала - когда ни одно ошибочно вгесённое значение нельзя было исправить. Кроме того, доработки и обновления должны стать куда проще;
-
Добавлена и доработана вкладка задач - разработана по примеру большинства приложений для управления проектами;
-
Для большинства объектов добавлены поля "Описание", куда через WYSIWYG-редактор можно вносить дополнительные данные;
-
Для объектов добавлены примечания, куда можно сохранять процесс своей работы в текстовом виде;
-
Добавлена история изменения для большинства объектов - теперь все изменения для большинства объектов логируются и отображаются в отдельной вкладке;
-
Заменена стандартная таблица отображения списка объектов (служб, хостов, проблем и т.д.) на ajax-таблицу, подтягивающую данные для отображения на странице с бек-энда динамически. Это позволит решить проблему как загрузки всей таблицы на страницу и неоправданного расхода памяти (иногда страницы и вообще не грузились), так и проблему отображения длинных полей - для паролей поле "хэш" не заполнялось именно потому, что в противном случае остальные пароли уезжали за пределы страницы;
-
Мелкая доработка - теперь при внесении хэша к списку скомпрометированных учётных записей GreenMine сам предлагает его тип. Кроме того, при выборе типа хэша GreenMine предлагает его HashCat и John-режимы;
-
Для проекта по аналогии с системами управления введены роли пользователей, а также возможности настроить разрешения на действия для соответствующих ролей (например, для наблюдателей - установить возможность только просматривать объекты, но не редактировать их). Введено понятие "администратора" - это человек, обладающий всеми возможными ролями на проекте, и которому доступны все действия (а также доступ к панели администрирования). Также есть лидер проекта - ему доступны все действия, но только на своём проекте.
-
Добавлена панель администратора, на которой можно добавить объекты перечисления (также называемые "Справочниками"), просмотреть список всех файлов, удалить какие-то файлы, добавить шаблоны отчётов/задач/проблем и т.д;
-
Вследствие изменения системы миграции переделаны системы отчётов - теперь каждый шаблон отчётов получает переменную "project", представляющую из себя объект типа "Project", внутри которого и находятся все необходиме данные для создания отчёта;
-
Добавлена поддержка мультиязычности. Приложение переведено на русский и английские языки;
-
Заметки и редактирование заметок переведены на веб-сокеты - это позволяет избежать проблемы с "Несохраняющимися" заметками;
-
Для хостов добавлены поля "MAC-адрес" (с автоматическим определением производителя по MAC-адресу), "Тип устройства", "Производитель устройства", "Модель устройства";
-
Для сервисов добавлено поле "Скриншот веб-интерфейса" - это должно значительно ускорить этап инвентаризации в организации. Кроме того, добавлено поле "техническая информация", которую заполняет импорт из Nmap своими данными из скриптов;
-
Утилиты для экспорта убраны - теперь экспорт можно делать прямо на странице списка всех объектов. Кроме того, доработана фильтрация - теперь фильтрацию можно производить как по всем полям одновременно, так и по каждому полю индивидуально;
-
Убраны почти все утилиты по импорту из других систем (осталась только самая основная - импорт из Nmap/Masscan, причём функционал частично переделан для добавления информации из новых полей.) - вследствие полной переработки общей концепции данных утилит. Теперь они представляют из себя бэкграунд-задачи, что должно решить проблему "Зависшего" веб-интерфейса для пользователей при попытке импорта большого файла. Кроме того, добавлена утилита "Инвентаризатор" - она позволяет указать список портов для сканирования, и сделать их скриншоты веб-интерфейсов (как по http, так и по https);
-
Импорт из Nmap теперь может читать даже файлы незаконченных сканов - если файл невозможно прочитать, он пытается его дописать и прочитать.
-
Сообщения чата - теперь на веб-сокетах, и, что самое главное - они работают!
-
Мелкие правки интерфейса - добавлены аватары пользователей, уведомления (идут через веб-сокеты), возможность выбора темы (цветового оформления), автоматическое заполнение БД изначальными значениями, минификация трафика;
-
Тип хэширования для сохранения паролей - Streebog512;
-
Доработано логирование - теперь можно вести отдельный лог действий пользователя, а не только стандартный лог Flask.
-
Добавлена Content Security Policy, что увеличивает безопасность приложения;
-
Этап инвентаризации сервисов теперь проводится в том числе и через отдельную вкладку в веб-интерфейсе, что позволяет проводить его быстрее;
-
Доработаны диаграммы состояния - вынесены на отдельную страницу в проекте. Сейчас слегка более информативны, чем в оригинальном проекте;
-
Добавлен функционал координации действий с отделом ИБ организации через создание событий исследования и событий обнаружения;
-
Добавлен функционал заводских учётных данных - пока что как просто вкладка модулей автоматизации, в дальнейшем распространится и на карточки объекта с возможностью проверки;
-
Добавлены команды - это объекты, позволяющие ускорять создание проектов и добавление новых ролей на проект;
-
Добавлены утилиты для быстрой проверки RDP на отсутствие NLA, модуль для автоматического получения хэшей из IPMI;
-
Реализован функционал карусели проблем, что позволит ускорить создание визуального отчёта о проделанной работе;
-
Добавлена поддержка аутентификации на прокси сервере, что позволит не хранить и не запоминать пароли в случае использования, например, mTLS;
-
Настроена интеграция с MetaSploit Framework, что позволит автоматизировать процессы атаки;
-
Добавлена возможность создания пользовательских блоков кода - хуков.
Что не реализовано из исходного проекта, что планируется реализовать
По текущим доработкам:
-
Добавить WebDAV - для упрощения хранения файлов в проекте. Кроме того, необходимо отключить правую кнопку мыши на файлах - из-за поведения Chrome/Firefox они отображаются некорректно;
-
Доработать безопасность - эндпоинт для CSP-отчётов;
Установка зависимостей
Deb-системы
- Google Chrome: Для начала необходимо скачать пакеты зависимостей:
Далее необходимо добавить репозитории и ключи для подписи:
Теперь обновляем кэш пакетов и устанавливаем Google Chrome:
- Nmap:
Настройка параметров приложения
При создании нового приложения (после клонирования проекта) необходимо для начала отредактировать файл config.py, где указать свои предпочитаемые настройки, или же передать их через следующие переменные окружения:
- указывает на секретный ключ приложения, которым будут шифроваться Cookie-файлы. Желательно указать, поскольку без этого Cookie-файлы не будут валидны между стартом/остановкой приложения;SECRET_KEY- путь до базы данных. Задаётся какSQLALCHEMY_DATABASE_URI. Например, для использования sqlite значение будет указано какТип БД:///URI;sqlite:////opt/test_database.db- атрибуты объектов, которые не будут возвращаться или изменяться при REST-запросах. По умолчанию:REST_FORBIDDEN_ATTRIBUTES;User.password_hash,User.token,User.token_expiration- время жизни токена для REST-запросов. По умолчанию - 1 год;TOKEN_EXPIRATION- адрес БД, выступающей в качестве брокера задач Celery. Желательно использовать Redis. Задаётся в виде:CELERY_BROKER_URL. Помимо этого, можно указать протокол Redis Over TLS:redis://username:password@localhost:6379/0;rediss://username:password@localhost:6379/0?ssl_cert_reqs=required- адрес БД, в которую Celery worker'ы будут складывать свои результаты. Задаётся так же, как иCELERY_RESULT_BACKEND;CELERY_BROKER_URL- указывает, игнорировать ли результаты выполнения задач или нет. Задаётся в видеCELERY_TASK_IGNORE_RESULTилиTrue;False- указывает на количество worker'ов, которые будут автоматически запущены вместе с приложением. По умолчанию - 1. Для отключения запуска worker'ов необходимо установить этот параметр в 0. Параметр работает только в Debug-режиме;CELERY_WORKERS_COUNT- количество потоков, приходящееся на каждого рабочего Celery. По умолчанию - 4. Параметр работает только в Debug-режиме;CELERY_WORKERS_CONCURRENCY_COUNT- язык, который будет использоваться для приложения при инициации базы данных. По умолчанию -DEFAULT_LANGUAGE;ru- будет ли работать Content Security Policy;CSP_ENABLED- количество элементов пагинации для плагина Select2 (в форму селекта данные загружаются динамически). По умолчанию - 30;PAGINATION_ELEMENTS_COUNT_SELECT2- будут ли логироваться действия пользователей на STDOUT. По умолчанию -USER_ACTION_LOGGING_IN_STDOUT;True- файл, в который будут дополнительно сохраняться действия пользователей. По умолчанию (для Production-конфига) этот файл отсутствуетUSER_ACTION_LOGGING_FILE- будут ли писаться логи Flask на STDOUT. По умолчанию - True;FLASK_LOGGING_ON_STDOUT- файл, в который будут дополнительно сохраняться логи Flask. По умолчанию - отсутствует;FLASK_LOGGING_FILE- файл, в который будут сохраняться ошибки приложения (ошибка 500). По умолчанию -ERROR_LOGGING_FILE;/logs/error.log- адрес хоста, на котором запущен прослушиватель MetaSploit (обычно черезMETASPLOIT_HOST);msfrpcd -P <password> -p 55553- порт, на котором запущен прослушиватель MetaSploit;METASPLOIT_PORT- пароль для доступа к прослушивателю MetaSploit.METASPLOIT_PASSWORD
Кроме того, необходимо передавать аргумент , устанавливая его в значение , поскольку по умолчанию для целей разработки используется Development-сервер.
Дополнительно можно передать аргумент , указывающий на порт, на котором будет слушать приложение. По умолчанию - 5000.
Основные команды
После установки параметров приложения необходимо проинициализировать базу данных приложения. Для этого используются следующие команды:
- инициирует новую базу данных (даже если она не существовала ранее, как, например, с sqlite). Этот этап можно пропустить - база данных может быть создана на этапе внесения изменений;FLASK_APP=GreenMine flask greenmine db-init- создаёт новые скрипты миграции для записи данных в базу данных. Этот этап можно пропустить - миграции будут идти вместе с приложением;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>
Дополнительно, если были введены новые таблицы с данными по умолчанию, можно использовать команду:
Которая загрузит в пустые таблицы значения из файла .
А для пересоздания таблицы и заполнения её значениями из файла можно использовать команду:
Значение задаётся в том виде, в котором таблица описана в файле .
Для обновления переводов приложения предусмотрены 2 команды:
- извлекает все переводы из исходных файлов и помещает в файл messages.pot, после чего обновляет po-файлы в директории app/translations;FLASK_APP=GreenMine flask translate update- после того, как исходные po-файлы переводов созданы, данная команда компилирует их в файл .mo. Имеет опциюFLASK_APP=GreenMine flask translate compile, которая позволяет включить в конечный скомпилированный файл перевода так же переводы, помеченные как-f.fuzzy
Автоматическое исправление ошибок
GreenMine перед самым первым запросом может проводить проверку на наличие минимальных значений в БД, и в случае отсутствия этих значений - автоматически их туда заносить. По умолчанию проводятся следующие проверки:
-
Существует хотя бы один пользователь, который является администратором. Если его не существует - то либо создаётся новый пользователь (Логин/пароль - admin/admin), либо существующему пользователю с логином admin выставляется флаг, указывающий на то, что он является администратором;
-
Существует Роль на проекте, называемая "Анонимная". Если не существует - она автоматически добавляется в БД;
-
В БД присутствует один экземпляр глобальных настроек;
-
В БД присутствует язык приложения, имеющий слаг "auto" - т.е. язык приложения будет определяться на основе предпочтений пользователя.
Логины пользователей
Логины пользователей должны начинаться с буквы, и должны содержать символы алфавита, цифры, символы "-" и "_". Это сделано для того, чтобы их можно было упоминать через CKEditor.
Заводские учётные данные для приложения - и .
Запуск в дебаг-режиме
Для ознакомления с проектом без сборки Docker-контейнера его можно запустить в дебаг-режиме следующим образом:
Для того, чтобы в дебаг-режиме работали бэкграунд-задачи, в отдельном окне необходимо запустить Redis и Celery Worker следующим образом:
Далее мы можем
Запуск через Docker
Для запуска приложения через Docker необходимо собрать контейнер:
Далее контейнер со всеми зависимостями можно запустить через :
После завершения процесса инициализации (когда в БД вносятся начальные значения) проект будет доступен на порту 5000.
Хуки
Хуки - это блоки пользовательского кода, которые вызываются в ответ на соответствующие события в приложении: создание проекта, создание задачи, изменение задачи, добавление комментария и т.п.
В общем случае, хуки получают следующие переменные, с которыми они могут взаимодействовать:
- база данных;db- объект, над которым произошло изменение/добавление/удаление и т.п.;this- текущая сессия;session- текущее приложение.app