80,443 - Méthodologie de Pentesting Web

Reading time: 21 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

Le service web est le service le plus commun et étendu et il existe de nombreux types différents de vulnérabilités.

Port par défaut : 80 (HTTP), 443(HTTPS)

bash
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  ssl/https
bash
nc -v domain.com 80 # GET / HTTP/1.0
openssl s_client -connect domain.com:443 # GET / HTTP/1.0

Directives pour les API Web

Web API Pentesting

Résumé de la méthodologie

Dans cette méthodologie, nous supposons que vous allez attaquer un domaine (ou sous-domaine) et uniquement celui-ci. Vous devez donc appliquer cette méthodologie à chaque domaine, sous-domaine ou IP découvert avec un serveur web indéterminé dans le scope.

  • Commencez par identifier les technologies utilisées par le serveur web. Recherchez des astuces à garder en tête pendant le reste du test si vous parvenez à identifier la technologie.
  • Existe-t-il une vulnérabilité connue pour la version de la technologie ?
  • Utilisez-vous une technologie bien connue ? Y a-t-il une astuce utile pour extraire plus d'informations ?
  • Y a-t-il un scanner spécialisé à lancer (comme wpscan) ?
  • Lancez des general purposes scanners. On ne sait jamais s'ils vont trouver quelque chose ou des informations intéressantes.
  • Commencez par les initial checks : robots, sitemap, 404 error et SSL/TLS scan (si HTTPS).
  • Commencez le spidering de la page web : c'est le moment de trouver tous les fichiers, dossiers et paramètres utilisés possibles. Vérifiez aussi les trouvailles particulières.
  • Notez que chaque fois qu'un nouveau répertoire est découvert pendant le brute-forcing ou le spidering, il doit être spidered.
  • Directory Brute-Forcing : Essayez de brute-forcer tous les dossiers découverts à la recherche de nouveaux fichiers et répertoires.
  • Notez que chaque fois qu'un nouveau répertoire est découvert pendant le brute-forcing ou le spidering, il doit être Brute-Forced.
  • Backups checking : Vérifiez si vous pouvez trouver des backups des fichiers découverts en ajoutant des extensions de sauvegarde courantes.
  • Brute-Force parameters : Essayez de trouver des paramètres cachés.
  • Une fois que vous avez identifié tous les endpoints possibles acceptant des user input, vérifiez tous les types de vulnérabilités qui y sont liés.
  • Suivez cette checklist

Version du serveur (Vulnérable ?)

Identification

Vérifiez s'il existe des vulnérabilités connues pour la version du serveur en cours d'exécution.
Les HTTP headers et les cookies de la réponse peuvent être très utiles pour identifier les technologies et/ou la version utilisées. Nmap scan peut identifier la version du serveur, mais les outils whatweb, webtech ou https://builtwith.com/** :**

bash
whatweb -a 1 <URL> #Stealthy
whatweb -a 3 <URL> #Aggresive
webtech -u <URL>
webanalyze -host https://google.com -crawl 2

Rechercher vulnerabilities of the web application version

Vérifier s'il y a un WAF

Astuces techniques Web

Quelques astuces pour la recherche de vulnérabilités dans différentes technologies bien connues utilisées :

Prenez en compte que le même domaine peut utiliser différentes technologies sur différents ports, dossiers et sous-domaines.
Si l'application web utilise une des tech/platform listées ci-dessus ou une autre, n'oubliez pas de chercher sur Internet de nouvelles astuces (et dites-le-moi !).

Revue du code source

