
Сканер на основе плагинов, помогающий специалистам по безопасности выявлять проблемы в нескольких CMS, в основном Drupal и Silverstripe.
Сканер на основе плагинов, помогающий специалистам по безопасности выявлять проблемы с несколькими CMS.
Использование droopescan для атаки на цели без предварительного взаимного согласия незаконно. Ответственность за соблюдение всех применимых местных, государственных и федеральных законов лежит на конечном пользователе. Разработчики не несут ответственности и не отвечают за любое неправильное использование или ущерб, причиненный этой программой. Обратите внимание, что хотя droopescan выводит наиболее вероятную версию CMS, установленную на удаленном хосте, любое сопоставление номеров версий с уязвимостями должно выполняться пользователем вручную.
Поддерживаемые CMS:
Частичная функциональность для:
computer:~/droopescan$ droopescan scan drupal -u http://example.org/ -t 32
[+] No themes found.
[+] Possible interesting urls found:
Default changelog file - https://www.example.org/CHANGELOG.txt
Default admin - https://www.example.org/user/login
[+] Possible version(s):
7.34
[+] Plugins found:
views https://www.example.org/sites/all/modules/views/
https://www.example.org/sites/all/modules/views/README.txt
https://www.example.org/sites/all/modules/views/LICENSE.txt
token https://www.example.org/sites/all/modules/token/
https://www.example.org/sites/all/modules/token/README.txt
https://www.example.org/sites/all/modules/token/LICENSE.txt
pathauto https://www.example.org/sites/all/modules/pathauto/
https://www.example.org/sites/all/modules/pathauto/README.txt
https://www.example.org/sites/all/modules/pathauto/LICENSE.txt
https://www.example.org/sites/all/modules/pathauto/API.txt
libraries https://www.example.org/sites/all/modules/libraries/
https://www.example.org/sites/all/modules/libraries/CHANGELOG.txt
https://www.example.org/sites/all/modules/libraries/README.txt
https://www.example.org/sites/all/modules/libraries/LICENSE.txt
entity https://www.example.org/sites/all/modules/entity/
https://www.example.org/sites/all/modules/entity/README.txt
https://www.example.org/sites/all/modules/entity/LICENSE.txt
google_analytics https://www.example.org/sites/all/modules/google_analytics/
https://www.example.org/sites/all/modules/google_analytics/README.txt
https://www.example.org/sites/all/modules/google_analytics/LICENSE.txt
ctools https://www.example.org/sites/all/modules/ctools/
https://www.example.org/sites/all/modules/ctools/CHANGELOG.txt
https://www.example.org/sites/all/modules/ctools/LICENSE.txt
https://www.example.org/sites/all/modules/ctools/API.txt
features https://www.example.org/sites/all/modules/features/
https://www.example.org/sites/all/modules/features/CHANGELOG.txt
https://www.example.org/sites/all/modules/features/README.txt
https://www.example.org/sites/all/modules/features/LICENSE.txt
https://www.example.org/sites/all/modules/features/API.txt
[... snip for README ...]
[+] Scan finished (0:04:59.502427 elapsed)
Полный список опций можно получить, выполнив:
droopescan --help
droopescan scan --help
Потому что droopescan:
Установка проста с помощью pip:
apt-get install python-pip
pip install droopescan
Установка вручную выполняется следующим образом:
git clone https://github.com/droope/droopescan.git
cd droopescan
pip install -r requirements.txt
./droopescan scan --help
Ветка master соответствует последнему релизу (тому, что в pypi). Ветка разработки нестабильна, и все запросы на слияние должны быть направлены на неё.
Установка пакета BlackArch (поддерживается третьей стороной):
sudo pacman -S droopescan
Вы можете собрать Docker-образ и запускать droopescan из Docker:
git clone https://github.com/droope/droopescan.git
cd droopescan
docker build -t droope/droopescan .
# отображение справки
docker run --rm droope/droopescan
# пример сканирования сайта на Drupal
docker run --rm droope/droopescan scan drupal -u https://drupal.example.com
Droopescan стремится быть максимально точным по умолчанию, не перегружая целевой сервер из-за чрезмерного количества одновременных запросов. Поэтому по умолчанию выполняется большое количество запросов с четырьмя потоками; измените эти параметры с помощью аргументов --number и --threads соответственно.
Этот инструмент может выполнять четыре типа проверок. По умолчанию выполняются все проверки, но вы можете указать один из следующих флагов с помощью флага -e или --enumerate:
Вы можете указать конкретный хост для сканирования, передав параметр -u или --url:
droopescan scan drupal -u example.org
Вы также можете опустить аргумент drupal. Это запустит «идентификацию CMS» следующим образом:
droopescan scan -u example.org
Несколько URL могут быть отсканированы с помощью параметра -U или --url-file. Этот параметр должен указывать на файл, содержащий список URL.
droopescan scan drupal -U list_of_urls.txt
Параметр drupal также может быть опущен в этом примере. Для каждого сайта будет выполнено несколько GET-запросов для идентификации CMS, и если сайт признаётся поддерживаемой CMS, он сканируется и добавляется в выходной список. Это может быть полезно, например, для запуска droopescan на всех сайтах вашей организации.
droopescan scan -U list_of_urls.txt
В блоке кода ниже приведён пример списка URL, по одному на строку:
http://localhost/drupal/6.0/
http://localhost/drupal/6.1/
http://localhost/drupal/6.10/
http://localhost/drupal/6.11/
http://localhost/drupal/6.12/
Также допускается файл, содержащий URL и значение для переопределения заголовка Host по умолчанию, разделённые табуляцией или пробелами. Это удобно при сканировании большого диапазона хостов, когда вы хотите избежать лишних DNS-запросов. Для пояснения ниже приведён пример:
192.168.1.1 example.org
http://192.168.1.1/ example.org
http://192.168.1.2/drupal/ example.org
Вполне соблазнительно проверить, работает ли сканер для конкретной CMS, сканируя официальный сайт (например, wordpress.org для WordPress), но официальные сайты редко работают со стандартными установками своих CMS или делают нетрадиционные вещи. Например, wordpress.org работает с самой последней версией WordPress, которая не будет идентифицирована как WordPress с помощью droopescan, поскольку контрольные суммы не совпадают ни с одной известной версией WordPress.
Приложение полностью поддерживает файлы .netrc и переменные окружения http_proxy.
Используйте файл .netrc для базовой аутентификации. Пример файла netrc (файл с именем .netrc, размещённый в вашей домашней директории root) может выглядеть так:
machine secret.google.com
login [email protected]
password Winter01
Вы можете установить переменные http_proxy и https_proxy. Они позволяют задать родительский HTTP-прокси, в котором можно обрабатывать более сложные типы аутентификации (например, Fiddler, ZAP, Burp).
export http_proxy='user:password@localhost:8080'
export https_proxy='user:password@localhost:8080'
droopescan scan drupal --url http://localhost/drupal
ПРЕДУПРЕЖДЕНИЕ: По замыслу, чтобы разрешить перехватывающие прокси и тестирование приложений с некачественным SSL, droopescan допускает самоподписанные или иным образом недействительные сертификаты. ˙ ͜ʟ˙
Приложение поддерживает как «стандартный вывод», предназначенный для чтения человеком, так и JSON, который больше подходит для машинного потребления. Этот вывод стабилен между основными версиями.
Это управляется с помощью флага --output. Пример вывода в формате JSON будет выглядеть так (без лишних пробелов):
{
"themes": {
"is_empty": true,
"finds": [
]
},
"interesting urls": {
"is_empty": false,
"finds": [
{
"url": "https:\/\/www.drupal.org\/CHANGELOG.txt",
"description": "Default changelog file."
},
{
"url": "https:\/\/www.drupal.org\/user\/login",
"description": "Default admin."
}
]
},
"version": {
"is_empty": false,
"finds": [
"7.29",
"7.30",
"7.31"
]
},
"plugins": {
"is_empty": false,
"finds": [
{
"url": "https:\/\/www.drupal.org\/sites\/all\/modules\/views\/",
"name": "views"
},
[...snip...]
]
}
}
Некоторые атрибуты могут отсутствовать в JSON-объекте, если части сканирования не выполнялись.
Вот как выглядит вывод для нескольких сайтов; каждая строка содержит допустимый JSON-объект, как показано выше.
$ droopescan scan drupal -U six_and_above.txt -e v
{"host": "http://localhost/drupal-7.6/", "version": {"is_empty": false, "finds": ["7.6"]}}
{"host": "http://localhost/drupal-7.7/", "version": {"is_empty": false, "finds": ["7.7"]}}
{"host": "http://localhost/drupal-7.8/", "version": {"is_empty": false, "finds": ["7.8"]}}
{"host": "http://localhost/drupal-7.9/", "version": {"is_empty": false, "finds": ["7.9"]}}
{"host": "http://localhost/drupal-7.10/", "version": {"is_empty": false, "finds": ["7.10"]}}
{"host": "http://localhost/drupal-7.11/", "version": {"is_empty": false, "finds": ["7.11"]}}
{"host": "http://localhost/drupal-7.12/", "version": {"is_empty": false, "finds": ["7.12"]}}
{"host": "http://localhost/drupal-7.13/", "version": {"is_empty": false, "finds": ["7.13"]}}
{"host": "http://localhost/drupal-7.14/", "version": {"is_empty": false, "finds": ["7.14"]}}
{"host": "http://localhost/drupal-7.15/", "version": {"is_empty": false, "finds": ["7.15"]}}
{"host": "http://localhost/drupal-7.16/", "version": {"is_empty": false, "finds": ["7.16"]}}
{"host": "http://localhost/drupal-7.17/", "version": {"is_empty": false, "finds": ["7.17"]}}
{"host": "http://localhost/drupal-7.18/", "version": {"is_empty": false, "finds": ["7.18"]}}
{"host": "http://localhost/drupal-7.19/", "version": {"is_empty": false, "finds": ["7.19"]}}
{"host": "http://localhost/drupal-7.20/", "version": {"is_empty": false, "finds": ["7.20"]}}
{"host": "http://localhost/drupal-7.21/", "version": {"is_empty": false, "finds": ["7.21"]}}
{"host": "http://localhost/drupal-7.22/", "version": {"is_empty": false, "finds": ["7.22"]}}
{"host": "http://localhost/drupal-7.23/", "version": {"is_empty": false, "finds": ["7.23"]}}
{"host": "http://localhost/drupal-7.24/", "version": {"is_empty": false, "finds": ["7.24"]}}
{"host": "http://localhost/drupal-7.25/", "version": {"is_empty": false, "finds": ["7.25"]}}
{"host": "http://localhost/drupal-7.26/", "version": {"is_empty": false, "finds": ["7.26"]}}
{"host": "http://localhost/drupal-7.27/", "version": {"is_empty": false, "finds": ["7.27"]}}
{"host": "http://localhost/drupal-7.28/", "version": {"is_empty": false, "finds": ["7.28"]}}
{"host": "http://localhost/drupal-7.29/", "version": {"is_empty": false, "finds": ["7.29"]}}
{"host": "http://localhost/drupal-7.30/", "version": {"is_empty": false, "finds": ["7.30"]}}
{"host": "http://localhost/drupal-7.31/", "version": {"is_empty": false, "finds": ["7.31"]}}
{"host": "http://localhost/drupal-7.32/", "version": {"is_empty": false, "finds": ["7.32"]}}
{"host": "http://localhost/drupal-7.33/", "version": {"is_empty": false, "finds": ["7.33"]}}
{"host": "http://localhost/drupal-7.34/", "version": {"is_empty": false, "finds": ["7.34"]}}
Когда что-то идёт не так, как вы ожидаете, вы можете проверить причину с помощью команды --debug-requests.
Пример вывода:
computer:~/droopescan# droopescan scan silverstripe -u http://localhost -n 10 -e p --debug-requests
[head] http://localhost/framework/... 403
[head] http://localhost/cms/css/layout.css... 404
[head] http://localhost/framework/css/UploadField.css... 200
[head] http://localhost/misc/test/error/404/ispresent.html... 404
[head] http://localhost/widgetextensions/... 404
[head] http://localhost/orbit/... 404
[head] http://localhost/sitemap/... 404
[head] http://localhost/simplestspam/... 404
[head] http://localhost/ecommerce_modifier_example/... 404
[head] http://localhost/silverstripe-hashpath/... 404
[head] http://localhost/timeline/... 404
[head] http://localhost/silverstripe-hiddenfields/... 404
[head] http://localhost/addressable/... 404
[head] http://localhost/silverstripe-description/... 404
[+] No plugins found.
[+] Scan finished (0:00:00.058422 elapsed)
Также существует параметр --debug, который может использоваться для отладки внутренних компонентов приложения.
Вы можете получить актуальный отчёт о возможностях сканера, выполнив следующую команду:
droopescan stats
Пример вывода может выглядеть так:
Functionality available for ‘drupal’:
- Enumerate plugins (XXXX plugins.)
- Enumerate themes (XXXX themes.)
- Enumerate interesting urls (X urls.)
- Enumerate version (up to version X.X.X-alphaXX, X.XX, X.XX.)
Functionality available for ‘joomla’:
- Enumerate interesting urls (X urls.)
- Enumerate version (up to version XX.X, X.X.X, X.X.XX.rcX.)
Functionality available for ‘wordpress’:
- Enumerate interesting urls (X urls.)
- Enumerate version (up to version X.X.X, X.X.X, X.X.X.)
Functionality available for ‘silverstripe’:
- Enumerate plugins (XXX plugins.)
- Enumerate themes (XX themes.)
- Enumerate interesting urls (X urls.)
- Enumerate version (up to version X.X.XX, X.X.XX, X.X.XX.)
Важно убедиться, что последняя доступная версия CMS присутствует в droopescan, иначе результаты могут быть неточными.
Вы можете добавить поддержку для вашей любимой CMS. Процесс на самом деле довольно прост, и много информации можно почерпнуть, просмотрев файл example.py в папке plugins/.
Этот файл должен послужить хорошей основой для вашей реализации.
Вы можете создать свой собственный плагин для Joomla и включить его следующим образом:
$ cp plugins/example.py plugins/joomla.py
$ cp plugins.d/example.conf plugins.d/joomla.conf
Затем вам нужно перейти в plugins/joomla.py и изменить несколько вещей:
@controller.expose(help='example scanner')
def joomla(self):
self.plugin_init()
Нам также нужно изменить файл plugins.d/joomla.conf следующим образом:
[joomla]
enable_plugin = true
Теперь наше состояние должно выглядеть так:
$ droopescan scan joomla
[+] --url parameter is required.
Вашим следующим шагом будет создание валидного списка слов для плагинов, валидного списка слов для тем, файла versions.xml, и, опционально, списка интересных URL, а также замена всех переменных, находящихся в joomla.py, на значения, корректные для вашей реализации.
Плагин должен обновляться автоматически, чтобы запрос на слияние был принят. Дальнейшая документация может быть предоставлена позже, но пока имейте в виду, что необходимо реализовать функции update_version_check, update_version, update_plugins_check и update_plugins. Для справки просмотрите файл drupal.py. Это требуется для обеспечения актуальности плагинов.
Приветствуются запросы на слияние, создающие новые плагины, при условии, что их обслуживание выполняется автоматически.
Пожалуйста, не забывайте направлять свои запросы на слияние в ветку разработки, а не в master. Проблемы можно сообщать в трекере задач здесь, на GitHub.
Для запуска тестов необходимо установить некоторые зависимости. Выполнение следующих команд приведёт к их установке и запуску тестов:
apt-get install libxslt1-dev libxml2-dev zlib1g-dev python python-pip python-dev python3 python3-pip python3-dev
pip install -r requirements.txt -r requirements_test.txt
pip3 install -r requirements.txt -r requirements_test.txt
./droopescan test
Вы можете запускать отдельные тесты с помощью флага -s.
./droopescan test -s test_integration_drupal
Проект лицензирован под лицензией AGPL. См. файл LICENSE.