
Un escáner basado en plugins que ayuda a los investigadores de seguridad a identificar problemas en varios CMS, principalmente Drupal y Silverstripe.
Un escáner basado en plugins que ayuda a los investigadores de seguridad a identificar problemas en varios CMS.
El uso de droopescan para atacar objetivos sin consentimiento mutuo previo es ilegal. Es responsabilidad del usuario final cumplir con todas las leyes locales, estatales y federales aplicables. Los desarrolladores no asumen ninguna responsabilidad y no se hacen responsables por el uso indebido o daños causados por este programa. Tenga en cuenta que, aunque droopescan muestra la versión más probable del CMS instalado en el host remoto, cualquier correlación entre los números de versión y las vulnerabilidades debe realizarse manualmente por el usuario.
Los CMS compatibles son:
Funcionalidad parcial para:
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)
Puede obtener una lista completa de opciones ejecutando:
droopescan --help
droopescan scan --help
Porque droopescan:
La instalación es fácil usando pip:
apt-get install python-pip
pip install droopescan
La instalación manual es la siguiente:
git clone https://github.com/droope/droopescan.git
cd droopescan
pip install -r requirements.txt
./droopescan scan --help
La rama master corresponde a la última versión (lo que está en pypi). La rama de desarrollo es inestable y todas las pull requests deben hacerse contra ella.
Instalación del paquete de BlackArch (mantenido por un tercero):
sudo pacman -S droopescan
Puede construir una imagen docker y ejecutar droopescan desde Docker:
git clone https://github.com/droope/droopescan.git
cd droopescan
docker build -t droope/droopescan .
# mostrar ayuda
docker run --rm droope/droopescan
# ejemplo escaneando un sitio drupal
docker run --rm droope/droopescan scan drupal -u https://drupal.example.com
Droopescan aspira a ser lo más preciso por defecto, sin sobrecargar el servidor objetivo debido a peticiones concurrentes excesivas. Debido a esto, por defecto, se realizará un gran número de peticiones con cuatro hilos; cambie esta configuración usando los argumentos --number y --threads respectivamente.
Esta herramienta es capaz de realizar cuatro tipos de pruebas. Por defecto se ejecutan todas las pruebas, pero puede especificar una de las siguientes con la bandera -e o --enumerate:
Puede especificar un host particular para escanear pasando el parámetro -u o --url:
droopescan scan drupal -u example.org
También puede omitir el argumento drupal. Esto activará la "identificación del CMS", así:
droopescan scan -u example.org
Se pueden escanear múltiples URLs utilizando el parámetro -U o --url-file. Este parámetro debe establecerse en la ruta de un archivo que contenga una lista de URLs.
droopescan scan drupal -U list_of_urls.txt
El parámetro drupal también puede omitirse en este ejemplo. Para cada sitio, realizará varias peticiones GET para realizar la identificación del CMS, y si se considera que el sitio es un CMS compatible, se escanea y se añade a la lista de salida. Esto puede ser útil, por ejemplo, para ejecutar droopescan en todos los sitios de su organización.
droopescan scan -U list_of_urls.txt
El bloque de código a continuación contiene un ejemplo de lista de URLs, una por línea:
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/
Un archivo que contiene URLs y un valor para sobrescribir el encabezado de host predeterminado separados por tabulaciones o espacios también es válido para archivos de URL. Esto puede ser útil cuando se realiza un escaneo a través de un gran rango de hosts y se desea evitar consultas DNS innecesarias. Para aclarar, un ejemplo a continuación:
192.168.1.1 example.org
http://192.168.1.1/ example.org
http://192.168.1.2/drupal/ example.org
Es bastante tentador probar si el escáner funciona para un CMS particular escaneando el sitio oficial (por ejemplo, wordpress.org para wordpress), pero los sitios oficiales rara vez ejecutan instalaciones vainilla de sus respectivos CMS o hacen cosas poco ortodoxas. Por ejemplo, wordpress.org ejecuta la versión más reciente de wordpress, que no será identificada como wordpress por droopescan en absoluto porque las sumas de verificación no coinciden con ninguna versión conocida de wordpress.
La aplicación soporta completamente archivos .netrc y variables de entorno http_proxy.
Use un archivo .netrc para autenticación básica. Un ejemplo de archivo netrc (un archivo llamado .netrc colocado en su directorio home de root) podría verse así:
machine secret.google.com
login [email protected]
password Winter01
Puede establecer las variables http_proxy y https_proxy. Estas le permiten configurar un proxy HTTP padre, en el que puede manejar tipos más complejos de autenticación (por ejemplo, Fiddler, ZAP, Burp)
export http_proxy='user:password@localhost:8080'
export https_proxy='user:password@localhost:8080'
droopescan scan drupal --url http://localhost/drupal
ADVERTENCIA: Por diseño, para permitir proxies de intercepción y la prueba de aplicaciones con SSL malo, droopescan permite certificados autofirmados o de otro modo inválidos. ˙ ͜ʟ˙
Esta aplicación soporta tanto "salida estándar", destinada al consumo humano, como JSON, que es más adecuado para el consumo por máquinas. Esta salida es estable entre versiones mayores.
Esto se puede controlar con la bandera --output. Un ejemplo de salida JSON se vería así (sin el exceso de espacios en blanco):
{
"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...]
]
}
}
Algunos atributos pueden faltar en el objeto JSON si partes del escaneo no se ejecutan.
Así es como se ve la salida de múltiples sitios; cada línea contiene un objeto JSON válido como se muestra arriba.
$ 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"]}}
Cuando las cosas no van exactamente como desea, puede verificar por qué usando el comando --debug-requests.
Alguna salida podría verse así:
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)
El parámetro --debug también existe y puede usarse para depurar los internos de la aplicación.
Puede obtener un informe actualizado sobre las capacidades del escáner ejecutando el siguiente comando
droopescan stats
Alguna salida de ejemplo podría verse así:
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.)
Es importante verificar que la última versión disponible para la instalación del CMS esté disponible dentro de droopescan, ya que de lo contrario los resultados pueden ser inexactos.
Puede añadir soporte para su CMS favorito. El proceso es realmente bastante simple, y se puede obtener mucha información viendo el archivo example.py en la carpeta plugins/.
Este archivo debería servir bien como base para su implementación.
Puede crear su propio plugin para Joomla y habilitarlo de la siguiente manera:
$ cp plugins/example.py plugins/joomla.py
$ cp plugins.d/example.conf plugins.d/joomla.conf
Luego necesita ir a plugins/joomla.py y cambiar algunas cosas:
@controller.expose(help='example scanner')
def joomla(self):
self.plugin_init()
También necesitamos cambiar el archivo plugins.d/joomla.conf, y cambiarlo a lo siguiente:
[joomla]
enable_plugin = true
Ahora deberíamos estar en un estado que se vea así:
$ droopescan scan joomla
[+] --url parameter is required.
Su siguiente paso sería generar una lista de palabras de plugin válida, una lista de temas válida, un archivo versions.xml y opcionalmente una lista de URLs interesantes, así como reemplazar todas las variables que están en joomla.py con valores correctos para su implementación.
El plugin necesita actualizarse automáticamente para que se acepte una pull request. Es posible que más documentación esté disponible más adelante, pero por ahora, tenga en cuenta que deben implementarse update_version_check, update_version, update_plugins_check y update_plugins. Para referencia, revise el archivo drupal.py. Esto es necesario para asegurar que los plugins se mantengan actualizados.
Las pull requests que creen nuevos plugins son bienvenidas siempre que el mantenimiento de esos plugins se haga de forma automática.
Recuerde hacer sus pull requests contra la rama de desarrollo en lugar de la master. Los issues pueden plantearse en el rastreador de issues aquí en GitHub.
Para ejecutar pruebas, deben instalarse algunas dependencias. Ejecutar los siguientes comandos resultará en que se instalen y se ejecuten las pruebas:
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
Puede ejecutar pruebas individuales con la bandera -s.
./droopescan test -s test_integration_drupal
El proyecto está licenciado bajo la licencia AGPL. Consulte el archivo LICENSE.