
Qu'est-ce que Droopescan et comment l'utiliser efficacement
La reconnaissance de site Web est l'un des éléments d'un audit de sécurité. Cette tâche peut être automatisée dans une certaine mesure en choisissant l'un des programmes gratuits et open-source disponibles sur le web. Un de ces outils est Droopescan.
Qu'est-ce que Droopescan ?
Droopescan est un script permettant d'accélérer la reconnaissance initiale du site audité s’il utilise l’un des CMS listés ci-dessous. Le script permet de définir vos propres plugins, ce qui peut permettre une automatisation encore plus poussée du processus d’examen initial. Vous pouvez trouver plus d'informations sur la création de vos propres plugins, qui étendent la fonctionnalité du script, dans le fichier README.md sur la page de l'outil précédemment liée sur Github.
Fonctionnalités du scanner Drupal
Les capacités de Droopescan varient en fonction du système de gestion de contenu.
Dans Drupal, ce sont les fonctions qui permettent d'identifier :
- les plugins installés
- les thèmes installés
- les chemins d’intérêt pour un attaquant potentiel (comme le panneau de connexion ou le fichier de changelog)
- la version de Drupal utilisée
Dans Joomla et WordPress, vous pouvez identifier les chemins d'intérêt pour un attaquant, ainsi que la version de ces systèmes utilisée. Dans un autre CMS, Moodle, l'outil Droopescan peut reconnaître les plugins et thèmes installés, ainsi que la version du système de gestion de contenu en cours d'utilisation.
Dans le système Silverstripe, nous identifierons :
- les plugins installés,
- les thèmes installés,
- les chemins d’intérêt pour un attaquant,
- la version de Silverstripe utilisée.
Méthodes d'installation du script
Les développeurs ont préparé plusieurs méthodes d'installation du script. Nous pouvons choisir la façon la plus appropriée, selon nos préférences.
Utilisation de pip
C'est la méthode d'installation recommandée par les créateurs :
apt-get install python-pip pip install droopescan
Installation manuelle
Pour installer le script manuellement, exécutez les commandes suivantes :
git clone https://github.com/droope/droopescan.git cd droopescan pip install -r requirements.txt ./droopescan scan --help
Sur la distribution BlackArch
Pour l'installation sur la distribution BlackArch, les créateurs recommandent d'utiliser pacman :
sudo pacman -S droopescan
Docker
Droopescan peut également être installé en tant que conteneur Docker :
git clone https://github.com/droope/droopescan.git cd droopescan docker build -t droope/droopescan . # afficher 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
Déballage
Le script Droopescan est très flexible et permet de configurer le scan selon vos souhaits. Grâce aux paramètres, nous pouvons changer le type de scan, en choisissant l’un des cadres disponibles, fournir une adresse ou une liste d'adresses à scanner, et bien plus encore. Voici une liste complète des options configurables.
Commandes
droopescan scan --help
Ouvre une liste des commandes disponibles.
droopescan scan
{drupal|joomla|moodle|silverstripe|wordpress}
Exécute les scripts responsables du scan du site web utilisant le CMS sélectionné.
droopescan scan --debug
Exécute la sortie de débogage.
droopescan scan --quiet
Active le mode silencieux qui ne montre pas les informations sur le scan pendant son exécution.
droopescan scan -u {URL} et droopescan scan --url {URL}
Ils permettent de définir la cible du scan.
droopescan scan -U {URL_FILE} et droopescan scan --url-file {URL_FILE}
Ils permettent de définir le chemin du fichier où se trouvent les sites à scanner. La structure du fichier devrait ressembler à ceci :
> cat example.txt http://localhost/drupal/8.9.0/ http://localhost/drupal/8.7.1/ http://localhost/drupal/8.9.13/ http://example.com
droopescan scan -e {a, t, p, v, i} et droopescan scan --enumerate {a, t, p, v, i}
Ils permettent de définir ce que le script doit scanner :
- p - plugins,
- t - thèmes,
- v - version,
- i - liens utiles,
- a (par défaut) - tous.
droopescan scan --method {not_found, forbidden, ok}
Permet de spécifier quel type d'erreur est traité comme un indicateur et si un certain chemin existe. Pour certains serveurs, c’est 403, pour d’autres – 404. Par défaut, le script essaie de le déduire lui-même.
droopescan scan --verb {head, get}
Permet de spécifier le type de requête que le script utilisera. L'option par défaut est head.
droopescan scan --number {NUMBER} droopescan scan -n {NUMBER}
Spécifie le nombre de mots à vérifier à partir du dictionnaire de plugins ou de thèmes. C'est mille par défaut. Pour utiliser tout ce qui est disponible, vous devriez taper all.
droopescan scan --plugins-base-url {PLUGINS_BASE_URL}
Permet de spécifier le chemin où les plugins sont stockés dans le CMS. Sans fournir ce paramètre, le script vérifie le chemin par défaut pour un système donné.
droopescan scan --themes-base-url {THEMES_BASE_URL}
Permet de spécifier le chemin où les thèmes sont stockés dans le CMS. Sans fournir ce paramètre, le script vérifie le chemin par défaut pour un système donné.
droopescan scan --timeout {TIMEOUT}
Spécifie combien de temps le script doit attendre une réponse HTTP en secondes.
droopescan scan --no-follow-redirects
Activer ce drapeau empêche de suivre les redirections.
droopescan scan --host {HOST}
Écrase l'en-tête de requête d'hôte avec la valeur fournie.
droopescan scan --user-agent {USER_AGENT}
Écrase l'en-tête User Agent de la requête.
droopescan scan --massscan-override
Utiliser ce drapeau remplace les valeurs par défaut par celles pratiques pour le scan de masse des hôtes.
droopescan scan --threads {THREADS} et droopescan scan -t {THREADS}
Un nombre de threads utilisés pour le scan. C'est 4 par défaut.
droopescan scan --threads-identify {THREADS_IDENTIFY}
Un nombre de threads utilisés pour l'identification du CMS.
droopescan scan --threads-scan {THREADS_SCAN}
Un nombre de threads utilisés pour le scan de masse des hôtes.
droopescan scan --threads-enumerate {THREADS_ENUMERATE}
Un nombre de threads utilisés pour l'identification des plugins.
droopescan scan --output {standard, json} et droopescan scan -o {standard, json}
Permet de spécifier le format de sortie retourné par le script.
droopescan scan --hide-progressbar
L'activation de ce drapeau permet de désactiver la barre de progression.
droopescan scan --debug-requests
L'activation de ce drapeau introduit dans la console le contenu de toutes les requêtes HTTP faites par le script, ainsi que la réponse reçue du serveur. L'activation de ce drapeau désactive le threading du scan et les barres de progression.
droopescan scan --error-log {ERROR_LOG}
Permet de définir le fichier dans lequel toutes les erreurs de scan seront consignées.
droopescan scan --resume
Retourne le scan au stade où il a été terminé pour la dernière fois. C'est une option utile lors de l'utilisation du scan de masse.
Exemple d'utilisation de Droopescan
Notre page de test utilise Drupal 8.9.15 et contient une liste de nombreux modules populaires. Elle utilise un thème personnalisé, et la connexion au panneau d'administration est effectuée avec le chemin par défaut.
Pour commencer le scan, nous utiliserons la commande :
droopescan scan drupal -u example.com
Vous pouvez voir le résultat du scan ci-dessous.
➜ droopescan git:(master) docker run --rm droope/droopescan scan drupal -u example.com
modules [ === ] 224/4000 (5%)[+] Got an HTTP 500 response.
modules [ ==== ] 287/4000 (7%)[+] Got an HTTP 500 response.
modules [ ==== ] 288/4000 (7%)[+] Got an HTTP 500 response.
modules [ ======== ] 626/4000 (15%)[+] Got an HTTP 500 response.
modules [ ============== ] 1053/4000 (26%)[+] Got an HTTP 500 response.
modules [ ============== ] 1056/4000 (26%)[+] Got an HTTP 500 response.
modules [ ================ ] 1272/4000 (31%)[+] Got an HTTP 500 response.
modules [ ============================ ] 2227/4000 (55%)[+] Got an HTTP 500 response.
modules [ ================================ ] 2509/4000 (62%)[+] Got an HTTP 500 response.
modules [ =============================================== ] 3746/4000 (93%)[+] Got an HTTP 500 response.
[+] Accepted redirect to https://www.example.com/
[+] Plugins found:
image_widget_crop https://www.example.com/sites/all/modules/image_widget_crop/
flexslider_views_slideshow https://www.example.com/sites/all/modules/flexslider_views_slideshow/
service_links https://www.example.com/sites/all/modules/service_links/
compact_forms https://www.example.com/sites/all/modules/compact_forms/
strongarm https://www.example.com/sites/default/modules/strongarm/
video_embed_field https://www.example.com/sites/default/modules/video_embed_field/
tablefield https://www.example.com/sites/default/modules/tablefield/
ctools https://www.example.com/modules/contrib/ctools/
https://www.example.com/modules/contrib/ctools/README.txt
https://www.example.com/modules/contrib/ctools/LICENSE.txt
token https://www.example.com/modules/contrib/token/
https://www.example.com/modules/contrib/token/README.md
https://www.example.com/modules/contrib/token/LICENSE.txt
pathauto https://www.example.com/modules/contrib/pathauto/
https://www.example.com/modules/contrib/pathauto/README.md
https://www.example.com/modules/contrib/pathauto/LICENSE.txt
metatag https://www.example.com/modules/contrib/metatag/
https://www.example.com/modules/contrib/metatag/CHANGELOG.txt
https://www.example.com/modules/contrib/metatag/README.txt
https://www.example.com/modules/contrib/metatag/LICENSE.txt
field_group https://www.example.com/modules/contrib/field_group/
https://www.example.com/modules/contrib/field_group/CHANGELOG.txt
https://www.example.com/modules/contrib/field_group/README.txt
https://www.example.com/modules/contrib/field_group/LICENSE.txt
google_analytics https://www.example.com/modules/contrib/google_analytics/
https://www.example.com/modules/contrib/google_analytics/README.md
https://www.example.com/modules/contrib/google_analytics/LICENSE.txt
redirect https://www.example.com/modules/contrib/redirect/
https://www.example.com/modules/contrib/redirect/README.txt
https://www.example.com/modules/contrib/redirect/LICENSE.txt
colorbox https://www.example.com/modules/contrib/colorbox/
https://www.example.com/modules/contrib/colorbox/README.txt
https://www.example.com/modules/contrib/colorbox/LICENSE.txt
features https://www.example.com/modules/contrib/features/
https://www.example.com/modules/contrib/features/LICENSE.txt
devel https://www.example.com/modules/contrib/devel/
https://www.example.com/modules/contrib/devel/README.txt
https://www.example.com/modules/contrib/devel/LICENSE.txt
admin_toolbar https://www.example.com/modules/contrib/admin_toolbar/
https://www.example.com/modules/contrib/admin_toolbar/CHANGELOG.txt
https://www.example.com/modules/contrib/admin_toolbar/README.txt
https://www.example.com/modules/contrib/admin_toolbar/LICENSE.txt
better_exposed_filters https://www.example.com/modules/contrib/better_exposed_filters/
https://www.example.com/modules/contrib/better_exposed_filters/README.txt
https://www.example.com/modules/contrib/better_exposed_filters/LICENSE.txt
paragraphs https://www.example.com/modules/contrib/paragraphs/
https://www.example.com/modules/contrib/paragraphs/README.txt
https://www.example.com/modules/contrib/paragraphs/LICENSE.txt
smtp https://www.example.com/modules/contrib/smtp/
https://www.example.com/modules/contrib/smtp/README.txt
https://www.example.com/modules/contrib/smtp/LICENSE.txt
search_api https://www.example.com/modules/contrib/search_api/
https://www.example.com/modules/contrib/search_api/CHANGELOG.txt
https://www.example.com/modules/contrib/search_api/README.md
https://www.example.com/modules/contrib/search_api/LICENSE.txt
entity_reference_revisions https://www.example.com/modules/contrib/entity_reference_revisions/
https://www.example.com/modules/contrib/entity_reference_revisions/LICENSE.txt
linkit https://www.example.com/modules/contrib/linkit/
https://www.example.com/modules/contrib/linkit/README.md
https://www.example.com/modules/contrib/linkit/LICENSE.txt
eu_cookie_compliance https://www.example.com/modules/contrib/eu_cookie_compliance/
https://www.example.com/modules/contrib/eu_cookie_compliance/README.md
https://www.example.com/modules/contrib/eu_cookie_compliance/LICENSE.txt
scheduler https://www.example.com/modules/contrib/scheduler/
https://www.example.com/modules/contrib/scheduler/README.md
https://www.example.com/modules/contrib/scheduler/LICENSE.txt
simple_sitemap https://www.example.com/modules/contrib/simple_sitemap/
https://www.example.com/modules/contrib/simple_sitemap/README.md
https://www.example.com/modules/contrib/simple_sitemap/LICENSE.txt
google_tag https://www.example.com/modules/contrib/google_tag/
https://www.example.com/modules/contrib/google_tag/README.md
addtoany https://www.example.com/modules/contrib/addtoany/
https://www.example.com/modules/contrib/addtoany/README.txt
https://www.example.com/modules/contrib/addtoany/LICENSE.txt
advagg https://www.example.com/modules/contrib/advagg/
https://www.example.com/modules/contrib/advagg/README.md
https://www.example.com/modules/contrib/advagg/LICENSE.txt
config_update https://www.example.com/modules/contrib/config_update/
https://www.example.com/modules/contrib/config_update/README.txt
https://www.example.com/modules/contrib/config_update/LICENSE.txt
robotstxt https://www.example.com/modules/contrib/robotstxt/
https://www.example.com/modules/contrib/robotstxt/README.txt
https://www.example.com/modules/contrib/robotstxt/LICENSE.txt
config_filter https://www.example.com/modules/contrib/config_filter/
https://www.example.com/modules/contrib/config_filter/README.md
https://www.example.com/modules/contrib/config_filter/LICENSE.txt
menu_link_attributes https://www.example.com/modules/contrib/menu_link_attributes/
https://www.example.com/modules/contrib/menu_link_attributes/README.md
https://www.example.com/modules/contrib/menu_link_attributes/LICENSE.txt
migrate_plus https://www.example.com/modules/contrib/migrate_plus/
https://www.example.com/modules/contrib/migrate_plus/README.txt
https://www.example.com/modules/contrib/migrate_plus/LICENSE.txt
checklistapi https://www.example.com/modules/contrib/checklistapi/
https://www.example.com/modules/contrib/checklistapi/README.md
https://www.example.com/modules/contrib/checklistapi/LICENSE.txt
config_split https://www.example.com/modules/contrib/config_split/
https://www.example.com/modules/contrib/config_split/README.md
https://www.example.com/modules/contrib/config_split/LICENSE.txt
migrate_tools https://www.example.com/modules/contrib/migrate_tools/
https://www.example.com/modules/contrib/migrate_tools/README.txt
https://www.example.com/modules/contrib/migrate_tools/LICENSE.txt
config_ignore https://www.example.com/modules/contrib/config_ignore/
schema_metatag https://www.example.com/modules/contrib/schema_metatag/
https://www.example.com/modules/contrib/schema_metatag/README.txt
https://www.example.com/modules/contrib/schema_metatag/LICENSE.txt
tvi https://www.example.com/modules/contrib/tvi/
https://www.example.com/modules/contrib/tvi/README.txt
https://www.example.com/modules/contrib/tvi/LICENSE.txt
svg_image https://www.example.com/modules/contrib/svg_image/
https://www.example.com/modules/contrib/svg_image/README.md
https://www.example.com/modules/contrib/svg_image/LICENSE.txt
link_attributes https://www.example.com/modules/contrib/link_attributes/
https://www.example.com/modules/contrib/link_attributes/README.md
https://www.example.com/modules/contrib/link_attributes/LICENSE.txt
facets https://www.example.com/modules/contrib/facets/
https://www.example.com/modules/contrib/facets/README.txt
https://www.example.com/modules/contrib/facets/LICENSE.txt
yoast_seo https://www.example.com/modules/contrib/yoast_seo/
https://www.example.com/modules/contrib/yoast_seo/README.txt
https://www.example.com/modules/contrib/yoast_seo/LICENSE.txt
panels_everywhere https://www.example.com/modules/contrib/panels_everywhere/
stage_file_proxy https://www.example.com/modules/contrib/stage_file_proxy/
https://www.example.com/modules/contrib/stage_file_proxy/README.md
https://www.example.com/modules/contrib/stage_file_proxy/LICENSE.txt
entity_reference_display https://www.example.com/modules/contrib/entity_reference_display/
https://www.example.com/modules/contrib/entity_reference_display/README.md
https://www.example.com/modules/contrib/entity_reference_display/LICENSE.txt
we_megamenu https://www.example.com/modules/contrib/we_megamenu/
https://www.example.com/modules/contrib/we_megamenu/README.md
https://www.example.com/modules/contrib/we_megamenu/LICENSE.txt
ckeditor_codemirror https://www.example.com/modules/ckeditor_codemirror/
[+] Aucun thème trouvé.
[+] Version(s) possible(s) :
8.9.10
8.9.11
8.9.12
8.9.13
8.9.14
8.9.15
8.9.16
8.9.17
8.9.6
8.9.7
8.9.8
8.9.9
[+] URL intéressantes trouvées :
Admin par défaut - https://www.example.com/user/login
Fichier de changelog par défaut - https://www.example.com/CHANGELOG.txt
[+] Scan terminé (0:16:25.708460 écoulé)
Scan CMS - analyse des résultats
L'outil Droopescan a permis d'identifier bon nombre des modules utilisés sur le site et a fourni des liens vers les fichiers qui ont rendu cette identification possible. Le script a identifié la version de Drupal utilisée comme étant une version avec une mise à jour mineure, de 8.9.6 à 8.9.17, et a détecté le chemin vers le panneau de connexion et le fichier CHANGELOG.txt. Malheureusement, dans le cas du site audité, il n'a pas été possible d'identifier le thème utilisé.
Droopescan - résumé
Le script Droopescan accélère la reconnaissance initiale du site audité. C'est une solution rapide, stable, constamment mise à jour qui permet d'utiliser le threading pour scanner plusieurs sites web simultanément et nécessite seulement Python. Le résultat du scan est présenté de manière conviviale. Il est possible de sauvegarder les résultats au format JSON, qui peut ensuite être traité de manière libre pour, par exemple, utiliser une application spécialement conçue à cet effet pour visualiser les résultats de manière encore plus conviviale ou pour utiliser les résultats dans les étapes suivantes de l'audit. Si vous êtes intéressé par le sujet du contrôle de la sécurité des applications, notre équipe de support Drupal peut vous aider grâce à leur expertise.