80,443 - Metodologia di Pentesting Web
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 sono presenti 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 per Web API
Sommario della metodologia
In questa metodologia supponiamo che tu stia per attaccare un dominio (o sottodominio) e solo quello. Quindi, dovresti applicare questa metodologia a ogni dominio, sottodominio o IP scoperto con web server non determinato all'interno dell'ambito.
- Inizia con il identificare le tecnologie usate dal web server. Cerca tricks da tenere a mente durante il resto del test se riesci a identificare la tecnologia.
- Esistono vulnerabilità note per la versione della tecnologia?
- Si sta usando qualche well known tech? Qualche useful trick per estrarre più informazioni?
- Qualche specialised scanner da eseguire (come wpscan)?
- Avvia scanner generici. Non sai mai se troveranno qualcosa o informazioni interessanti.
- Inizia con i controlli iniziali: 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 la presenza di scoperte particolari.
- Nota che ogni volta che una nuova directory viene scoperta durante brute-forcing o spidering, dovrebbe essere spidered.
- Directory Brute-Forcing: Prova a brute force tutte le cartelle scoperte cercando nuovi files e directories.
- Nota che ogni volta che una nuova directory viene scoperta durante brute-forcing o spidering, dovrebbe essere Brute-Forced.
- Backups checking: Verifica se puoi trovare backups dei 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à correlate.
- Segui questa checklist
Versione del server (Vulnerabile?)
Identificazione
Verifica se esistono vulnerabilità note per la versione del server in esecuzione.
Le HTTP headers e i cookies della response possono essere molto utili per identificare le tecnologie e/o la versione in uso. Una 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
Verifica la presenza di un WAF
- https://github.com/EnableSecurity/wafw00f
- https://github.com/Ekultek/WhatWaf.git
- https://nmap.org/nsedoc/scripts/http-waf-detect.html
Trucchi per tecnologie Web
Alcuni trucchi per trovare vulnerabilità in diverse e ben note tecnologie 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 presente che lo stesso dominio può usare diverse tecnologie in diverse porte, cartelle e sottodomini.
Se l'applicazione web sta usando una delle tech/platform listed before 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:
- È presente un Change-log or Readme or Version file o qualcosa con version info accessible via web?
- Come e dove vengono salvate le credentials? Esiste qualche (accessibile?) file con credentials (usernames o passwords)?
- Le passwords sono in plain text, encrypted o quale hashing algorithm è usato?
- Sta usando qualche master key per encryptare qualcosa? Quale algorithm è usato?
- Riesci ad accedere a uno di questi file sfruttando qualche vulnerabilità?
- C'è qualche informazione interessante nel 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
General purpose automatic scanners
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"
CMS scanners
Se viene utilizzato un CMS, non dimenticare di eseguire uno scanner, potresti trovare 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 or (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 usato dal client (se vengono forniti dati) e qualche trucco da tenere a mente durante il test. Se sei fortunato hai anche trovato un CMS e lanciato qualche scanner.
Step-by-step Web Application Discovery
From this point we are going to start interacting with the web application.
Initial checks
Default pages with interesting info:
- /robots.txt
- /sitemap.xml
- /crossdomain.xml
- /clientaccesspolicy.xml
- /.well-known/
- Controlla anche i commenti nelle pagine principali e secondarie.
Forcing errors
I web server possono comportarsi in modo imprevisto quando vengono inviati dati strani. Questo può aprire vulnerabilities o causare disclosure sensitive information.
- Accedi a pagine false come /whatever_fake.php (.aspx,.html,.etc)
- Aggiungi "[]", "]]", e "[[" nei valori dei cookie e nei valori dei parametri per creare errori
- Genera un errore dando come input
/~randomthing/%s
alla fine dell'URL - Prova diversi HTTP Verbs come PATCH, DEBUG o errati come FAKE
Check if you can upload files (PUT verb, WebDav)
Se scopri che WebDav è abilitato ma non hai sufficienti permessi per uploadare file nella cartella root prova a:
- Brute Force le credenziali
- Uploadare file via WebDav nelle altre cartelle trovate all'interno della pagina web. Potresti avere permessi per uploadare file in altre cartelle.
SSL/TLS vulnerabilità
- 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à elevata.
Usa testssl.sh per controllare le vulnerabilities (nei programmi Bug Bounty probabilmente questo tipo di vulnerabilities non verranno accettate) e usa a2sv per ricontrollare le vulnerabilities:
./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
Lanciare una qualche forma di spider all'interno del web. L'obiettivo dello spider è trovare il maggior numero possibile di percorsi dall'applicazione testata. Di conseguenza, il web crawling e le sorgenti esterne dovrebbero essere usati per scoprire il maggior numero possibile di percorsi validi.
- gospider (go): HTML spider, LinkFinder in JS files e sorgenti esterne (Archive.org, CommonCrawl.org, VirusTotal.com).
- hakrawler (go): HML spider, con LinkFider per JS files e Archive.org come sorgente esterna.
- dirhunt (python): HTML spider, indica anche "juicy files".
- evine (go): CLI interattivo HTML spider. 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 fetcherà ogni path su ogni host salvando la response.
- urlgrab (go): HTML spider con capacità di rendering JS. Tuttavia, sembra non essere mantenuto, la versione precompilata è vecchia e il codice corrente 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 in JS files. Potrebbe valere la pena dare un'occhiata anche a JSScanner, che è un wrapper di LinkFinder.
- goLinkFinder (go): Per estrarre endpoint sia nel codice HTML che nei 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 relativi da JavaScript files. Utile per scoprire facilmente richieste AJAX. Sembra non essere mantenuto.
- relative-url-extractor (ruby): Dato un file (HTML) estrarrà URL usando una regex adatta per trovare ed estrarre URL relativi da file minificati.
- JSFScan (bash, diversi tool): Raccoglie informazioni interessanti da JS files usando più strumenti.
- subjs (go): Trova JS files.
- page-fetch (go): Carica una pagina in un browser headless e stampa tutti gli url caricati per caricare la pagina.
- Feroxbuster (rust): Strumento di content discovery che miscela diverse opzioni degli strumenti precedenti
- Javascript Parsing: Una Burp extension per trovare path e params in JS files.
- Sourcemapper: Uno strumento che, dato l'URL .js.map, ottiene il codice JS beautified
- xnLinkFinder: Tool usato per scoprire endpoint per un target dato.
- waymore: Scopre link dalla wayback machine (scaricando anche le response nella wayback e cercando altri link)
- HTTPLoot (go): Crawl (anche riempiendo form) e trova info sensibili usando regex specifiche.
- SpiderSuite: Spider Suite è un advance multi-feature GUI web security Crawler/Spider progettato per professionisti della cybersecurity.
- jsluice (go): Pacchetto Go e command-line tool per estrarre URLs, paths, secrets e altri dati interessanti dal JavaScript source code.
- ParaForge: ParaForge è una semplice Burp Suite extension per estrarre paramters e endpoints dalle request per creare wordlist personalizzate per fuzzing e enumeration.
- katana (go): Ottimo tool per questo.
- 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 fare questo brute-forcing ricorsivamente e anteporre all'inizio della wordlist usata i nomi delle directory trovate).
Tools:
- Dirb / Dirbuster - Incluso in Kali, vecchio (e lento) ma funzionale. Permette certificati auto-signed e ricerca ricorsiva. Troppo lento rispetto alle altre opzioni.
- Dirsearch (python): Non permette certificati auto-signed ma permette ricerca ricorsiva.
- Gobuster (go): Permette certificati auto-signed, non ha ricerca ricorsiva.
- Feroxbuster - Fast, supports recursive search.
- wfuzz
wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ
- ffuf - Fast:
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 directories dalla burp history di differenti pagine
- TrashCompactor: Rimuove URL con funzionalità duplicate (basato su import js)
- Chamaleon: Usa wapalyzer per rilevare le tecnologie usate e selezionare le wordlists da usare.
Dizionari consigliati:
- 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
Note che ogni volta che viene scoperta una nuova directory durante il brute-forcing o lo spidering, dovrebbe essere Brute-Forzata.
What to check on each file found
- Broken link checker: Trova link interrotti all'interno degli HTML che potrebbero essere suscettibili a takeover
- File Backups: Una volta trovati tutti i file, cerca backup di tutti i file eseguibili (".php", ".aspx"...). Varianti comuni per il nome 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 usare anche 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" è nascondere informazioni dentro commenti a destra della pagina (usando centinaia di spazi così non vedi i dati se apri il source con il browser). Un'altra possibilità è usare diverse newline e nascondere informazione in un commento in fondo alla pagina web.
- API keys: Se trovi una API key c'è 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 apis la key può accedere.
- S3 Buckets: Mentre fai spidering cerca se qualche subdomain o qualche link è relativo a uno S3 bucket. In quel caso, controlla i permessi del bucket.
Special findings
Durante l'esecuzione di spidering e brute-forcing potresti trovare cose interessanti che devi segnalare.
Interesting files
- Cerca link ad altri file all'interno dei CSS files.
- Se trovi un .git alcune informazioni possono essere estratte
- Se trovi un .env possono essere trovate informazioni come api keys, password del db e altre informazioni.
- Se trovi API endpoints dovresti anche testarli. Questi non sono file, ma probabilmente "sembreranno" tali.
- JS files: Nella sezione spidering sono stati menzionati diversi tool che possono estrarre path da JS files. Inoltre, sarebbe interessante monitorare ogni JS file trovato, poiché in alcune occasioni un cambiamento può indicare che una potenziale vulnerabilità è stata introdotta nel codice. Puoi usare ad esempio JSMon.
- Dovresti anche controllare i JS files scoperti con RetireJS o JSHole per verificare 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 molte occasioni, dovrai capire le regular expressions usate. Questo sarà utile: https://regex101.com/ o https://pythonium.net/regex
- Potresti anche monitorare i file in cui sono stati rilevati form, poiché un cambiamento nei parametri o la comparsa di un nuovo form può 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 richiede il domain name), puoi provocare una information disclosure.
Invia l'header: “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”
e, a causa di come funziona l'NTLM authentication, il server risponderà con info interne (versione IIS, versione Windows...) dentro l'header "WWW-Authenticate".
Puoi automatizzare questo usando il plugin di nmap "http-ntlm-info.nse".
HTTP Redirect (CTF)
È possibile inserire contenuto dentro una Redirection. Questo contenuto non sarà mostrato all'utente (poiché il browser eseguirà la redirezione) ma qualcosa potrebbe essere nascosto lì.
Web Vulnerabilities Checking
Ora che è stata eseguita una enumerazione completa dell'applicazione web è il momento di controllare molte possibili vulnerabilità. Puoi trovare la checklist qui:
Web Vulnerabilities Methodology
Trova più informazioni 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 per 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.