
Un scanner basé sur des plugins qui aide les chercheurs en sécurité à identifier des problèmes sur plusieurs CMS, principalement Drupal et Silverstripe.
Un scanner basé sur des plugins qui aide les chercheurs en sécurité à identifier des problèmes avec plusieurs CMS.
L'utilisation de droopescan pour attaquer des cibles sans consentement mutuel préalable est illégale. Il est de la responsabilité de l'utilisateur final de respecter toutes les lois locales, étatiques et fédérales applicables. Les développeurs n'assument aucune responsabilité et ne sont pas responsables des abus ou dommages causés par ce programme. Veuillez noter que bien que droopescan produise la version la plus probable du CMS installée sur l'hôte distant, toute corrélation entre les numéros de version et les vulnérabilités doit être effectuée manuellement par l'utilisateur.
Les CMS supportés sont :
Fonctionnalité partielle pour :
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)
Vous pouvez obtenir une liste complète des options en exécutant :
droopescan --help
droopescan scan --help
Parce que droopescan :
L'installation est facile avec pip :
apt-get install python-pip
pip install droopescan
L'installation manuelle est la suivante :
git clone https://github.com/droope/droopescan.git
cd droopescan
pip install -r requirements.txt
./droopescan scan --help
La branche master correspond à la dernière version (ce qui est dans pypi). La branche de développement est instable et toutes les pull requests doivent lui être adressées.
Installation du package BlackArch (maintenu par un tiers) :
sudo pacman -S droopescan
Vous pouvez construire une image docker et exécuter droopescan depuis Docker :
git clone https://github.com/droope/droopescan.git
cd droopescan
docker build -t droope/droopescan .
# affichage de l'aide
docker run --rm droope/droopescan
# exemple de scan d'un site drupal
docker run --rm droope/droopescan scan drupal -u https://drupal.example.com
Droopescan vise à être le plus précis par défaut, tout en ne surchargeant pas le serveur cible en raison de requêtes concurrentes excessives. Pour cette raison, par défaut, un grand nombre de requêtes seront effectuées avec quatre threads ; modifiez ces paramètres en utilisant respectivement les arguments --number et --threads.
Cet outil est capable d'effectuer quatre types de tests. Par défaut, tous les tests sont exécutés, mais vous pouvez spécifier l'un des suivants avec l'option -e ou --enumerate :
Vous pouvez spécifier un hôte particulier à scanner en passant le paramètre -u ou --url :
droopescan scan drupal -u example.org
Vous pouvez aussi omettre l'argument drupal. Cela déclenchera « l'identification CMS », comme ceci :
droopescan scan -u example.org
Plusieurs URLs peuvent être scannées en utilisant le paramètre -U ou --url-file. Ce paramètre doit être défini sur le chemin d'un fichier contenant une liste d'URLs.
droopescan scan drupal -U list_of_urls.txt
Le paramètre drupal peut également être omis dans cet exemple. Pour chaque site, il effectuera plusieurs requêtes GET afin de réaliser l'identification CMS, et si le site est considéré comme un CMS supporté, il est scanné et ajouté à la liste de sortie. Cela peut être utile, par exemple, pour exécuter droopescan sur tous les sites de votre organisation.
droopescan scan -U list_of_urls.txt
Le bloc de code ci-dessous contient un exemple de liste d'URLs, une par ligne :
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 fichier contenant des URLs et une valeur pour remplacer l'en-tête de l'hôte par défaut, séparés par des tabulations ou des espaces, est également acceptable pour les fichiers d'URLs. Cela peut être pratique lors d'un scan sur une large gamme d'hôtes et que vous souhaitez éviter des requêtes DNS inutiles. Pour clarifier, un exemple ci-dessous :
192.168.1.1 example.org
http://192.168.1.1/ example.org
http://192.168.1.2/drupal/ example.org
Il est assez tentant de tester si le scanner fonctionne pour un CMS particulier en scannant le site officiel (par exemple wordpress.org pour wordpress), mais les sites officiels exécutent rarement des installations vanilles de leur CMS respectif ou font des choses peu orthodoxes. Par exemple, wordpress.org exécute la version de pointe de wordpress, qui ne sera pas identifiée comme wordpress par droopescan car les sommes de contrôle ne correspondent à aucune version connue de wordpress.
L'application supporte pleinement les fichiers .netrc et les variables d'environnement http_proxy.
Utilisez un fichier .netrc pour l'authentification de base. Un exemple de fichier netrc (un fichier nommé .netrc placé dans votre répertoire personnel racine) pourrait ressembler à ceci :
machine secret.google.com
login [email protected]
password Winter01
Vous pouvez définir les variables http_proxy et https_proxy. Celles-ci vous permettent de définir un proxy HTTP parent, dans lequel vous pouvez gérer des types d'authentification plus complexes (par exemple Fiddler, ZAP, Burp)
export http_proxy='user:password@localhost:8080'
export https_proxy='user:password@localhost:8080'
droopescan scan drupal --url http://localhost/drupal
ATTENTION : Par conception, pour permettre les proxies d'interception et les tests d'applications avec un mauvais SSL, droopescan autorise les certificats auto-signés ou autrement invalides. ˙ ͜ʟ˙
Cette application supporte à la fois la « sortie standard », destinée à la consommation humaine, ou le JSON, qui est plus adapté à la consommation machine. Cette sortie est stable entre les versions majeures.
Cela peut être contrôlé avec l'option --output. Un exemple de sortie JSON ressemblerait à ceci (sans les espaces excessifs) :
{
"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...]
]
}
}
Certains attributs peuvent manquer dans l'objet JSON si des parties du scan ne sont pas exécutées.
Voici à quoi ressemble la sortie multi-site ; chaque ligne contient un objet JSON valide comme montré ci-dessus.
$ 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"]}}
Quand les choses ne se passent pas exactement comme vous le souhaitez, vous pouvez vérifier pourquoi en utilisant la commande --debug-requests.
Une sortie pourrait ressembler à ceci :
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)
Le paramètre --debug existe également et peut être utilisé pour déboguer les internes de l'application.
Vous pouvez obtenir un rapport à jour sur les capacités du scanner en exécutant la commande suivante :
droopescan stats
Un exemple de sortie pourrait ressembler à ceci :
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.)
Il est important de vérifier que la dernière version disponible pour l'installation CMS est disponible dans droopescan, car sinon les résultats peuvent être inexacts.
Vous pouvez ajouter le support de votre CMS préféré. Le processus est en fait assez simple, et beaucoup d'informations peuvent être aperçues en consultant le fichier example.py dans le dossier plugins/.
Ce fichier devrait bien servir de base pour votre implémentation.
Vous pouvez créer votre propre plugin pour Joomla et l'activer comme suit :
$ cp plugins/example.py plugins/joomla.py
$ cp plugins.d/example.conf plugins.d/joomla.conf
Vous devez ensuite aller dans plugins/joomla.py et modifier quelques éléments :
@controller.expose(help='example scanner')
def joomla(self):
self.plugin_init()
Nous devons également modifier le fichier plugins.d/joomla.conf et le changer en ceci :
[joomla]
enable_plugin = true
Nous devrions maintenant être dans un état qui ressemble à ceci :
$ droopescan scan joomla
[+] --url parameter is required.
Votre prochaine étape serait de générer une wordlist de plugins valide, une wordlist de thèmes valide, un fichier versions.xml, et optionnellement une liste d'URLs intéressantes, ainsi que remplacer toutes les variables qui sont dans joomla.py par des valeurs correctes pour votre implémentation.
Le plugin doit se mettre à jour automatiquement pour qu'une pull request soit acceptée. Une documentation supplémentaire pourra être fournie plus tard, mais pour l'instant, gardez à l'esprit que les fonctions update_version_check, update_version, update_plugins_check et update_plugins doivent être implémentées. Pour référence, veuillez consulter le fichier drupal.py. Ceci est nécessaire pour garantir que les plugins restent à jour.
Les pull requests qui créent de nouveaux plugins sont les bienvenues à condition que la maintenance de ces plugins soit faite automatiquement.
N'oubliez pas de faire vos pull requests contre la branche de développement plutôt que master. Les problèmes peuvent être soulevés sur le tracker de problèmes ici sur GitHub.
Pour exécuter les tests, certaines dépendances doivent être installées. L'exécution des commandes suivantes entraînera leur installation et l'exécution des tests :
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
Vous pouvez exécuter des tests individuels avec l'option -s.
./droopescan test -s test_integration_drupal
Le projet est sous licence AGPL. Voir le fichier LICENSE.