Pourquoi j'ai développé mon-recoweb
Lorsque je résous une machine Hack The Box depuis ma Kali Linux, je suis toujours la même méthode de travail, organisée en trois grandes étapes : l'énumération, la prise de pied pour obtenir user.txt, puis l'escalade de privilèges pour atteindre root.txt.
L'énumération web fait systématiquement partie de cette première étape. Elle consiste notamment à rechercher des répertoires, des fichiers et des chemins qui pourraient ne pas être directement accessibles depuis les pages visibles du site.
Pour effectuer ces recherches, j'utilise deux outils bien connus : dirb et ffuf. Ils sont efficaces, mais leur utilisation successive implique de préparer plusieurs commandes, de choisir les wordlists appropriées et de consulter différents fichiers de résultats.
À force de répéter ces opérations au fil de mes résolutions CTF, j'ai voulu disposer d'un script qui automatise cette partie du travail, tout en conservant la possibilité d'adapter les recherches aux particularités de chaque cible.
C'est ainsi qu'est né mon-recoweb, un script Bash qui combine dirb et ffuf, organise leur exécution et rassemble les découvertes dans un fichier de synthèse unique. Aujourd'hui disponible sur mon site en version 3.0.0, il a progressivement évolué pour offrir davantage de possibilités de configuration et de filtrage des résultats, tout en conservant son objectif initial : automatiser les tâches répétitives de l'énumération web pour faciliter l'analyse des découvertes.
Présentation de mon-recoweb v3.0.0
mon-recoweb est un script Bash destiné à automatiser la recherche de répertoires et de fichiers sur un serveur web, en combinant les outils dirb et ffuf.
Son fonctionnement repose sur trois phases d'énumération exécutées successivement :
- Une première recherche générique avec
dirb. - Une recherche de répertoires avec
ffuf. - Une recherche de fichiers avec
ffuf.
Dans sa configuration par défaut, il suffit de lui indiquer une cible pour lancer ces trois phases :
mon-recoweb cible.htb Le script vérifie d'abord l'accessibilité de la cible, puis exécute les recherches en utilisant des wordlists par défaut.
Il permet également d'adapter l'énumération aux particularités de la cible :
- Limiter les recherches à un répertoire précis.
- Personnaliser les extensions de fichiers à rechercher.
- Choisir les wordlists utilisées par chaque phase.
- Activer ou désactiver individuellement les trois phases d'énumération.
- Ajuster les paramètres d'exécution, notamment le nombre de threads, le débit et les délais d'attente.
- Filtrer les résultats trop nombreux ou non pertinents, notamment en utilisant les différentes options de filtrage de
ffuf.
Les découvertes de chaque phase sont regroupées dans un fichier de synthèse unique, RESULTS_SUMMARY.txt, situé dans un sous-répertoire du répertoire de travail. Ce fichier présente à la fois les résultats consolidés et les découvertes propres à chaque outil.
Cette organisation permet de conserver les résultats détaillés tout en disposant d'une vue d'ensemble des découvertes. Les différentes phases peuvent également être exécutées séparément, avec leurs propres paramètres de filtrage, sans perdre les résultats des autres phases lors de la mise à jour de la synthèse.
Les trois phases d'énumération
Par défaut, mon-recoweb exécute successivement trois phases de recherche. Chacune utilise une wordlist adaptée et poursuit un objectif particulier.
Phase 1 — Recherche générique avec DIRB
La première phase utilise dirb pour effectuer une recherche générale de répertoires et de fichiers sur la cible.
Le script utilise par défaut la wordlist common.txt, fournie avec DIRB et située dans :
/usr/share/wordlists/dirb/common.txt Cette liste contient des noms courants de répertoires et de fichiers que l'on peut rencontrer sur un serveur web.
Cette première recherche permet de repérer rapidement des éléments intéressants, comme des répertoires d'administration, des pages de connexion ou des fichiers de configuration accessibles depuis le serveur.
Phase 2 — Recherche de répertoires avec ffuf
La deuxième phase utilise ffuf pour effectuer une recherche spécifiquement orientée vers les répertoires.
Elle s'appuie par défaut sur la wordlist :
/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt Cette liste contient un ensemble beaucoup plus important de noms de répertoires potentiels.
ffuf utilise les noms contenus dans la wordlist pour construire et tester différentes URL sur le serveur web ciblé.
Cette deuxième recherche complète celle de DIRB en explorant un plus grand nombre de chemins possibles.
Phase 3 — Recherche de fichiers avec ffuf
La troisième phase utilise également ffuf, mais cette fois avec une wordlist orientée vers les noms de fichiers.
Par défaut, il s'agit de :
/usr/share/seclists/Discovery/Web-Content/raft-medium-files.txt L'objectif est de rechercher des fichiers potentiellement intéressants : scripts, pages web, fichiers de sauvegarde ou de configuration, par exemple.
Cette phase permet également de rechercher des extensions particulières grâce à l'option --ext, notamment php, txt ou bak.
Tu verras plus loin comment adapter ces extensions en fonction de la technologie utilisée par la cible.
Pourquoi combiner ces trois phases ?
DIRB fournit une première recherche générale, tandis que les deux phases ffuf permettent d'approfondir séparément la découverte des répertoires et des fichiers.
Les recherches peuvent produire certains résultats identiques, mais aussi des découvertes différentes en fonction des wordlists utilisées.
L'intérêt de mon-recoweb est non seulement d'enchaîner automatiquement ces trois phases, mais aussi de regrouper leurs découvertes dans un fichier de synthèse unique, RESULTS_SUMMARY.txt, afin d'obtenir une vue consolidée des résultats.
Adapter l'énumération à la cible
Les paramètres par défaut de mon-recoweb permettent de lancer une première reconnaissance sans configuration particulière. Mais au cours d'une résolution CTF, les informations découvertes peuvent t'amener à rechercher des fichiers spécifiques, à explorer un répertoire particulier ou à modifier les paramètres des scans.
Le script propose plusieurs options pour adapter les recherches à ces situations.
Cibler un répertoire précis
Plutôt que de relancer une énumération sur l'ensemble d'un site, tu peux limiter les recherches à un répertoire identifié précédemment.
Par exemple, si tu as découvert un répertoire /cgi-bin/, lance :
mon-recoweb cible.htb/cgi-bin/ Les trois phases d'énumération se concentrent alors sur ce chemin.
Tu peux également préciser le protocole dans l'URL, notamment lorsque le serveur utilise HTTPS :
mon-recoweb https://cible.htb/cgi-bin/ Rechercher des extensions particulières
Lorsque tu identifies la technologie utilisée par une application web, il peut être intéressant de rechercher certaines extensions de fichiers.
Par exemple :
mon-recoweb cible.htb --ext php,txt,bak L'option --ext permet d'ajouter les extensions indiquées à la recherche de fichiers effectuée par ffuf.
Tu peux ainsi adapter ton énumération à une application PHP ou rechercher d'éventuels fichiers de sauvegarde.
Autre exemple, pour explorer un répertoire /cgi-bin/ :
mon-recoweb cible.htb/cgi-bin/ --ext sh,cgi,pl Cette commande associe un ciblage précis à une recherche d'extensions adaptées aux scripts susceptibles de se trouver dans ce répertoire.
Choisir ses propres wordlists
Chaque phase utilise une wordlist par défaut, comme expliqué précédemment.
Tu peux toutefois les remplacer individuellement avec les options suivantes :
-
--dirb-wordlist: wordlist utilisée par DIRB. -
--raft-dirs: wordlist utilisée par ffuf pour les répertoires. -
--raft-files: wordlist utilisée par ffuf pour les fichiers.
Par exemple, pour utiliser une autre liste lors de la recherche de répertoires :
mon-recoweb cible.htb \ --raft-dirs /chemin/vers/ma-wordlist.txt Cette possibilité est utile lorsque tu disposes d'une liste spécialisée, adaptée à une technologie ou à un contexte particulier.
Ajuster les paramètres d'exécution
Selon la réactivité du serveur web, tu peux également adapter certains paramètres de ffuf.
| Option | Fonction |
|---|---|
-T, --threads | Nombre de threads utilisés par ffuf (30 par défaut). |
--rate | Limite le nombre de requêtes par seconde. |
--timeout | Définit le délai d'attente d'une réponse (10 secondes par défaut). |
Par exemple :
mon-recoweb cible.htb --threads 10 --rate 20 --timeout 15 Cette commande limite le nombre de threads à 10, fixe un maximum de 20 requêtes par seconde et porte le délai d'attente à 15 secondes.
Ces réglages peuvent être utiles lorsqu'un serveur répond lentement ou lorsque tu souhaites limiter l'intensité des requêtes.
Accéder aux options avancées
Les options présentées ici ne représentent qu'une partie des possibilités de configuration de mon-recoweb.
Pour afficher l'ensemble des paramètres disponibles, utilise :
mon-recoweb --help-advanced Tu y retrouveras notamment les options de ciblage, de sélection des phases, de personnalisation des wordlists, de filtrage et de gestion des résultats.
La partie suivante présente les filtres de ffuf, particulièrement utiles lorsque les recherches produisent un nombre important de résultats non pertinents.
Filtrer les résultats parasites
Lors d'une énumération web, il arrive que ffuf retourne un nombre très important de résultats, parfois plusieurs milliers. Cela ne signifie pas nécessairement que tous les répertoires ou fichiers détectés existent réellement.
Certaines applications renvoient en effet une réponse similaire pour de nombreuses URL inexistantes. Par exemple, un serveur peut rediriger systématiquement les requêtes vers une page d'accueil ou retourner une page d'erreur personnalisée avec un code HTTP 200.
Dans ces situations, il devient difficile de distinguer les découvertes intéressantes des réponses parasites.
Comprendre les codes HTTP et les tailles de réponse
Pour identifier les réponses à filtrer, commence par examiner deux informations affichées par ffuf :
- Status : le code HTTP retourné par le serveur (
200,301,302,403,404, etc.). - Size : la taille de la réponse HTTP, exprimée en octets.
Imaginons que plusieurs chemins inexistants retournent systématiquement le code 302, avec une réponse de 97 octets.
Ce comportement peut indiquer que le serveur redirige toutes les requêtes inconnues vers une même page.
Il devient alors intéressant de filtrer ces réponses pour mieux faire ressortir les autres résultats.
Filtrer selon le code HTTP
mon-recoweb permet de transmettre des options supplémentaires à ffuf avec --ffuf-extra.
Pour exclure les réponses HTTP 302, utilise :
mon-recoweb cible.htb \ --ffuf-extra "-fc 302" L'option -fc (filter code) demande à ffuf de ne pas afficher les réponses portant le code HTTP indiqué.
Tu peux également exclure plusieurs codes :
mon-recoweb cible.htb \ --ffuf-extra "-fc 302,401" Attention toutefois : un code HTTP 302 ou 401 peut aussi correspondre à une ressource réellement intéressante. Avant de le filtrer, vérifie qu'il caractérise bien les réponses parasites observées sur la cible.
Filtrer selon la taille de réponse
Lorsque les réponses parasites présentent une taille identique, le filtrage par taille peut être plus précis.
Par exemple :
mon-recoweb cible.htb \ --ffuf-extra "-fs 97" L'option -fs (filter size) exclut les réponses de 97 octets.
Cette méthode est particulièrement utile lorsque le serveur retourne le même code HTTP pour des ressources existantes et inexistantes, mais avec des tailles de réponse différentes.
Tu peux également indiquer plusieurs tailles :
mon-recoweb cible.htb \ --ffuf-extra "-fs 97,49,125" Les valeurs utilisées dans ces exemples sont fictives. Elles doivent être adaptées aux réponses réellement observées sur la cible.
Combiner plusieurs critères avec -fmode and
Il arrive que le filtrage par code HTTP ou par taille soit insuffisant.
ffuf permet alors de combiner plusieurs critères grâce à l'option -fmode and.
Par exemple :
mon-recoweb cible.htb \ --no-dirb \ --no-ffuf-dirs \ --ffuf-extra "-fc 302,401 -fs 97,49,125 -fmode and" Cette commande exécute uniquement la phase de recherche de fichiers avec ffuf.
Elle exclut les réponses qui correspondent simultanément aux deux conditions suivantes :
- Un code HTTP
302ou401. - Une taille de réponse de
97,49ou125octets.
Avec -fmode and, une réponse n'est donc écartée que si elle satisfait les deux critères. Cela permet de conserver, par exemple, une réponse HTTP 302 dont la taille ne correspond pas aux valeurs filtrées.
Ce filtrage combiné peut être particulièrement utile lorsque certaines réponses légitimes partagent le même code HTTP que les réponses parasites.
La détection automatique des soft-404
mon-recoweb intègre également une détection automatique de certaines réponses parasites.
Avant de lancer les recherches, le script teste une URL volontairement inexistante sur la cible.
Si le serveur retourne un code HTTP 200 malgré l'absence de cette ressource, le script mesure la taille de la réponse et peut utiliser cette valeur comme filtre pour les phases ffuf.
Ce comportement est appelé soft-404 : le serveur retourne une page correspondant à une ressource inexistante, mais avec un code HTTP qui indique normalement une réponse réussie.
Cette détection automatique constitue une première protection contre certains faux positifs.
Elle possède toutefois une limite : si le contenu de la page varie d'une requête à l'autre, sa taille peut également changer. Le filtre automatique risque alors de devenir insuffisant ou d'écarter des résultats intéressants.
C'est pourquoi il reste important de vérifier manuellement les réponses suspectes et d'adapter les filtres lorsque cela s'avère nécessaire.
Adapter les filtres à chaque phase ffuf
Les recherches de répertoires et de fichiers ne produisent pas nécessairement les mêmes réponses parasites.
Si les deux phases nécessitent des filtres différents, tu peux les exécuter séparément en désactivant les autres recherches.
Par exemple, pour rechercher uniquement les répertoires :
mon-recoweb cible.htb \ --no-dirb \ --no-ffuf-files \ --ffuf-extra "-fc 302 -fs 97 -fmode and" Puis, pour rechercher uniquement les fichiers :
mon-recoweb cible.htb \ --no-dirb \ --no-ffuf-dirs \ --ffuf-extra "-fc 302,401 -fs 97,49,125 -fmode and" Chaque phase dispose ainsi de filtres adaptés aux réponses observées.
Les résultats des différentes phases sont ensuite regroupés dans RESULTS_SUMMARY.txt, sans perdre les découvertes conservées des recherches précédentes.
Cette possibilité permet d'affiner progressivement l'énumération, plutôt que de relancer systématiquement les trois phases avec des paramètres identiques.
Exploiter les résultats de l'énumération
Une fois les recherches terminées, mon-recoweb rassemble les découvertes des trois phases dans un fichier unique, RESULTS_SUMMARY.txt.
Ce fichier permet de consulter les résultats sans devoir parcourir séparément les sorties de DIRB et des deux recherches ffuf.
Où retrouver les résultats ?
Par défaut, le script crée un répertoire scans_recoweb dans le répertoire de travail depuis lequel tu l'as lancé.
Lorsque la cible est un nom de domaine, un sous-répertoire portant ce nom est également créé.
Par exemple, après avoir exécuté :
mon-recoweb cible.htb Tu retrouveras le fichier de synthèse dans :
scans_recoweb/cible.htb/RESULTS_SUMMARY.txt Si tu cibles un répertoire particulier, le script ajoute également ce répertoire au chemin de sortie.
Tu peux modifier l'emplacement de base avec l'option -o ou --outdir.
Comment est organisé RESULTS_SUMMARY.txt ?
Le fichier commence par des informations permettant de retrouver le contexte de l'énumération :
- La commande utilisée pour lancer le script.
- Le nom et la version de
mon-recoweb. - La cible et le périmètre analysé.
- La date d'exécution.
Il contient ensuite deux grandes parties.
Résultat global (agrégé)
Cette première partie rassemble les découvertes des trois phases dans une liste commune.
Les URL sont normalisées et les résultats identiques sont regroupés afin de faciliter leur consultation.
Détails par outil
Cette seconde partie conserve les découvertes séparément, sous trois rubriques :
[DIRB][FFUF — DIRECTORIES][FFUF — FILES]
Tu peux ainsi retrouver les résultats de chaque recherche tout en disposant d'une vue consolidée.
Exemple de résultat
Voici un exemple simplifié et fictif de ce que tu pourrais retrouver dans le fichier :
=== Résultat global (agrégé) === http://cible.htb/admin/ (CODE:301|SIZE:0) http://cible.htb/login.php (CODE:200|SIZE:2480) http://cible.htb/robots.txt (CODE:200|SIZE:124) === Détails par outil === [DIRB] http://cible.htb/login.php (CODE:200|SIZE:2480) http://cible.htb/robots.txt (CODE:200|SIZE:124) [FFUF — DIRECTORIES] http://cible.htb/admin/ (CODE:301|SIZE:0) [FFUF — FILES] http://cible.htb/login.php (CODE:200|SIZE:2480) Dans cet exemple, login.php a été découvert par DIRB et par ffuf-files.
Il apparaît une seule fois dans le résultat global, mais reste présent dans les deux rubriques détaillées.
Les codes HTTP et les tailles de réponse permettent également d'identifier les ressources qui méritent une vérification.
Conserver les découvertes entre plusieurs recherches
Une autre particularité de mon-recoweb est sa capacité à conserver les résultats des phases qui ne sont pas relancées.
Imaginons que tu aies exécuté les trois phases, puis décidé de relancer uniquement ffuf-files avec des filtres plus précis.
Le script met alors à jour les résultats de ffuf-files tout en conservant ceux de DIRB et de ffuf-directories.
Le fichier RESULTS_SUMMARY.txt est ainsi reconstruit avec les nouvelles découvertes et les résultats conservés des autres phases.
Cette gestion fonctionne également lorsque les phases sont exécutées depuis plusieurs terminaux : le script synchronise l'écriture du fichier pour éviter les conflits entre les exécutions.
Analyser les découvertes
Le fichier de synthèse constitue un point de départ pour poursuivre l'investigation.
Lors de sa lecture, porte notamment ton attention sur :
- Les pages de connexion ou d'administration.
- Les répertoires inhabituels.
- Les fichiers de configuration ou de sauvegarde potentiellement accessibles.
- Les codes HTTP
301et302, qui peuvent révéler des redirections intéressantes. - Les réponses HTTP
403, qui indiquent qu'une ressource ou un chemin est interdit d'accès.
Une URL découverte ne constitue pas nécessairement une vulnérabilité.
L'étape suivante consiste à examiner les ressources intéressantes, à vérifier les réponses du serveur et à comprendre leur rôle dans l'application web.
C'est précisément l'intérêt du fichier de synthèse : disposer d'une vue organisée des découvertes pour orienter la suite de l'énumération.
Installation et première utilisation
Le code source de mon-recoweb est disponible dans mon dépôt GitHub public mes-scripts-public.
Prérequis
Avant de lancer le script, assure-toi de disposer de dirb, de ffuf, de curl, de flock, de jq, de column, de nc et des wordlists nécessaires aux recherches.
Sur Kali Linux, tu peux vérifier la présence de ces outils avec :
command -v dirb command -v ffuf command -v curl command -v flock command -v jq command -v column command -v nc Les wordlists utilisées par défaut ont été présentées dans la partie consacrée aux trois phases d'énumération. Vérifie également qu'elles sont présentes sur ton système.
Installer mon-recoweb
Plusieurs méthodes permettent d'installer mon-recoweb sur Kali Linux, selon que tu souhaites utiliser uniquement ce script ou disposer de l'ensemble de mes outils.
Méthode 1 — Télécharger uniquement mon-recoweb
Si tu souhaites utiliser uniquement mon-recoweb, tu peux télécharger directement son fichier depuis le dépôt GitHub public :
wget https://raw.githubusercontent.com/NoelNac-HackEthical/mes-scripts-public/main/mon-recoweb chmod +x mon-recoweb Il suffit ensuite de placer le script dans un répertoire déjà présent dans ton PATH, par exemple ~/.local/bin, pour pouvoir l'exécuter depuis n'importe quel répertoire de travail.
Cette méthode nécessite de vérifier manuellement la présence des dépendances et des wordlists utilisées par le script, ainsi que de gérer ses futures mises à jour.
Méthode 2 — Utiliser installe-mes-scripts
Pour installer et maintenir à jour l'ensemble de mes scripts, tu peux utiliser installe-mes-scripts, disponible sur HackEthical.
Sur cette page, clique sur le bouton Télécharger pour récupérer le script, puis rends-le exécutable et lance-le depuis ton terminal Kali Linux :
chmod +x installe-mes-scripts ./installe-mes-scripts L'installateur récupère l'ensemble des scripts publiés, les installe dans ~/.local/bin/mes-scripts/ et prend en charge leur mise à jour ainsi que leur accessibilité depuis le PATH.
Il s'occupe également de l'installation de la wordlist personnalisée utilisée par mon-subdomains, si elle n'est pas déjà présente.
Méthode 3 — Cloner le dépôt GitHub
Si tu es plus à l'aise avec Git et souhaites disposer localement de l'ensemble des scripts, tu peux également cloner directement le dépôt public :
git clone https://github.com/NoelNac-HackEthical/mes-scripts-public.git Tu disposeras alors d'une copie locale de tous les scripts publiés, que tu pourras consulter et exécuter depuis le répertoire du dépôt, ou intégrer à ton environnement selon tes préférences.
Cette méthode convient particulièrement aux utilisateurs qui souhaitent examiner les scripts, suivre leurs évolutions ou gérer eux-mêmes leur installation et leurs mises à jour.
En résumé, le téléchargement direct permet de récupérer uniquement mon-recoweb, tandis que installe-mes-scripts et le clonage du dépôt donnent accès à l'ensemble de mes scripts. Le clonage ne les installe toutefois pas automatiquement dans ton PATH.
Vérifier l'installation
Une fois l'installation terminée, vérifie la version de mon-recoweb :
mon-recoweb --version Pour la version présentée dans cet article, le résultat attendu est :
mon-recoweb v3.0.0 Tu peux également afficher l'aide :
mon-recoweb --help Et accéder à l'ensemble des paramètres de configuration avec :
mon-recoweb --help-advanced Lancer une première énumération
Pour commencer, place-toi dans le répertoire de travail de ta machine CTF.
Vérifie que le nom de domaine ciblé est correctement résolu depuis Kali Linux, puis lance :
mon-recoweb cible.htb Le script exécute les trois phases d'énumération avec leurs paramètres par défaut.
Les résultats sont enregistrés dans le répertoire scans_recoweb, créé automatiquement dans ton répertoire de travail.
À la fin des recherches, tu peux consulter le fichier de synthèse :
cat scans_recoweb/cible.htb/RESULTS_SUMMARY.txt Tu disposes ainsi d'une première vue des répertoires et fichiers découverts, que tu peux ensuite examiner pour poursuivre ton énumération.
Si les résultats sont trop nombreux ou contiennent des réponses parasites, les options de filtrage présentées précédemment te permettront d'affiner les recherches.
Conclusion
Avec mon-recoweb, j'ai voulu rendre l'énumération web plus simple à organiser et plus efficace lors de mes résolutions CTF.
En combinant dirb et ffuf dans un même script Bash, il devient possible d'automatiser trois recherches complémentaires, d'adapter les paramètres aux particularités d'une cible et de filtrer les résultats qui compliquent parfois l'analyse.
Le regroupement des découvertes dans RESULTS_SUMMARY.txt apporte également un avantage pratique : disposer d'une vue consolidée des résultats, sans perdre les informations propres à chaque phase.
Mais l'automatisation ne remplace pas l'analyse. Une URL découverte, un code HTTP inhabituel ou un fichier accessible ne constituent pas nécessairement une vulnérabilité. Ce sont avant tout des éléments à examiner pour orienter la suite de l'investigation.
mon-recoweb reste un outil que je fais évoluer au fil de mes résolutions Hack The Box, en fonction des besoins rencontrés et des améliorations qui me semblent utiles.
Si tu souhaites découvrir son fonctionnement plus en détail, tu peux consulter la documentation de mon-recoweb sur HackEthical.
Transparence éditoriale
Le script mon-recoweb a été développé avec l'assistance de ChatGPT, à partir de besoins rencontrés lors de mes résolutions CTF. Ses fonctionnalités, ses tests et ses évolutions reposent sur mon utilisation personnelle. ChatGPT m'a également accompagné dans la structuration, la formulation et la relecture de cet article.
