W3AF:Architecture
Architecture de W3AF
Organisation générale de W3AF
La navigation dans les menus de W3AF en mode console est organisée comme suit :
Plugins
Catégories de plugins
W3AF est composé de deux éléments: le coeur assure le fonctionnement de l'outil, et les plugins permettant l'ajout de fonctionnalités à W3AF. Les plugins sont classés dans une des catégories suivantes :
Ces catégories sont détaillées dans les paragraphes qui suivent.
Flux d'informations entre les plugins
Les flux d'informations au sein des plugins sont organisés comme suit :
__________________________________________________________________________ / \ | +-------------------------------------+ | | | [ DISCOVERY ] -----> [ BRUTEFORCE ] | -----> [ AUDIT ] -----> [ ATTACK ] | | | <----- | | | +-------------------------------------+ | \__________________________________________________________________________/ ^ | | | | | | | | V V V [ GREP ] -----> [ OUTPUT ] <----- [ EVASION ]
discovery
Ces plugins ont pour objectif de découvrir un maximum de pages susceptibles de constituer des points d'entrée (url, formulaires, etc.) pour les fournir aux plugins audit.
Nom du plugin | Description | Paramètres |
---|---|---|
MSNSpider | Consulte la base MSN afin d'obtenir une liste de nouvelles URL. Recherche si l'hôte a un système de filtrage (IPS ou WAF). |
|
allowedMethods | Enumère la liste des méthodes autorisées à partir d'une URL. |
|
archiveDotOrg | Consulte archive.org pour trouver de nouvelles pages à partir du site cible. Ce plugin accepte le paramètre suivant : |
|
crossDomain | Analyse le fichier crossdomain.xml utilisé par Flash. Utilisé comme ACL, ce fichier fournit des informations relatives aux domaines autorisés. | |
detectReverseProxy | Tente d'évaluer si l'hôte est derrière un reverse proxy en envoyant une requête et en recherchant la chaîne "Via" dans l'en-tête de la réponse. | |
detectTransparentProxy | Tente d'évaluer si un proxy transparent est installé en se connectant à une série d'adresses IP sur le port 80. Si toutes les requêtes retournent un socket ouvert (open), c'est le proxy qui répond. | |
digitSum | A partir d'un fichier contenant des nombres (index1.php), tente de rechercher d'autres fichiers par incrémentation (index2.php, index3.php, etc.). |
|
dnsWildcard | Evalue si www.cible.com et cible.com retournent la même page. | |
domain_dot | Construit une requête sur le nom de la cible avec un point à la fin de l'adresse (http://www.cible.com./) et analyse la réponse. Il arrive que dans certains cas de mauvaise configuration, il soit posssible de lire les fichiers sources du site. | |
dotNetErrors | .aspx ou default~.aspx. | |
findBackdoor |
Tente de trouver des portes dérobées web (web backdoors) et des terminaux web (web shells) à la racine du site fourni comme paramètre target. Par exemple, si le site cible est http://host.tld/w3af/, les adresses suivantes seront testées : |
|
findCaptchas | Identifie les images captcha sur les pages Web. Pour ce faire, les pages sont appelées deux fois, et les hashes d'images sont comparés. S'ils diffèrent, l'image est susceptible d'être générée aléatoirement et d'être un captcha. | |
findvhost | Recherche des hôtes virtuels (virtual hosts) en comparant le paramètre Host de l'en-tête HTTP sur différentes pages. Si celui-ci est le même pour plusieurs sections du site (intranet vs. public), et que le serveur est mal configuré, il est possible de lister les virtual hosts. Ce plugin n'est pas basé sur les techniques DNS. | |
fingerGoogle | Utilise l'API Google afin d'obtenir une liste d'utilisateurs d'un domaine. |
|
fingerMSN | Consulte la recherche MSN pour obtenir une liste d'utilisateurs d'un domaine. |
|
fingerPKS | Recherche une liste d'adresse mail d'un domaine par interrogation des serveurs PGP PKS. | |
fingerprint_WAF | Tente d'évaluer si un firewall applicatif Web (WAF: Web Application Firewall) est installé et tente d'en récupérer le nom et la version. L'évaluation repose sur la présence du plugin afd (Active Filter Detection). | |
fingerprint_os | Tente une prise d'empreinte en utilisant le protocole HTTP. Pour le moment, l'implémentation est relativement simpliste. En effet, si les adresses http://host.tld/abc/def.html et http://host.tld/abc\def.html remontent la même page, le plugin détermine que le système installé est Windows. | |
frontpage_version | Recherche des fichiers d'informations FrontPage (par exemple _vti_inf.html) et, le cas échéant, tente de déterminer la version de FrontPage. | |
ghdb | Utilise la base de données GHDB (Google Hack DataBase mise à disposition par Johnny) pour rechercher des vulnérabilités. |
|
googleSets | Utilise les proposition de rapprochement de mots Google (google sets) afin de trouver de nouvelles adresses. Par exemple, si l'adresse fournie est http://foo.bar/default.php?color=blue, et que "blue" est fournie à Google sets, ce dernier pourra retourner "white" et l'adresse sera http://foo.bar/default.php?color=white. |
|
googleSpider | Utilise l'API Google pour trouver de nouvelles adresses. La chaîne "site:domaine.com" est fournie à Google et chaque résultat retourné est testé par l'envoi d'une requête GET. |
|
halberd | Tente d'évaluer si l'hôte utilise un équilibrage de charges (load balancer). | |
hmap | Tente une prise d'empreinte du serveur cible (apache, iis, tomcat, etc.) |
|
importResults | Teste des adresses à partir d'un fichier dont chaque ligne contient les paramètres suivants, séparés par des virgules : HTTP-METHOD,URI,POSTDATA |
|
oracleDiscovery | Tente une découverte d'Oracle sur le système cible. | |
phishtank | Consulte la base de données phishtank.com pour déterminer si l'hôte est référencé (phishing scams). |
|
phpEggs |
Tente une prise d'empreinte sur la version de PHP en consultant les oeufs de Pâques. Les adresses testées sont les suivantes :
Cette recherche n'aboutit cependant pas si la directive "expose_php" est à "off" dans le fichier "php.ini" sur le serveur cible. |
|
phpinfo | Recherche phpinfo dans toute l'arborescence de l'adresse fournie, afin d'obtenir le maximum d'informations. | |
pykto | Un port nikto pour Python. Utilise le fichier scan_database de nikto afin de découvrir des adresses vulnérables. |
|
robotsReader | Analyse le fichier robots.txt pour trouver de nouvelles adresses. | |
serverHeader | Evalue le type de serveur en se basant sur les en-têtes récupérées par une requête GET. |
|
serverStatus | Tente une découverte de nouvelles adresses par le fichier cgi "server-status" d'Apache. | |
sharedHosting | Utilise la recherche MSN pour déterminer si la cible est dans un espace mutualisé (shared hosting). La recherche envoyée est la chaîne "ip:82.240.150.190" où "82.240.150.190" est remplacé par l'adresse IP du serveur testé. |
|
sitemapReader | Analyse le fichier sitemap.xml pour trouver de nouvelles adresses. Ce fichier est utilisé pour une meilleure indexation par le moteur de recherche Google. | |
spiderMan | Proxy local pour récupérer de nouvelles adresses. Utile lorsque des applets Java ou Flash sont présentes. Dans ce cas, le proxy se basera sur la navigation effectuée manuellement par l'auditeur avec son navigateur. |
|
urlFuzzer |
Tente de trouver des sauvegardes (backups), codes sources et assimilés. Si par exemple, la page cible est http://site/default.aspx, les adresses suivantes seront testées : |
|
userDir |
Tente une découverte de répertoires utilisateurs en se basant sur les résultats envoyés par les autres plugins, et identifie le système d'exploitation ainsi que les applications installées pour les utilisateurs découverts. Si par exemple l'URL de base est http://domaine.com/index.php, et que le plugin de découverte de mail renvoie les adresses "[email protected]" et "[email protected]", les pages testées seront : |
|
webDiff | Compare un répertoire local avec une adresse distante. |
|
webSpider | Suit tous les liens des pages pour découvrir de nouvelles adresses. |
|
wordnet | Utilise la base de données Wordnet pour exploiter des équivalences de mots et ainsi découvrir de nouvelles adresses. Par exemple, si l'adresse fournie est "http://site/a.php?color=blue", les adresses suivantes seront testées : http://site/a.php?color=white, http://site/a.php?color=black, etc. |
|
wsdlFinder | Tente une récupération des fichiers de définition des web services en ajoutant la chaîne "?WSDL" aux adresses trouvées. | |
yahooSiteExplorer | Utilise l'index de Yahoo (Yahoo site explorer) pour découvrir de nouvelles adresses. |
|
zone_h | Recherche sur le site http://www.zone-h.org/ si le site a déjà été défacé et, le cas échéant, relève la nature de l'exploit. |
audit
Ces plugins se basent sur les résultats envoyés par les plugins discovery afin de déceler des vulnérabilités (injection sql, xss, buffer overflows, response splitting, etc.) dans les pages renvoyées. Les vulnérabilités ainsi découvertes sont ajoutées à la base de connaissance en tant que vuln objects.
Nom du plugin | Description | Paramètres |
---|---|---|
LDAPi | Cherche des injections LDAP en envoyant une chaine spéciale et en analysant la réponse. | |
blindSqli | Cherche des vulnérabilités par des injections SQL à l'aveugle |
|
buffOverflow | Cherche des failles de dépassement de tampon (buffer overflow). Ceci n'est possible que pour les languages où la mémoire est gérée par le developpeur (par exemple cgi-c) et si les erreurs sont activées. | |
dav | Cherche des erreurs de configuration WebDAV, souvent liées au paramétrage du serveur lui-même plutôt qu'au paramétrage de l'application Web. Ce plugin tente d'uploader un fichier dans un répertoire où WebDAV est activé, ce qui n'est, dans le cas d'un serveur correctement configuré, pas possible. | |
eval | Cherche des vulnérabilités liées à l'utlisation de la fonction eval(). |
|
fileUpload | Tente d'exploiter des vulnérabilités liées à l'upload de fichiers, en tentant d'uploader sur le serveur cible des fichiers au format correct, mais possédant un champ commentaires qui ne devrait pas être autorisé (contenant du code exploitable). |
|
formatString | Cherche des vulnérabilités liées aux formats chaînes. De telles erreurs ne peuvent être découvertes que pour les languages pouvant générer ce type de bug et à condition que les erreurs soient activées sur le serveur. | |
frontpage | Tente d'uploader un fichier sur le serveur en exploitant le script "author.dll" fourni par FrontPage. |
|
generic | Cherche des erreurs génériques, sans utiliser de base de données de vulnérabilités spécifique à l'implémentation serveur (PHP, J2EE, ...). |
|
globalRedirect | Cherche des vulnérabilités de redirection globale. Ces vulnérabilités sont souvent exploitées dans les attaques de "phishing" et autres vols d'informations. Par exemple, une page qui accepte comme paramètre une URL et que l'appel de cette page retourne une erreur HTTP 302 (page déplacée temporairement). | |
htaccessMethods | Cherche des erreurs de configuration dans le paramètre "<LIMIT>" des fichiers .htaccess d'Apache. Par exemple, il est possible d'exploiter une faille dans la limitation des méthodes spécifiées dans une balise "<LIMIT GET>". Dans ce cas, il est par exemple possible d'exploiter la méthode POST. Pour plus d'informations, vous pouvez lire l'excellente documentation suivante : http://www.kernelpanik.org/docs/kernelpanik/bme.eng.pdf. | |
localFileInclude | Cherche des vulnérabilités d'inclusions locales. Recherche par exemple la chaîne "root:x:0:0:" en tentant d'inclure en paramètres un chemin du type "../../../../../etc/passwd". | |
mxInjection | Cherche des vulnérabilités liées aux injections MX (mails). | |
osCommanding |
Cherche des vulnérabilités liées aux injections de code (OS commanding). Deux techniques sont employées :
|
|
phishingVector | Recherche des vecteurs de phishing en exploitant des failles d'inclusions distantes. Par exemple "http://victim.com/?url=http://attacker.com". | |
preg_replace | Recherche de mauvaises utilisations de la fonction PHP "preg_replace". Cette fonction est vulnérable lorsque l'utilisateur peut contrôler l'expression réugilière ou la chaîne envoyée à la fonction "preg_replace", et que le modificateur "e" est utilisé. Pour plus de renseignements sur le modificateur "e", voir ici : http://www.talkincode.com/using-the-e-modifier-in-php-preg_replace-400.html. | |
remoteFileInclude | Cherche des vulnérabilités d'inclusions distantes. Il est possible, pour ce faire, d'utiliser le serveur distant W3AF (paramètre useW3afSite), ou de spécifier un autre serveur (paramètres listenPort et listenAddress). |
|
responseSplitting | Utilise la technique du HTTP Splitting pour référencer des points d'entrées. La chaîne "w3af\r\nVulnerable: Yes" est envoyée à tous les points d'injection, et la chaîne "Vulnerable" est recherchée dans les en-têtes de réponse. | |
sqli | Effectue des injections SQL (la chaîne d'z"0 est envoyée à tous les points d'injection) dans le but de générer des erreurs SQL. | |
ssi | Cherche des vulnérabilités d'inclusions côté serveur (SSI : Server Side Include). | |
sslCertificate | Analyse les paramètres des certificats SSL afin d'en étuder leur validité. L'utilisation de ce plugin n'est pertinente que pour les sites en HTTPS. | |
unSSL | Vérifie si les pages disponibles en HTTPS le sont également en HTTP. | |
xpath | Cherche des vulnérabilités liées aux injections XPATH. Injecte pour ce faire la chaîne "d'z'0" à tous les points d'injection et recherche dans les réponses des erreurs XPATH. | |
xsrf | Cherche des vulnérabilités de XSRF (Cross Site Request Forgeries). La forme la plus basique de XSRF est pour le moment implémentée. En effet, si l'application stocke des cookies permanents et qu'elle accepte des paramètres, elle est réputée vulnérable. | |
xss | Recherche des failles de Cross Site Sripting (XSS).
|
|
xst | Cherche des vulnérabilités de Cross Site Tracing (XST). La méthode TRACE renvoie les requêtes qu'elle reçoit. |
grep
Ces plugins permettent une reconnaissance par mots clés (grep) dans le code des pages renvoyées, afin d'isoler les commentaires, les champs de mots de passe, les adresses IP, etc.
Nom du plugin | Description | Paramètres |
---|---|---|
ajax | Identifie toutes le pages contenant des traces de code Ajax. | |
blankBody | Recherche des pages avec un corps vide pouvant indiquer des sources d'erreurs ou de mauvaise configuration. | |
codeDisclosure | Identifie toutes les pages contenant des publications de code en utilisant le module "re" (filtrage sur "<?.*?>" pour le PHP et "<%.*%>" pour l'ASP). | |
collectCookies | Cherche dans toutes les réponses des traces de cookies de session et les analyse afin d'en déceler des vulnérabilités. | |
creditCards | Identifie les pages contenant des numéros de cartes de crédit. | |
directoryIndexing | Recherche des problèmes d'indexation de répertoires dans les réponses. | |
domXss | Identifie toutes les pages présentant des traces de DOM XSS. Pour plus d'informations : http://www.webappsec.org/projects/articles/071105.shtml. | |
dotNetEventValidation | Recherche des pages .Net présentant dans l'en-tête EnableEventValidation="false" (paramètre permettant de s'assurer que chaque réponse provient du bon contrôle). Ces pages peuvent présenter des failles permettant d'outrepasser une authentification. | |
error500 | Identifie toutes les pages retournant un code 500 ("Internal Server Error" ou, en français, "Erreur interne du serveur"), et n'ayant pas été identifiées par les autres plugins. | |
errorPages | Recherche les pages en erreur et tente de récupérer des informations serveur (nom du serveur Web et version). | |
feeds | Recherche les pages contenant des flux rss, atom ou opml. Cela permet d'identifier le générateur de flux et de déterminer le framework de développement. Par ailleurs, les injections de flux sont également testées. | |
fileUpload | Identifie les pages contenant des formulaires permettant l'upload de fichiers. | |
findComments | Recherche les commentaires dans les pages. |
|
getMails | Recherche des adresses email dans les pages. Ces comptes pourront ensuite servir aux plugins bruteforce. |
|
hashFind | Analyse les hashes dans les réponses HTTP. | |
httpAuthDetect | Détecte les pages protégées par une authentification HTTP. | |
httpInBody | Recherche des chaînes de requêtes ou réponses HTTP dans les corps des réponses. Utilisé par les développeurs pour le debugging. | |
lang | Détermine la langue du site par la lecture de N pages. | |
metaTags | Recherche les informations (meta tags) intéressantes dans les pages, comme par exemple "microsoft", "visual", "linux", etc. | |
motw | Fournit une indication de conformité au standard MOTW, Mark Of The Web (http://msdn2.microsoft.com/en-us/library/ms537628.aspx). Le standard MOTW se matérialise par un commentaire du type <!-- saved from url=(0023)http://www.contoso.com/ --> destiné à Internet Explorer. |
|
newline | Identifie le type de saut de ligne (newline) utilisé dans les pages et évalue si le fichier a été créé sous Windows, Linux ou Mac. | |
objects | Recherche les objets et applets contenus dans les pages. | |
oracle | Recherche des informations Oracle (messages, versions, etc.). | |
passwordProfiling | Créé une liste de mots de passe possibles en analysant les corps de réponses HTTP (pondération des occurences mots). | |
pathDisclosure | Recherche les pages présentant des traces de fichiers ("C:\www", "iles\...", "/var/www/..."). Les résultats sont sauvegardés dans le KB et exploités par les autres plugins. | |
privateIP | Recherche des adresses IP privées dnas les corps de réponses et les en-têtes. | |
ssn | Recherche des numéros de sécurité sociale (format US) dans les pages Web. | |
strangeHTTPCode | Analyse les codes de réponses HTTP renvoyés par l'application Web cible à la recherche d'éléments non communs. | |
strangeHeaders | Recherche les en-têtes non standards présents dans les réponses HTTP pour identifier des modules spéciaux et autres fonctionnalités. | |
strangeParameters |
Recherche les pages contenant des paramètres particuliers dans les réponses HTML, comme par exemple : |
|
svnUsers | Recherche des noms d'utilisateurs SVN/CVS dans toutes les réponses et, le cas échéant, les stockent dans le KB. | |
wsdlGreper | Recherche des fichiers de définition de Web Services (WSDL) dans toutes les pages. |
output
Assurent la partie reporting (stdout, html, textfile)
Nom du plugin | Description | Paramètres |
---|---|---|
console | Affiche les messages sur la console (stdout). |
|
gtkOutput | Sauvegarde les messages dans kb.kb.getData('gtkOutput', 'queue') sous la forme d'objets. | |
htmlFile | Sauvegarde tous les messages dans un fichier HTML. |
|
textFile | Sauvegarde tous les messages dans un fichier texte. |
|
xmlFile | Sauvegarde tous les messages dans un fichier XML. |
|
mangle
Modifient les requêtes et réponses en se basant sur les expressions régulières (regex)
Nom du plugin | Description | Paramètres |
---|---|---|
sed | Editeur de flux (stream editor) pour requêtes et réponses HTTP. |
|
evasion
Modifent les requêtes pour assurer la furtivité (evasion firewall, IDS, etc.)
Nom du plugin | Description | Paramètre |
---|---|---|
backSpaceBetweenDots | Insère les caractères 'A' et 'BS' (backspace) entre les points dans un chemin. Ces caractères s'annulent lorsqu'ils sont combinés mais cela permet de passer certains filtres. Par exemple ../../etc/password est remplacé par .%41%08./.%41%08./etc/password. | |
fullWidthEncode | Evasion de détection en utilisant l'encodage de caractère (full width encoding). Ainsi, /bar/foo.asp sera remplacé par /b%uFF61r/%uFF66oo.asp. Suivre l'adresse suivante pour plus de renseignements : http://www.kb.cert.org/vuls/id/739224. | |
modsecurity | Evasion de détection basée sur l'exploitation d'une vulnérabilité concernant le mod_security jusqu'à sa version 2.1.0. Par exemple, a=b pourra être remplacé par \x00a=b.Pour plus de renseignements, voir http://www.php-security.org/MOPB/BONUS-12-2007.html. | |
reversedSlashes | Remplacement des slashes (/) par des backslashes (\). Ainsi, /bar/foo.asp sera remplacé par \bar\foo.asp. | |
rndCase | Modification aléatoire de la casse. Ainsi, /bar/foo.asp pourra être remplacé par /BAr/foO.Asp. | |
rndHexEncode | Encodage hexadécimal aléatoire. Par exemple, /bar/foo.asp pourra être remplacé par /b%61r/%66oo.asp. | |
rndParam | Ajout d'un paramètre aléatoire. L'adresse /bar/foo.asp pourra par exemple être transformée en /bar/foo.asp?alsfkj=f09. | |
rndPath | Ajout d'un chemin aléatoire à l'URI. Par exemple, l'adresse /bar/foo.asp pourra être transformée en /aflsasfasfkn/../bar/foo.asp. | |
selfReference | Ajout d'une référence au répertoire courant (directory self reference). Par exemple, l'adresse /bar/foo.asp pourra être transformée en /bar/./foo.asp. | |
shiftOutShiftInBetweenDots | Ajout, entre les point, des caractères de contrôle shift-in et shift-out. Ceux-ci s'annulent lorsqu'ils sont combinés, mais cela permet de passer certains filtres. Par exemple, ../../etc/password est remplacé par .%0E%0F./.%0E%0F./etc/password. |
bruteforce
Crackage d'identifiants par bruteforce
Nom du plugin | Description | Paramètres |
---|---|---|
basicAuthBrute | Permet de bruteforcer les authentifications HTTP basiques (Protection par .htaccess). |
|
formAuthBrute | Permet de bruteforcer les authentifications basées sur des formulaires HTML. |
|
Exploits
Nom du plugin | Description |
---|---|
sqlmap | Exploite les injections SQL en utilisant sqlmap (http://sqlmap.sf.net). |
osCommandingShell | Exploite les injections de code. |
xssBeef | Exploite les failles de XSS en utilisant beEF (http://www.bindshell.net/tools/beef/). |
localFileReader | Exploite les inclusions de fichiers locales |
rfiProxy | Exploite les inclusions de fichiers distantes pour créer un serveur proxy |
remoteFileIncludeShell | Exploite les vulnérabilités de fichiers d'inclusion |
davShell | Exploie les accès DAV non authentifiés |
eval | Exploite les vulnérabilités de la fonction eval() |
fileUploadShell | Exploite les applications proposant l'upload de fichiers de manière illimitée |
sql_webshell | Exploite les injections SQL en uploadant un shell web (webshell) sur la cible. |