80,443 - Pentesting Web Methodology
Reading time: 20 minutes
tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di base
Il servizio web è il servizio più comune e diffuso e esistono molti diversi tipi di vulnerabilità.
Porta predefinita: 80 (HTTP), 443(HTTPS)
PORT STATE SERVICE
80/tcp open http
443/tcp open ssl/https
nc -v domain.com 80 # GET / HTTP/1.0
openssl s_client -connect domain.com:443 # GET / HTTP/1.0
Linee guida Web API
Riepilogo della metodologia
In questa metodologia supponiamo che tu stia per attaccare un dominio (o sottodominio) e solo quello. Dovresti quindi applicare questa metodologia a ogni dominio, sottodominio o IP scoperto con un web server non determinato all'interno del scope.
- Inizia col identificare le technologie usate dal web server. Cerca tricks da tenere a mente durante il resto del test se riesci a identificare la tech.
- Ci sono known vulnerability della versione della tecnologia?
- Stai usando qualche well known tech? Qualche useful trick per estrarre più informazioni?
- Esiste qualche specialised scanner da eseguire (come wpscan)?
- Lancia general purposes scanners. Non sai mai se troveranno qualcosa o informazioni interessanti.
- Inizia con i initial checks: robots, sitemap, 404 error e SSL/TLS scan (se HTTPS).
- Avvia lo spidering della pagina web: è il momento di trovare tutti i possibili file, cartelle e parametri in uso. Controlla anche eventuali special findings.
- Nota che ogni volta che viene scoperta una nuova directory durante brute-forcing o spidering, dovrebbe essere spiderata.
- Directory Brute-Forcing: prova a brute-forzare tutte le cartelle scoperte cercando nuovi file e directory.
- Nota che ogni volta che viene scoperta una nuova directory durante brute-forcing o spidering, dovrebbe essere Brute-Forced.
- Backups checking: verifica se riesci a trovare backup di file scoperti aggiungendo estensioni di backup comuni.
- Brute-Force parameters: prova a trovare parametri nascosti.
- Una volta che hai identificato tutti i possibili endpoints che accettano user input, verifica tutti i tipi di vulnerabilità correlati.
- Follow this checklist
Versione del server (Vulnerabile?)
Identificazione
Verifica se esistono vulnerabilità note per la versione del server in esecuzione.
Gli HTTP headers e i cookies della risposta possono essere molto utili per identificare le technologie e/o la versione in uso. Nmap scan può identificare la versione del server, ma possono risultare utili anche gli strumenti whatweb, webtech o https://builtwith.com/:
whatweb -a 1 <URL> #Stealthy
whatweb -a 3 <URL> #Aggresive
webtech -u <URL>
webanalyze -host https://google.com -crawl 2
Cerca per vulnerabilities of the web application version
Controlla se è presente un WAF
- https://github.com/EnableSecurity/wafw00f
- https://github.com/Ekultek/WhatWaf.git
- https://nmap.org/nsedoc/scripts/http-waf-detect.html
Web tech tricks
Alcuni trucchi per trovare vulnerabilità in diverse ben note technologies in uso:
- AEM - Adobe Experience Cloud
- Apache
- Artifactory
- Buckets
- CGI
- Drupal
- Flask
- Git
- Golang
- GraphQL
- H2 - Java SQL database
- ISPConfig
- IIS tricks
- Microsoft SharePoint
- JBOSS
- Jenkins
- Jira
- Joomla
- JSP
- Laravel
- Moodle
- Nginx
- PHP (php has a lot of interesting tricks that could be exploited)
- Python
- Spring Actuators
- Symphony
- Tomcat
- VMWare
- Web API Pentesting
- WebDav
- Werkzeug
- Wordpress
- Electron Desktop (XSS to RCE)
- Sitecore
- Zabbix
Tieni in considerazione che lo stesso dominio può utilizzare diverse technologies su differenti ports, folders e subdomains.
Se la web application usa una delle tech/platform ben note elencate sopra o qualsiasi altra, non dimenticare di cercare su Internet nuovi trucchi (e fammi sapere!).
Source Code Review
Se il source code dell'applicazione è disponibile su github, oltre a eseguire da te stesso un white box test dell'applicazione, ci sono alcune informazioni che potrebbero essere utili per l'attuale black-box testing:
- Esiste un Change-log o Readme o Version file o qualcosa con informazioni di versione accessibili via web?
- Come e dove vengono salvate le credentials? Esiste qualche file (accessibile?) con credenziali (usernames o passwords)?
- Le password sono in plain text, encrypted o quale algoritmo di hashing viene utilizzato?
- Sta usando qualche master key per criptare qualcosa? Quale algoritmo viene usato?
- Puoi accedere a uno di questi file sfruttando qualche vulnerabilità?
- Ci sono informazioni interessanti su github (issues risolti e non risolti)? O nella commit history (forse qualche password introdotta in un vecchio commit)?
Source code Review / SAST Tools
Automatic scanners
Scanner automatici generici
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"
Scanner per CMS
Se viene usato un CMS non dimenticare di eseguire uno scanner, magari trovi qualcosa di interessante:
Clusterd: JBoss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfish
CMSScan: WordPress, Drupal, Joomla, vBulletin siti web per problemi di sicurezza. (GUI)
VulnX: Joomla, Wordpress, Drupal, PrestaShop, Opencart
CMSMap: (W)ordpress, (J)oomla, (D)rupal o (M)oodle
droopscan: Drupal, Joomla, Moodle, Silverstripe, Wordpress
cmsmap [-f W] -F -d <URL>
wpscan --force update -e --url <URL>
joomscan --ec -u <URL>
joomlavs.rb #https://github.com/rastating/joomlavs
A questo punto dovresti già avere alcune informazioni sul web server utilizzato dal client (se vengono forniti dati) e alcuni trucchi da tenere a mente durante il test. Se sei fortunato hai anche trovato una CMS e lanciato qualche scanner.
Scoperta passo-passo dell'applicazione web
Da questo punto inizieremo a interagire con l'applicazione web.
Controlli iniziali
Pagine di default con informazioni interessanti:
- /robots.txt
- /sitemap.xml
- /crossdomain.xml
- /clientaccesspolicy.xml
- /.well-known/
- Controlla anche i commenti nelle pagine principali e secondarie.
Indurre errori
I web server possono comportarsi in modo inatteso quando vengono inviati dati strani. Questo può aprire vulnerabilità o causare la divulgazione di informazioni sensibili.
- Accedi a pagine fittizie come /whatever_fake.php (.aspx,.html,.etc)
- Aggiungi "[]", "]]" e "[[" nei cookie values e nei parameter values per generare errori
- Genera un errore fornendo l'input come
/~randomthing/%salla fine dell'URL - Prova diversi Verbi HTTP come PATCH, DEBUG o errati come FAKE
Verifica se puoi caricare file (PUT verb, WebDav)
Se scopri che WebDav è attivato ma non hai permessi sufficienti per caricare file nella cartella root prova a:
- Brute Force le credenziali
- Upload files via WebDav nelle altre cartelle trovate all'interno del sito. Potresti avere permessi per caricare file in altre directory.
Vulnerabilità SSL/TLS
- Se l'applicazione non forza l'uso di HTTPS in alcuna parte, allora è vulnerabile a MitM
- Se l'applicazione invia dati sensibili (password) usando HTTP, allora è una vulnerabilità critica.
Usa testssl.sh per verificare la presenza di vulnerabilità (nei programmi Bug Bounty probabilmente questo tipo di vulnerabilità non verrà accettato) e usa a2sv per ricontrollare le vulnerabilità:
./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>
Informazioni sulle vulnerabilità SSL/TLS:
- https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/
- https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/
Spidering
Avvia una qualche forma di spider all'interno del web. L'obiettivo dello spider è di trovare quanti più percorsi possibili dall'applicazione testata. Pertanto, web crawling e fonti esterne dovrebbero essere usati per scoprire il maggior numero possibile di percorsi validi.
- gospider (go): HTML spider, LinkFinder nei file JS e fonti esterne (Archive.org, CommonCrawl.org, VirusTotal.com).
- hakrawler (go): HML spider, con LinkFinder per i file JS e Archive.org come fonte esterna.
- dirhunt (python): HTML spider, indica anche i "juicy files".
- evine (go): HTML spider CLI interattivo. Cerca anche in Archive.org
- meg (go): Questo tool non è uno spider ma può essere utile. Puoi indicare un file con hosts e un file con paths e meg effettuerà fetch di ogni path su ogni host e salverà la response.
- urlgrab (go): HTML spider con capacità di rendering JS. Tuttavia, sembra non essere mantenuto, la versione precompilata è datata e il codice attuale non compila.
- gau (go): HTML spider che usa provider esterni (wayback, otx, commoncrawl).
- ParamSpider: Questo script troverà URL con parametri e li elencherà.
- galer (go): HTML spider con capacità di rendering JS.
- LinkFinder (python): HTML spider, con capacità di JS beautify in grado di cercare nuovi percorsi nei file JS. Potrebbe valere la pena dare un'occhiata anche a JSScanner, che è un wrapper di LinkFinder.
- goLinkFinder (go): Per estrarre endpoint sia dal sorgente HTML che dai file javascript embedded. Utile per bug hunters, red teamers, infosec ninjas.
- JSParser (python2.7): Uno script python 2.7 che usa Tornado e JSBeautifier per parsare URL relative dai file JavaScript. Utile per scoprire facilmente richieste AJAX. Sembra non essere mantenuto.
- relative-url-extractor (ruby): Dato un file (HTML) estrarrà URL usando una regex efficace per trovare ed estrarre URL relative da file minificati.
- JSFScan (bash, diversi tool): Raccoglie informazioni interessanti dai file JS usando diversi strumenti.
- subjs (go): Trova file JS.
- page-fetch (go): Carica una pagina in un browser headless e stampa tutti gli URL caricati per caricare la pagina.
- Feroxbuster (rust): Tool di content discovery che combina varie opzioni degli strumenti precedenti.
- Javascript Parsing: Una estensione per Burp per trovare path e params nei file JS.
- Sourcemapper: Uno strumento che, dato l'URL .js.map, restituisce il codice JS beautified.
- xnLinkFinder: Tool usato per scoprire endpoint per un target dato.
- waymore: Scopri link dalla wayback machine (scaricando anche le response nella wayback e cercando altri link).
- HTTPLoot (go): Crawl (anche compilando form) e trova anche info sensibili usando regex specifiche.
- SpiderSuite: Spider Suite è un avanzato crawler/spider GUI multi-feature progettato per professionisti della sicurezza.
- jsluice (go): È un package Go e un command-line tool per estrarre URL, paths, secrets e altri dati interessanti da codice JavaScript.
- ParaForge: ParaForge è una semplice Burp Suite extension per estrarre i parametri e gli endpoint dalle request per creare wordlist personalizzate per fuzzing ed enumeration.
- katana (go): Tool ottimo per questo scopo.
- Crawley (go): Stampa ogni link che riesce a trovare.
Brute Force directories and files
Inizia il brute-forcing dalla cartella root e assicurati di brute-forzare tutte le directory trovate usando questo metodo e tutte le directory scoperte dallo Spidering (puoi eseguire questo brute-forcing ricorsivamente e anteporre all'inizio della wordlist i nomi delle directory trovate).
Tool:
- Dirb / Dirbuster - Inclusi in Kali, vecchi (e lenti) ma funzionali. Permettono certificati auto-signed e ricerca ricorsiva. Troppo lenti rispetto alle altre opzioni.
- Dirsearch (python): Non permette certificati auto-signed ma consente ricerca ricorsiva.
- Gobuster (go): Supporta certificati auto-signed, non ha ricerca ricorsiva.
- Feroxbuster - Veloce, supporta ricerca ricorsiva.
- wfuzz
wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ - ffuf - Veloce:
ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ - uro (python): Non è uno spider ma uno strumento che, data la lista di URL trovati, elimina gli URL "duplicati".
- Scavenger: Burp Extension per creare una lista di directory dalla burp history di diverse pagine.
- TrashCompactor: Rimuove URL con funzionalità duplicate (basato su import JS).
- Chamaleon: Usa Wappalyzer per rilevare le tecnologie usate e selezionare le wordlist da usare.
Dizionari raccomandati:
- https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt
- Dirsearch included dictionary
- http://gist.github.com/jhaddix/b80ea67d85c13206125806f0828f4d10
- Assetnote wordlists
- https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content
- raft-large-directories-lowercase.txt
- directory-list-2.3-medium.txt
- RobotsDisallowed/top10000.txt
- https://github.com/random-robbie/bruteforce-lists
- https://github.com/google/fuzzing/tree/master/dictionaries
- https://github.com/six2dez/OneListForAll
- https://github.com/random-robbie/bruteforce-lists
- https://github.com/ayoubfathi/leaky-paths
- /usr/share/wordlists/dirb/common.txt
- /usr/share/wordlists/dirb/big.txt
- /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
Si noti che ogni volta che una nuova directory viene scoperta durante brute-forcing o spidering, dovrebbe essere sottoposta a Brute-Force.
What to check on each file found
- Broken link checker: Trova link rotti all'interno degli HTML che potrebbero essere suscettibili a takeover.
- File Backups: Una volta raccolti tutti i file, cerca backup di tutti i file eseguibili (".php", ".aspx"...). Variazioni comuni per il naming di un backup sono: file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp e file.old. Puoi anche usare lo strumento bfac o backup-gen.
- Discover new parameters: Puoi usare tool come Arjun, parameth, x8 e Param Miner per scoprire parametri nascosti. Se possibile, prova a cercare parametri nascosti in ogni file web eseguibile.
- 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
- Comments: Controlla i commenti di tutti i file, potresti trovare credentials o funzionalità nascoste.
- Se stai giocando in un CTF, un trucco "comune" è di nascondere informazioni dentro commenti alla destra della pagina (usando centinaia di spazi così non vedi i dati se apri il sorgente con il browser). Un'altra possibilità è usare diverse righe vuote e nascondere informazioni in un commento in fondo alla pagina web.
- API keys: Se trovi una API key esiste una guida che indica come usare API keys di diverse piattaforme: keyhacks, zile, truffleHog, SecretFinder, RegHex, DumpsterDive, EarlyBird
- Google API keys: Se trovi una API key che inizia con AIzaSyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik puoi usare il progetto gmapapiscanner per verificare a quali API la key può accedere.
- S3 Buckets: Durante lo spidering guarda se qualche subdomain o qualche link è collegato a un S3 bucket. In tal caso, verifica i permessi del bucket.
Special findings
Durante l'esecuzione di spidering e brute-forcing potresti trovare cose interessanti che devi segnalare.
File interessanti
- Cerca link ad altri file all'interno dei file CSS.
- Se trovi una .git è possibile estrarre alcune informazioni
- Se trovi un .env si possono trovare informazioni come api keys, password db e altre informazioni.
- Se trovi API endpoints dovresti testarli anche. Non sono file, ma probabilmente "sembreranno" tali.
- JS files: Nella sezione spidering sono stati elencati diversi tool che possono estrarre path dai file JS. Inoltre, sarebbe interessante monitorare ogni JS file trovato, poiché in alcune occasioni una modifica può indicare che è stata introdotta una potenziale vulnerabilità nel codice. Puoi usare, per esempio, JSMon.
- Dovresti anche controllare i file JS scoperti con RetireJS o JSHole per vedere se sono vulnerabili.
- Javascript Deobfuscator and Unpacker: https://lelinhtinh.github.io/de4js/, https://www.dcode.fr/javascript-unobfuscator
- Javascript Beautifier: http://jsbeautifier.org/, http://jsnice.org/
- JsFuck deobfuscation (javascript con caratteri:"[]!+" https://enkhee-osiris.github.io/Decoder-JSFuck/)
- TrainFuck](https://github.com/taco-c/trainfuck):
+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23. - In varie occasioni, avrai bisogno di capire le regular expressions usate. Questo sarà utile: https://regex101.com/ o https://pythonium.net/regex
- Potresti anche monitorare i file dove sono stati rilevati form, poiché una modifica nei parametri o l'apparizione di un nuovo form potrebbe indicare una nuova funzionalità potenzialmente vulnerabile.
403 Forbidden/Basic Authentication/401 Unauthorized (bypass)
502 Proxy Error
Se una pagina risponde con quel codice, probabilmente è un proxy mal configurato. Se invii una richiesta HTTP come: GET https://google.com HTTP/1.1 (con l'header host e altri header comuni), il proxy tenterà di accedere a google.com e avrai trovato una SSRF.
NTLM Authentication - Info disclosure
Se il server che richiede l'autenticazione è Windows o trovi una login che chiede le tue credentials (e chiede il domain), puoi provocare una information disclosure.
Invia l'header: “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=” e, a causa del funzionamento dell'NTLM authentication, il server risponderà con informazioni interne (versione IIS, versione Windows...) nell'header "WWW-Authenticate".
Puoi automatizzare questo usando il plugin di nmap "http-ntlm-info.nse".
HTTP Redirect (CTF)
È possibile mettere contenuto all'interno di una redirection. Questo contenuto non verrà mostrato all'utente (poiché il browser eseguirà la redirection) ma qualcosa potrebbe essere nascosto lì.
Web Vulnerabilities Checking
Ora che è stata effettuata una enumerazione completa dell'applicazione web è tempo di controllare molte possibili vulnerabilità. Puoi trovare la checklist qui:
Web Vulnerabilities Methodology
Trova più info sulle web vulns in:
- https://six2dez.gitbook.io/pentest-book/others/web-checklist
- https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html
- https://owasp-skf.gitbook.io/asvs-write-ups/kbid-111-client-side-template-injection
Monitor Pages for changes
Puoi usare tool come https://github.com/dgtlmoon/changedetection.io per monitorare pagine e rilevare modifiche che potrebbero introdurre vulnerabilità.
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
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks