wfuzz, un fuzzer HTTP

décembre 21, 2007  |   Blog   |     |   Commentaires fermés sur wfuzz, un fuzzer HTTP

C’est un outil assez récent puisque publié le 18 Octobre 2007. Ecrit en python, « wfuzz » ( http://www.edge-security.com/wfuzz.php ) est un « Fuzzer ».

« Fuzzer » est une technique de test qualité qui consiste à injecter massivement et de manière automatisée des données aléatoires sans a priori (du « fuzz ») en entrée d’un programme. Ainsi, si un crash intervient, le défaut peut être noté puis corrigé.

En quoi cela peut-il nous être utile ? Dans nos activités de sécurité, ce type d’outil nous sert à « Brute-Forcer » un serveur Web, c’est à dire tester toutes les combinaisons possibles à partir soit d’un fichier dictionnaire ou bien d’un ensemble de caractères alphanumériques, ponctuation, etc.. .
Ci dessous quelques usages :

– identifiant / mot de passe, exemple typique :
python wfuzz.py -c --ntlm "mon_domaine\mon_user:FUZZ" -z file -f wordlists/megabeast.txt --hc 401  http://mon_site.com

– URL, exemple typique d’attaque sur IIS :
python wfuzz.py -c -z file -f wordlists/vulns/iis.txt --hc 401,404 http://www.mon_site.com/FUZZ

– variables dans une URL, exemple typique :
wfuzz.py -c -z range -r 1-100 --hc 404 http://www.mon_site.com/list.asp?id=FUZZ

Nous l’avons utilisé cette semaine lors d’un test d’intrusion (pentest) pour « brute-forcer » une authentification HTTP NTLM sur un serveur IIS.

Attention , comme notre distribution basée sur Debian ne possédait pas le package python « pycurl » supportant NTLM, nous avons dû recompiler libcurl puis pycurl à partir des sources :

wget http://curl.haxx.se/download/curl-7.17.1.tar.gz
tar zxvf curl-7.17.1.tar.gz
cd curl-7.17.1/
./configure
make
sudo make install
ldconfig

wget http://pycurl.sourceforge.net/download/pycurl-7.19.0.tar.gz
tar zxvf pycurl-7.16.4.tar.gz
cd pycurl-7.16.4/
sudo python setup.py install

On vérifie ensuite le support de NTLM dans pycurl ainsi :

$ python
Python 2.4.4c1 (#2, Oct 11 2006, 21:51:02)
[GCC 4.1.2 20060928 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pycurl
>>> pycurl.version_info()
(3, '7.17.1', 463105, 'i686-pc-linux-gnu', 540, 'OpenSSL/0.9.8b', 0, '1.2.3', ('tftp', 'ftp', 'telnet', 'dict', 'http', 'file', 'https', 'ftps'), None, 0, None)
>>>

Une fois l’attaque achevée, on obtient le résultat suivant :

Target: http://www.mon_site.com/exchange
Payload type: file
Total requests: 45463
===========================================================
ID Response Lines Word Request
===========================================================
00053: C=401 10 L 18 W "mon_domaine\administrateur:admin"

On constate un code retour HTTP 401 (Accès non autorisé). On ne gagne pas à chaque coup surtout quand les inconnues sont multiples: dans le cas présent, non seulement mot de passe mais également identifiant et nom de domaine.

Les commentaires sont fermés.