Skip to content

Scan d’application web avec wFuzz

Il y a quelques jours, je parlais de la surface d’attaque, ce qui est visible depuis l’extérieur et potentiellement vulnérable sur un SI. Wfuzz est un bon outil pour aider à établir sa surface d’attaque, étudions le plus en profondeur.

wFuzz, c’est quoi ?

wFuzz est un fuzzer web, c’est-à-dire un logiciel qui va faire du fuzzing, de l’injection de données pseudo-aléatoire dans les entrées d’un programme pour voir sa réaction. Avec wFuzz, il va être assez facile de déterminer les répertoires et fichiers qui peuvent être vus depuis l’extérieur de votre application web. wFuzz va en effet permettre de lister un ensemble de pages ou de dossiers sur un serveur ou une application web. Autrement dit, il s’agit d’un scanner de répertoire et de page web, wFuzz va opérer par brute force en testant la présence de répertoires, de fichiers, de mots ou de code hexa dans la réponse de la machine cible.

wFuzz est un outil écrit en Python et exécutable sur toutes les plate-formes, il faudra pycurl sous Linux pour avoir les librairies pouvant le faire tourner et un wfuzz.exe sous Windows. Je note également qu’il existe une interface graphique sous Windows et sous Linux  nommée WebSlayer.

Pour illustrer cet article, j’utilise wfuzz 2.0 sur une machine KaliLinux et ma machine cible sera une Debian 7.7 avec Apache2 installé. La machine cible va ici servir au visionnage des logs. Autrement dit, à voir ce que la cible va recevoir comme requête, ce qui nous aidera à mieux comprendre l’outil.

Utilisation de wFuzz

Prenons un premier exemple d’utilisation. Sur une cible, je souhaite savoir les applications et pages web qui sont joignables depuis l’extérieur, au lieu de tester à la main chacune des URL possibles avec le risque d’en oublier et de perdre du temps, je mets l’ensemble des noms d’applications web ou de pages qui me passent par la tête dans un fichier « rep_list.txt » ou j’en trouve un sur internet. Scannons ma cible 192.168.1.35 à l’aide de cette liste :

wfuzz -c -z file,rep_list.txt http://192.168.1.35/FUZZ

Voilà le retour terminal que l’on pourra voir :

Pour détailler l’option des commandes :

  • « -c » permet d’avoir un affichage en couleur de la sortie terminal, ce qui permet de voir plus rapidement les informations intéressantes comme on le voit sur l’image ci-dessus avec le code HTTP 301.
  • « -z » permet de spécifier le payload, c’est ce que l’on met en entrée de wFuzz et qui va être testé sur le serveur. Nous verrons que les payloads peuvent être gérés de façon plus avancée un peu plus loin.
  • On spécifie ensuite notre cible via une URL. La présence du mot « FUZZ » est ici obligatoire, toutes les chaînes et les mots à tester vont être remplacés à l’endroit de « FUZZ ».

Par exemple dans ce cas précis, voici ce que l’on pourra trouver dans les logs du serveur Apache ciblé :

utilisation web fuzzer wfuzz
Logs apache après un scan avec wFuzz

On peut également facilement utiliser deux fichiers et préciser à quel endroit mettre les entrées, par exemple si je dispose d’un fichier « user » et d’un fichier « password » :

wfuzz -c -z file,user.txt -z file,password.txt http://192.168.1.35/login.php?user=FUZZ&password=FUZ2Z

Ici, le contenu du fichier user.txt sera positionné à l’endroit où il est marqué « FUZZ » dans l’URL et « FUZ2Z » sera remplacé par le contenu du fichier « password.txt ».

Comme on peut le voir, wFuzz n’est pas discret du tout. En tant qu’administrateur système, il est facile de fausser le résultat d’un scan en interdisant tout simplement aux serveurs de répondre aux UserAgent « PyCURL » par exemple. Cependant il faut savoir que l’UserAgent (la signature de l’outil client qui fait la requête web) peut facilement être falsifiée avec l’option « -H » , comme ceci :

wfuzz -c -z file,rep_list.txt -H "User-Agent: Mozilla" http://192.168.1.35/FUZZ

Voilà alors ce que l’on pourra voir dans les logs :

utilisation web fuzzer wfuzz
Logs Apache après le changement du User-Agent wFuzz

Lorsque l’on souhaite tester un grand nombre d’éléments, on peut rapidement se perdre dans le signalement des erreurs 404, il est alors possible d’exclure du résultat affiché certains codes HTTP, certaines chaînes de caractères, mots ou lignes. Voici un exemple d’exclusion des erreurs 404 :

wfuzz -c -z file,rep_list.txt --hc 404 http://192.168.1.35/FUZZ

Outre les codes HTTP, on peut également porter notre exclusion sur le contenu d’une ligne, un mot ou certains caractères et même d’expression regexp !

Récursivité des répertoires

Par défaut, wFuzz n’opère que sur un niveau de répertoire. On peut néanmoins rendre le test plus précis et plus complet en mettant en place une récursivité. La récursivité va faire en sorte que, pour chaque répertoire n’ayant pas retourné un code 404, la liste des tests envoyés va être restesté pour ce répertoire.  Voyez plutôt avec cet exemple :