Si le source code de l'application est disponible sur github, en plus d'effectuer par vous-même un White box test de l'application, il y a des informations qui pourraient être utiles pour le Black-Box testing en cours :

  • Y a-t-il un fichier Change-log, Readme ou Version ou tout autre élément avec des informations de version accessibles via le web ?
  • Comment et où sont stockés les identifiants ? Y a-t-il un fichier (accessible ?) contenant des identifiants (noms d'utilisateur ou mots de passe) ?
  • Les mots de passe sont-ils en texte clair, chiffrés ou quel algorithme de hachage est utilisé ?
  • Utilise-t-il une master key pour chiffrer quelque chose ? Quel algorithme est utilisé ?
  • Pouvez-vous accéder à l'un de ces fichiers en exploitant une vulnérabilité ?
  • Y a-t-il des informations intéressantes sur github (issues résolues ou non) ? Ou dans l'historique des commits (peut-être un mot de passe introduit dans un ancien commit) ?

Source code Review / SAST Tools

Scanners automatiques

Scanners automatiques à usage général

bash
nikto -h <URL>
whatweb -a 4 <URL>
wapiti -u <URL>
W3af
zaproxy #You can use an API
nuclei -ut && nuclei -target <URL>

# https://github.com/ignis-sec/puff (client side vulns fuzzer)
node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ"

Scanners de CMS

Si un CMS est utilisé, n'oubliez pas de lancer un scanner, vous pourriez trouver quelque chose d'intéressant :

Clusterd: JBoss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfish
CMSScan: WordPress, Drupal, Joomla, vBulletin sites Web pour des vulnérabilités de sécurité. (GUI)
VulnX: Joomla, Wordpress, Drupal, PrestaShop, Opencart
CMSMap: (W)ordpress, (J)oomla, (D)rupal ou (M)oodle
droopscan: Drupal, Joomla, Moodle, Silverstripe, Wordpress

bash
cmsmap [-f W] -F -d <URL>
wpscan --force update -e --url <URL>
joomscan --ec -u <URL>
joomlavs.rb #https://github.com/rastating/joomlavs

À ce stade, vous devriez déjà disposer de certaines informations sur le web server utilisé par le client (si des données sont fournies) et de quelques astuces à garder en tête pendant le test. Si vous avez de la chance, vous avez même trouvé un CMS et lancé un scanner.

Étape par étape : Web Application Discovery

À partir de maintenant nous allons commencer à interagir avec l'application web.

Vérifications initiales

Pages par défaut contenant des informations intéressantes :

  • /robots.txt
  • /sitemap.xml
  • /crossdomain.xml
  • /clientaccesspolicy.xml
  • /.well-known/
  • Vérifiez aussi les commentaires dans les pages principales et secondaires.

Forcer des erreurs

Les web servers peuvent se comporter de manière inattendue lorsque des données bizarres leur sont envoyées. Cela peut ouvrir des vulnerabilities ou provoquer la disclosure sensitive information.

  • Accédez à des pages factices comme /whatever_fake.php (.aspx,.html,.etc)
  • Ajoutez "[]", "]]", et "[[" dans les cookie values et les parameter values pour provoquer des erreurs
  • Générer une erreur en donnant en entrée /~randomthing/%s à la fin de l'URL
  • Essayez différents HTTP Verbs comme PATCH, DEBUG ou même des verbes invalides comme FAKE

Check if you can upload files (PUT verb, WebDav)

Si vous constatez que WebDav est enabled mais que vous n'avez pas suffisamment de permissions pour uploading files dans le dossier racine, essayez de :

  • Brute Force credentials
  • Upload files via WebDav dans le reste des found folders présents dans la page web. Il se peut que vous ayez la permission d'uploader des fichiers dans d'autres dossiers.

SSL/TLS Vulnerabilités

  • Si l'application n'oblige pas l'utilisation de HTTPS dans une quelconque partie, alors elle est vulnerable to MitM
  • Si l'application envoie des données sensibles (passwords) via HTTP. Alors c'est une vulnérabilité élevée.

Utilisez testssl.sh pour vérifier les vulnerabilities (dans les programmes Bug Bounty, ce type de vulnérabilités est probablement rarement accepté) et utilisez a2sv pour recontrôler les vulnerabilities :

bash
./testssl.sh [--htmlfile] 10.10.10.10:443
#Use the --htmlfile to save the output inside an htmlfile also

# You can also use other tools, by testssl.sh at this momment is the best one (I think)
sslscan <host:port>
sslyze --regular <ip:port>

Information about SSL/TLS vulnerabilities:

Spidering

Lancez une sorte de spider dans l'application web. L'objectif du spider est de trouver autant de chemins que possible depuis l'application testée. Par conséquent, le crawling web et les sources externes doivent être utilisés pour découvrir le plus de chemins valides possible.

  • gospider (go): HTML spider, LinkFinder dans les fichiers JS et sources externes (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com).
  • hakrawler (go): HML spider, avec LinkFider pour les fichiers JS et Archive.org comme source externe.
  • dirhunt (python): HTML spider, indique aussi les "juicy files".
  • evine (go): CLI interactive HTML spider. Il recherche aussi dans Archive.org
  • meg (go): Cet outil n'est pas un spider mais peut être utile. Vous pouvez spécifier un fichier d'hôtes et un fichier de chemins ; meg récupérera chaque chemin sur chaque hôte et sauvegardera la réponse.
  • urlgrab (go): HTML spider avec capacités de rendu JS. Cependant, il semble non maintenu, la version précompilée est ancienne et le code actuel ne compile pas.
  • gau (go): HTML spider qui utilise des fournisseurs externes (wayback, otx, commoncrawl)
  • ParamSpider: Ce script trouve des URLs avec paramètres et les liste.
  • galer (go): HTML spider avec rendu JS.
  • LinkFinder (python): HTML spider, avec capacités de beautify JS capable de rechercher de nouveaux chemins dans les fichiers JS. Il peut être intéressant aussi de regarder JSScanner, qui est un wrapper de LinkFinder.
  • goLinkFinder (go): Pour extraire des endpoints dans le source HTML et dans les fichiers javascript embarqués. Utile pour bug hunters, red teamers, infosec ninjas.
  • JSParser (python2.7): Script python 2.7 utilisant Tornado et JSBeautifier pour parser des URLs relatives à partir de fichiers JavaScript. Utile pour découvrir facilement des requêtes AJAX. Semble non maintenu.
  • relative-url-extractor (ruby): Donné un fichier (HTML) il extraira les URLs en utilisant une expression régulière astucieuse pour trouver et extraire les URLs relatives de fichiers uglifiés (minifiés).
  • JSFScan (bash, plusieurs outils): Rassemble des informations intéressantes depuis les fichiers JS en utilisant plusieurs outils.
  • subjs (go): Trouver des fichiers JS.
  • page-fetch (go): Charge une page dans un navigateur headless et affiche toutes les urls chargées pour afficher la page.
  • Feroxbuster (rust): Outil de discovery de contenu mélangeant plusieurs options des outils précédents.
  • Javascript Parsing: Une extension Burp pour trouver chemins et params dans les fichiers JS.
  • Sourcemapper: Un outil qui, donné l'URL du .js.map, récupérera le code JS beautifié.
  • xnLinkFinder: Outil utilisé pour découvrir des endpoints pour une cible donnée.
  • waymore: Découvrir des liens depuis la wayback machine (télécharge aussi les réponses dans la wayback et recherche d'autres liens).
  • HTTPLoot (go): Crawl (même en remplissant des formulaires) et trouve aussi des infos sensibles en utilisant des regexs spécifiques.
  • SpiderSuite: Spider Suite est un crawler/spider GUI multi-fonction avancé conçu pour les professionnels de la cybersécurité.
  • jsluice (go): C'est un package Go et un command-line tool pour extraire URLs, chemins, secrets et autres données intéressantes depuis le code source JavaScript.
  • ParaForge: ParaForge est une simple Burp Suite extension pour extraire les paramters et endpoints de la requête afin de créer des wordlists personnalisées pour le fuzzing et l'énumération.
  • katana (go): Outil excellent pour cela.
  • Crawley (go): Affiche chaque lien qu'il est capable de trouver.

Brute Force directories and files

Commencez le brute-forcing depuis le dossier racine et assurez-vous de brute-forcer tous les répertoires trouvés en utilisant cette méthode et tous les répertoires découverts par le Spidering (vous pouvez faire ce brute-forcing récursivement et préfixer dans le wordlist utilisé les noms des répertoires trouvés).
Outils :

  • Dirb / Dirbuster - Inclus dans Kali, vieux (et lent) mais fonctionnel. Permet certificats auto-signés et recherche récursive. Trop lent comparé aux autres options.
  • Dirsearch (python): Il n'autorise pas les certificats auto-signés mais permet la recherche récursive.
  • Gobuster (go): Il permet les certificats auto-signés, il n'a pas de recherche récursive.
  • Feroxbuster - Rapide, supporte la recherche récursive.
  • wfuzz wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ
  • ffuf - Rapide: ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ
  • uro (python): Ce n'est pas un spider mais un outil qui, donné la liste d'URLs trouvées, supprimera les URLs "dupliquées".
  • Scavenger: Burp Extension pour créer une liste de répertoires depuis l'historique burp de différentes pages.
  • TrashCompactor: Supprime les URLs avec des fonctionnalités dupliquées (basé sur les imports js).
  • Chamaleon: Utilise wapalyzer pour détecter les technologies utilisées et sélectionner les wordlists à utiliser.

Dictionnaires recommandés :

Notez que chaque fois qu'un nouveau répertoire est découvert pendant le brute-forcing ou le spidering, il doit être Brute-Forced.

What to check on each file found

  • Broken link checker: Trouver les liens cassés dans les HTMLs qui peuvent être susceptibles de takeover.
  • File Backups: Une fois que vous avez trouvé tous les fichiers, cherchez des backups de tous les fichiers exécutables (".php", ".aspx"...). Variantes communes de nommage pour un backup : file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp et file.old. Vous pouvez aussi utiliser l'outil bfac ou backup-gen.
  • Discover new parameters: Vous pouvez utiliser des outils comme Arjun, parameth, x8 et Param Miner pour découvrir des paramètres cachés. Si possible, essayez de rechercher des paramètres cachés sur chaque fichier web exécutable.
  • Arjun all default wordlists: https://github.com/s0md3v/Arjun/tree/master/arjun/db
  • Param-miner “params” : https://github.com/PortSwigger/param-miner/blob/master/resources/params
  • Assetnote “parameters_top_1m”: https://wordlists.assetnote.io/
  • nullenc0de “params.txt”: https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773
  • Commentaires : Vérifiez les commentaires de tous les fichiers, vous pouvez y trouver des credentials ou des fonctionnalités cachées.
  • Si vous jouez en CTF, une astuce "classique" est de cacher des informations dans des commentaires à droite de la page (en utilisant des centaines d'espaces pour que vous ne voyiez pas les données si vous ouvrez le code source dans le navigateur). Autre possibilité : utiliser plusieurs sauts de ligne et cacher des informations dans un commentaire en bas de la page web.
  • API keys: Si vous trouvez une API key il existe des guides indiquant comment utiliser les API keys de différentes plateformes : keyhacks, zile, truffleHog, SecretFinder, RegHex, DumpsterDive, EarlyBird
  • Google API keys: Si vous trouvez une API key commençant par AIzaSyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik vous pouvez utiliser le projet gmapapiscanner pour vérifier quelles APIs la clé peut accéder.
  • S3 Buckets: Pendant le spidering, regardez si un subdomain ou un lien est lié à un S3 bucket. Dans ce cas, vérifiez les permissions du bucket.

Special findings

Pendant le spidering et le brute-forcing vous pouvez trouver des choses intéressantes qu'il faut remarquer.

Fichiers intéressants

403 Forbidden/Basic Authentication/401 Unauthorized (bypass)

403 & 401 Bypasses

502 Proxy Error

Si une page répond avec ce code, c'est probablement un proxy mal configuré. Si vous envoyez une requête HTTP comme : GET https://google.com HTTP/1.1 (avec l'en-tête Host et d'autres en-têtes communs), le proxy va essayer d'accéder à google.com et vous aurez trouvé un SSRF.

NTLM Authentication - Info disclosure

Si le serveur qui demande l'authentification est Windows ou si vous trouvez une page de login demandant vos credentials (et demandant le nom de domaine), vous pouvez provoquer une divulgation d'information.
Envoyez l'en-tête : “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=” et dû à la manière dont fonctionne l'NTLM authentication, le serveur répondra avec des infos internes (version IIS, version Windows...) dans l'en-tête "WWW-Authenticate".
Vous pouvez automatiser cela avec le plugin nmap "http-ntlm-info.nse".

HTTP Redirect (CTF)

Il est possible de mettre du contenu à l'intérieur d'une Redirection. Ce contenu ne sera pas affiché à l'utilisateur (puisque le navigateur exécutera la redirection) mais quelque chose pourrait y être caché.

Web Vulnerabilities Checking

Maintenant qu'une énumération complète de l'application web a été réalisée, il est temps de vérifier un grand nombre de vulnérabilités possibles. Vous pouvez trouver la checklist ici :

Web Vulnerabilities Methodology

Trouvez plus d'infos sur les vulnérabilités web sur :

Monitor Pages for changes

Vous pouvez utiliser des outils tels que https://github.com/dgtlmoon/changedetection.io pour monitorer des pages afin de détecter des modifications qui pourraient introduire des vulnérabilités.

HackTricks Automatic Commands

Protocol_Name: Web    #Protocol Abbreviation if there is one.
Port_Number:  80,443     #Comma separated if there is more than one.
Protocol_Description: Web         #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for Web
Note: |
https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/index.html

Entry_2:
Name: Quick Web Scan
Description: Nikto and GoBuster
Command: nikto -host {Web_Proto}://{IP}:{Web_Port} &&&& gobuster dir -w {Small_Dirlist} -u {Web_Proto}://{IP}:{Web_Port} && gobuster dir -w {Big_Dirlist} -u {Web_Proto}://{IP}:{Web_Port}

Entry_3:
Name: Nikto
Description: Basic Site Info via Nikto
Command: nikto -host {Web_Proto}://{IP}:{Web_Port}

Entry_4:
Name: WhatWeb
Description: General purpose auto scanner
Command: whatweb -a 4 {IP}

Entry_5:
Name: Directory Brute Force Non-Recursive
Description:  Non-Recursive Directory Brute Force
Command: gobuster dir -w {Big_Dirlist} -u {Web_Proto}://{IP}:{Web_Port}

Entry_6:
Name: Directory Brute Force Recursive
Description: Recursive Directory Brute Force
Command: python3 {Tool_Dir}dirsearch/dirsearch.py -w {Small_Dirlist} -e php,exe,sh,py,html,pl -f -t 20 -u {Web_Proto}://{IP}:{Web_Port} -r 10

Entry_7:
Name: Directory Brute Force CGI
Description: Common Gateway Interface Brute Force
Command: gobuster dir -u {Web_Proto}://{IP}:{Web_Port}/ -w /usr/share/seclists/Discovery/Web-Content/CGIs.txt -s 200

Entry_8:
Name: Nmap Web Vuln Scan
Description: Tailored Nmap Scan for web Vulnerabilities
Command: nmap -vv --reason -Pn -sV -p {Web_Port} --script=`banner,(http* or ssl*) and not (brute or broadcast or dos or external or http-slowloris* or fuzzer)` {IP}

Entry_9:
Name: Drupal
Description: Drupal Enumeration Notes
Note: |
git clone https://github.com/immunIT/drupwn.git for low hanging fruit and git clone https://github.com/droope/droopescan.git for deeper enumeration

Entry_10:
Name: WordPress
Description: WordPress Enumeration with WPScan
Command: |
?What is the location of the wp-login.php? Example: /Yeet/cannon/wp-login.php
wpscan --url {Web_Proto}://{IP}{1} --enumerate ap,at,cb,dbe && wpscan --url {Web_Proto}://{IP}{1} --enumerate u,tt,t,vp --passwords {Big_Passwordlist} -e

Entry_11:
Name: WordPress Hydra Brute Force
Description: Need User (admin is default)
Command: hydra -l admin -P {Big_Passwordlist} {IP} -V http-form-post '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log In&testcookie=1:S=Location'

Entry_12:
Name: Ffuf Vhost
Description: Simple Scan with Ffuf for discovering additional vhosts
Command: ffuf -w {Subdomain_List}:FUZZ -u {Web_Proto}://{Domain_Name} -H "Host:FUZZ.{Domain_Name}" -c -mc all {Ffuf_Filters}

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks