BABELWEB v1.0 Stéphane Aubert kotao HSC security research labs Hervé Schauer Consultants Téléchargement: http://www.hsc-labs.com/tools/babelweb/ Description ----------- babelweb est né du besoin d'avoir des outils plus puissants pour réaliser des tests d'intrusion sur les serveurs de commerce électronique dans le sens large. Les applications sur les serveurs web en général sont de plus en plus complexes sans pour autant être de plus en plus sécurisées. Il est devenu intéressant de disposer d'un outil permettant de s'approcher du comportement d'un humain dans le test des applications web. Pour l'être humain : babelweb --rfc | more Ce que fait babelweb ----------------- babelweb est un programme qui permet d'automatiser des tests sur un serveur HTTP. Il est capable de suivre les liens et les redirections HTTP mais il est programmé pour rester sur le serveur d'origine. Le but principal de babelweb est d'obtenir des informations sur un serveur web distant et de classer ces informations. Il est ainsi possible de dresser la liste des pages accessibles, des scripts cgi rencontrés, des différents fichiers trouvés comme les .zip, les .pdf ... Une synthèse de ces informations est proposée dans un fichier html dont le nom peut être fixé avec l'option --out-html. L'ensemble des tests disponibles est activé par défaut. Pour désactiver l'exécution d'un test il faut utiliser l'option --no nom_du_test. L'option --no all désactive tous les tests (sauf celui nommé 'ident' qui tente d'identifier la version du serveur avec une requête HEAD / HTTP/1.0). Ce test peut quand même être désactivé en forçant --no all,ident. Tous les tests peuvent être réactivés avec l'option --run. Pour ne lancer que les scans cgi il faut utiliser les options --no all --run common,cgi. Ces tests/fonctionnalités sont : . ident essaye d'identifier le serveur (empreintes http disponibles dans la prochaine version :) . tests teste le serveur sur le relayage . common recherche les liens usuellement vulnérables, ces liens sont renseignés dans le fichier common_vuln_cgi.txt . cgi recherche les cgi vulnérables que babelweb sait exploiter . spider exécute le robot . analyse analyse les résultats du robot . summary affiche la synthèse des résultats . cookie envoie tous les cookies . follow-redir suit les redirections HTTP . all tout ceci Trois fonctionnalités supplémentaires sont disponibles en plus de celles désactivables par l'option --no, ce sont : --pbs adresse_ip:port_from-port_to pour transformer babelweb en scanner de ports TCP par relayage HTTP --auth login:BRUTEFORCE pour transformer babelweb en brute forcer HTTP --force ... pour transformer babelweb en générateur générique de requêtes voir le paragraphe "generic HTTP brute forcer" pour les paramètres de cette option Modes de fonctionnement ----------------------- Babelweb peut fonctionner dans différents modes : --aggressive permet le mode agressif (exécute une exploit quand c'est possible) --interactive soit intéractif durant les exploits --allow-crash permet le mode crash --anti-ids active le mode anti-IDS . 1 delim = deux espaces, génère toujours une alerte dans RealSecure :) . 2 remplace / avec /./ (pris de whisker) . 3 encode l'URL (pris de whisker) . 4 encode l'URL en unicode . 5 URL aléatoire longue (pris de whisker) . 6 utilise le délimiteur windows (pris de whisker) . 7 delim = \t (pris de whisker) Détection de babelweb --------------------- Une entête est systématiquement ajoutée pour rendre babelweb détectable par les IDS. Ceci permet de ne tromper que les mauvais script-kiddies. Xtag: 4261-6265-6c57-6562 Options ------- --out-html spécifie le nom du fichier de sortie html --no-color désactive la sortie couleur (pour journalisation) --show-cookie affiche les cookies à leur réception (même si le mode verbeux est désactivé) --all-cgi n'essait pas d'être intelligent (scanne les tous ;) --url point de départ pour le robot --port spécifie le port tcp distant auquel se connecter --proxy spécifie le relais à utiliser (--proxy ip:port) --auth l'authentification http à utiliser --break-asap s'arrête dès que quelque chose d'intéressant est détecté, continue autrement ... --agent fixe le nom du programme client (user agent) --verbose | -v mode verbeux -vv plus verbeux --debug mode de débogage --help cette aide Proxy Bounce Scanner -------------------- --pbs ne démarre que le proxy bounce scanner (scanner de ports par rebonds sur un relais) brute forcer HTTP ----------------- --auth login:BRUTEFORCE démarre le brute forcer --auth-gen file: génération d'authentification depuis un fichier --auth-gen run:'john ...' génération d'authentification depuis une commande externe --auth-gen 'pwd[:pwd[...]]' liste d'authentifications Brute forcer HTTP générique --------------------------- Cette fonctionnalité permet de chercher des pages sur un serveur web par interrogations successives. Il est possible de créer dynamiquement des requêtes en fonction d'un générateur. Ce générateur compose des chaînes avec des mots qui proviennent soit de la ligne de commande, soit d'un fichier, soit d'un programme externe comme John the Ripper. Les options principales sont --auth-gen et --force. --auth-gen "test:demo:passwd" --auth-gen "file:/tmp/dict" --auth-gen "run:john -inc -stdout:5" L'option force permet de créer les requêtes selon les graines obtenues avec --auth-gen --force geturl:"%s/index.html" ajoute une chaîne à l'url des requêtes GET --force posturl:"passwd=%s" ajoute une chaîne à l'url des requêtes POST --force getheader:"Cookie" ajoute "Cookie: %s" aux entêtes des requêtes GET --force postheader:"Cookie" ajoute "Cookie: %s" aux entêtes des requêtes POST Exemples de résultats de ces commandes : % babelweb --force geturl:"%s/index.html" \ --auth-gen "run:john -inc -stdout:2" -v GET //index.html HTTP/1.0 GET /*/index.html HTTP/1.0 GET /aa/index.html HTTP/1.0 GET /pj/index.html HTTP/1.0 GET /pl/index.html HTTP/1.0 GET /a2/index.html HTTP/1.0 % babelweb --force posturl:"passwd=%s" \ --auth-gen "run:john -inc -stdout:2" -v POST / HTTP/1.0 User-Agent: babelweb Content-length: 9 passwd=pj % babelweb --force getheader:"Cookie" \ --auth-gen "run:john -inc -stdout:5" -v GET / HTTP/1.0 User-Agent: babelweb Cookie: steve % babelweb --force postheader:"Cookie" \ --auth-gen "run:john -inc -stdout:5" -v POST / HTTP/1.0 User-Agent: babelweb Cookie: 1951 Content-length: 0 Il est aussi possible de tester plusieurs User-Agent. Pour cela il y a un mot clef spécial pour changer le User-Agent: AGENT. % babelweb --force getheader:"AGENT" \ --auth-gen "run:john -inc -stdout:5" -v GET / HTTP/1.0 User-Agent: steve GET / HTTP/1.0 User-Agent: steph Les options suivantes permettent aussi de modifier le comportement du brute forcer : --url /local/test.html Permet de changer l'url demandée. GET /local/test.html HTTP/1.0 User-Agent: sammy --auth aubert:babel Permet d'ajouter une authentification HTTP. GET /local/test.html HTTP/1.0 User-Agent: sammy Authorization: Basic YXViZXJ0OmJhYmVs --force-error "Error: invalid password" Dans son fonctionnement normal, le brute forcer affiche les url des pages qui ont un code de retour de 200. L'option --force-error permet de n'afficher que les url des pages dont le code de retour est 200 et qui ne contiennent pas la chaîne de caractères spécifiée par cette option. Cette option est très utile car beaucoup de messages d'erreur sont renvoyés dans des pages valides (code de retour 200). Ce que ne fait pas babelweb --------------------------- babelweb ne permet pas d'interroger un serveur HTTPS directement. Il faut par exemple utiliser stunnel puis lancer babelweb sur l'adresse locale et le port donné à stunnel. Exemple: babelweb localhost --port 8080 babelweb ne permet pas l'interprétation de javascript, par exemple, ce qui sur certains serveurs aujourd'hui pose un gros problème de fonctionnement. Divers exemples d'utilisation ----------------------------- Complet : babelweb -vv (pour les gamins) babelweb -v --proxy (sans danger) babelweb -vv --aggressive --allow-crash \ --agent 'my favorite spider' (peut être dangereux) babelweb --agent "Internet Exploser" --no all --run cgi -v \ --aggressive --interactive (hostile) babelweb --port 81 -vv --anti-ids 1253 (activisme;)) Scan de CGI : babelweb --no all --run cgi babelweb --no all --run common,cgi --all-cgi babelweb --no tests,common --url /appli/ \ --auth login:passwd -v (recherche les cgi spécifiques à une application) Robot : babelweb --no all --run spider,cookie,summary -v babelweb --no all --run spider --url /appli/ --show-cookie (n'envoie pas Cookie: mais montre Set-Cookie:) Proxy Bounce Scanner : babelweb --port 8080 --pbs -v Brute forcer HTTP : babelweb -v --auth :brute force (liste par défaut des mots de passe faibles sur la racine du serveur) babelweb -v --auth :bruteforce \ --auth-gen file:names.dict --url /private/ babelweb -v --auth :bruteforce \ --auth-gen 'run:john -inc -stdout:1' --url /private/ Brute forcer générique HTTP : babelweb --force 'geturl:?param=' -v --url '/cgi/test.cgi' \ --auth-gen file:foo --force-error Construction babelweb --force postheader:"My-files" \ --auth-gen run:"sh -c /bin/ls" -v babelweb --url / --force geturl:"blah/%s.html" \ --auth-gen run:gen.sh -v résultats: ---------- GET /blah/1,1098,,00.html HTTP/1.0 GET /blah/1,1099,,00.html HTTP/1.0 GET /blah/1,1100,,00.html HTTP/1.0 gen.sh: ------- #!/bin/sh num=1000 while [ $num -le 2000 ] ;do echo "1,$num,,00" num=`expr $num + 1` done Je vous laisse deviner ce que font les commandes suivantes : babelweb --url /cgi-bin/collect.pl \ --force posturl:"file=hosts&data=%s" --auth-gen file:/etc/hosts -v babelweb --url / --force getheader:"X-Files" \ --auth-gen file:/etc/hosts -v Remerciements ------------- HSC security research labs et plus particulièrement . Denis Ducamp pour la documentation et la qualité de ses conseils . Frédéric Lavecot pour ses idées et ses tests . Yann Berthier et Nicolas Jombart pour leur passion