utilisation web fuzzer wfuzz
Récursivité des répertoires lors d’un scan wFuzz

Ici, le répertoire « wordpress » a été détecté comme présent (code HTTP 301), ainsi pour ce répertoire, toutes les autres possibilités vont être retestées avec « /wordpress/ » devant. On peut alors en fonction de notre liste d’entrée retrouver l’arborescence complète d’une application.  J’ai précisé une récursivité à 2 niveaux. Au-delà de deux répertoires, wFuzz va s’arrêter, on peut néanmoins aller plus loin que deux niveaux si on le souhaite.

Payloads et encodage

Parlons un peu des Payloads que peut utiliser Wfuzz. Les payloads sont simplement ce que wFuzz va aller tester sur le serveur en question. Il s’agit des valeurs que nous allons lui fournir en entrée. Pour reprendre notre précédent exemple, nous avons utilisé un payload de type « file » car nous avons fourni à wFuzz un fichier avec une valeur (nom de répertoire, chaîne de caractère, etc.) par ligne. Voici la liste des payloads acceptés par wFuzz que nous pouvons obtenir via :

wfuzz -e payloads
utilisation web fuzzer wfuzz
Liste des payloads pouvant être utilisés avec wFuzz

On voit donc qu’en plus des simples fichiers, on peut également spécifier une liste brute ( z list,user1-user2-user3), des valeurs en hexadécimale, un « range » (-z range,1-30) et également des noms. Voici un exemple de cette dernière fonctionnalité qui est assez pratique lors d’un pentest web. Admettons que l’on souhaite tester la sécurité d’un portail web et que nous connaissions l’identité d’un utilisateur « Albert Tirou » qui travail dans la société « NotSecure », voici ce que l’on pourra utiliser comme commande :

wfuzz -c -z names,albert-Tirou-NotSecure http://192.168.1.35/login.php?id=FUZZ

Voilà les tests que va faire wFuzz :

utilisation web fuzzer wfuzz
Utilisation du payloads « names » dans wFuzz

wFuzz nous génère alors automatiquement un ensemble de possibilités à partir des noms fournis. On reconnaît facilement dans ces lignes la plupart des constructions de login qui peut être utilisé en entreprise : 1re lettre du prénom, point, nom, etc.

Au-delà des payloads que l’on fournit en entrée à wFuzz, celui-ci est capable de les traiter afin d’effectuer des tests plus avancés. On va en effet avec les encodeurs pouvoir effectuer des traitements supplémentaires comme :

  • encodage base64
  • encodage HTML
  • hashage md5
  • etc.

On peut avoir la liste complète des encodeurs disponibles à l’aide de la commande suivante :

wfzz -e encodings
utilisation web fuzzer wfuzz
Liste des encodages possibles lors de l’utilisation de wfuzz

Leur utilisation est assez simple également, pour hasher nos valeurs provenant de notre liste de nom par exemple, il faut utiliser la ligne de commande suivante :

wfuzz -c -z names,albert-Tirou-NotSecure,md5 http://192.168.1.35/login.php?id=FUZZ

Exemple d’utilisation de l’encodeur « md5 » de wFuzz

Génération de rapport

Au-delà de la sortie terminal, on peut également générer des rapports en HTML avec wFuzz, ce qui facilite la rédaction des rapports d’intrusion et de sécurité qu’un pentester est généralement amené à faire. Pour cela, il suffit d’ajouter l’option « -o HTML » à la fin de notre rapport puis de rediriger la sortie voulue dans un fichier :

wfuzz -c -o HTML -z names,albert-Tirou-NotSecure http://192.168.1.35/login.php?id=FUZZ 2>rapport.html

Voici la forme qu’aura notre rapport HTML :

utilisation web fuzzer wfuzz
Rapport HTML généré par wFuzz

La forme peut être à revoir pour l’intégrer dans un rapport officiel, mais quelques bases de CSS suffiront ;). wFuzz peut également gérer l’export des données au format du logiciel magictree qui permet de centraliser les données d’un test d’intrusion et de générer des rapports.

wFuzz en interface graphique :  WebSlayer

WebSlayer n’est rien d’autre qu’une interface graphique pour l’utilisation de wFuzz, il faut savoir que WebSlayer existe pour Windows et pour Linux. Nous allons faire un rapide tour de l’outil qui reprend dans son fonctionnement et son principe ceux de wFuzz, voici la fenêtre dans laquelle on peut déterminer notre cible et paramétrer le proxy si besoin :

wfuzz graphique WebSlayer
Interface graphique WebSlayer pour l’utilisation de wFuzz

On voit également la présence des onglets « payload », « attack result », « Encoder » et « logs » qui présentent les mêmes fonctions que la ligne de commande comme nous l’avons vu un peu plus haut. Pour ma part, je préfère l’utilisation de la ligne de commande qui est beaucoup plus rapide et intuitive que l’interface graphique.

Et vous, ligne de commande ou interface graphique ? Quels outils préférez-vous pour vos pentests et scans web ?

Partager :
Published inOutils

One Comment

  1. Aguay

    Ah !
    je connaissais Webslayer, mais je ne savais pas que ça utilisais wFuzz x)
    En effet, je comprends un peu mieux le soft maintenant ! Merci 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *