28 KiB
80,443 - Pentesting Web metodologija
{{#include ../../banners/hacktricks-training.md}}
Osnovne informacije
Web servis je najčešći i najopsežniji servis i postoji mnogo različitih tipova ranjivosti.
Podrazumevani port: 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
Vodič za Web API
{{#ref}} web-api-pentesting.md {{#endref}}
Sažetak metodologije
U ovoj metodologiji pretpostavićemo da ćete napadati jedan domain (ili subdomain) i samo njega. Dakle, treba da primenite ovu metodologiju na svaki otkriven domain, subdomain ili IP sa nedefinisanim web serverom unutar opsega.
- Počnite sa identifikacijom tehnologija koje koristi web server. Potražite trikove koje treba imati na umu tokom ostatka testa ako uspete da identifikujete tehnologiju.
- Postoji li neka poznata ranjivost za verziju te tehnologije?
- Koristi li se neka well known tech? Postoji li neki useful trick za dobijanje više informacija?
- Postoji li neki specialised scanner za pokretanje (npr. wpscan)?
- Pokrenite general purposes scanners. Nikad ne znate hoće li pronaći nešto ili neke interesantne informacije.
- Počnite sa initial checks: robots, sitemap, 404 error i SSL/TLS scan (ako HTTPS).
- Počnite sa spidering web stranice: vreme je da pronađete sve moguće files, folders i parameters being used. Takođe, proverite za special findings.
- Napomena: svaki put kad se otkrije novi directory tokom brute-forcing ili spidering, treba ga spiderovati.
- Directory Brute-Forcing: Pokušajte da brute force-ujete sve otkrivene folders tražeći nove files i directories.
- Napomena: svaki put kad se otkrije novi directory tokom brute-forcing ili spidering, treba da bude Brute-Forced.
- Backups checking: Testirajte da li možete pronaći backups od discovered files dodavanjem uobičajenih backup ekstenzija.
- Brute-Force parameters: Pokušajte da find hidden parameters.
- Kada ste identifikovali sve moguće endpoints koji prihvataju user input, proverite sve vrste vulnerabilities vezanih za njih.
- Sledite ovu kontrolnu listu
Verzija servera (Ranjiv?)
Identifikacija
Proverite da li postoje poznate ranjivosti za verziju servera koja se pokreće.
HTTP headers and cookies of the response mogu biti veoma korisni za identifikaciju tehnologija i/ili verzije koja se koristi. Nmap scan može identifikovati verziju servera, ali korisni mogu biti i alati whatweb, webtech ili https://builtwith.com/:
whatweb -a 1 <URL> #Stealthy
whatweb -a 3 <URL> #Aggresive
webtech -u <URL>
webanalyze -host https://google.com -crawl 2
Potraži ranjivosti verzije web aplikacije
Proveri da li postoji WAF
- https://github.com/EnableSecurity/wafw00f
- https://github.com/Ekultek/WhatWaf.git
- https://nmap.org/nsedoc/scripts/http-waf-detect.html
Trikovi za web tehnologije
Neki trikovi za pronalaženje ranjivosti u različitim dobro poznatim tehnologijama koje se koriste:
- 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)
Imajte u vidu da isti domen može koristiti različite tehnologije na različitim portovima, folderima i poddomenima.
Ako web aplikacija koristi neku od prethodno navedenih dobro poznatih tehnologija/platformi ili neku drugu, ne zaboravite da pretražite Internet za nove trikove (i javite mi!).
Pregled izvornog koda
Ako je source code aplikacije dostupan na github, pored izvođenja od strane vas White box test aplikacije, postoji neka informacija koja bi mogla biti korisna za trenutni Black-Box testing:
- Postoji li Change-log, Readme ili Version fajl ili nešto sa informacijama o verziji dostupnim preko weba?
- Kako i gde su sačuvane credentials? Postoji li neki (pristupačni?) file sa credentials (korisnička imena ili passwords)?
- Da li su passwords u plain text, encrypted ili koji hashing algorithm se koristi?
- Da li koristi neki master key za enkripciju nečega? Koji algorithm se koristi?
- Možete li pristupiti bilo kojem od ovih fajlova iskorišćavanjem neke ranjivosti?
- Ima li neke zanimljive informacije na githubu (rešene i nerešene) issues? Ili u commit history (možda je neka password ubačen u starom commitu)?
{{#ref}} code-review-tools.md {{#endref}}
Automatski skeneri
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 skeneri
Ako se koristi CMS, ne zaboravite da pokrenete skener, možda se nađe nešto korisno:
Clusterd: JBoss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfish
CMSScan: WordPress, Drupal, Joomla, vBulletin web sajtove zbog sigurnosnih problema. (GUI)
VulnX: Joomla, Wordpress, Drupal, PrestaShop, Opencart
CMSMap: (W)ordpress, (J)oomla, (D)rupal ili (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
U ovoj fazi trebalo bi da već imate neke informacije o web serveru koji koristi klijent (ako su dati podaci) i neke trikove koje treba imati na umu tokom testa. Ako imate sreće, čak ste pronašli CMS i pokrenuli neki scanner.
Koračno otkrivanje web aplikacije
Od ovog trenutka počinjemo da interagujemo sa web aplikacijom.
Početne provere
Podrazumevane stranice sa zanimljivim informacijama:
- /robots.txt
- /sitemap.xml
- /crossdomain.xml
- /clientaccesspolicy.xml
- /.well-known/
- Proverite i komentare na glavnim i sekundarnim stranicama.
Navođenje grešaka
Web serveri se mogu ponašati neočekivano kada im se pošalju čudni podaci. To može otvoriti ranjivosti ili dovesti do otkrivanja osetljivih informacija.
- Pristupite lažnim stranicama kao što su /whatever_fake.php (.aspx,.html,.etc)
- Dodajte "[]", "]]", i "[[" u vrednosti cookie-ja i parametara da izazovete greške
- Generišite grešku unošenjem
/~randomthing/%sna kraj URL-a - Isprobajte različite HTTP Verbs kao PATCH, DEBUG ili pogrešne kao FAKE
Proverite da li možete da otpremite fajlove (PUT verb, WebDav)
Ako otkrijete da je WebDav omogućen ali nemate dovoljno dozvola za otpremanje fajlova u root folder, pokušajte da:
- Brute Force credentials
- Upload files via WebDav u ostatak pronađenih foldera unutar web stranice. Možda imate dozvole da otpremite fajlove u drugim folderima.
SSL/TLS ranjivosti
- Ako aplikacija ne primorava korišćenje HTTPS ni u jednom delu, onda je ranjiva na MitM
- Ako aplikacija šalje osetljive podatke (lozinke) koristeći HTTP. To predstavlja visoku ranjivost.
Koristite testssl.sh da proverite ranjivosti (u Bug Bounty programima verovatno ove vrste ranjivosti neće biti prihvaćene) i koristite a2sv da ponovo proverite ranjivosti:
./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>
Informacije o SSL/TLS ranjivostima:
- https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/
- https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/
Spidering
Pokrenite neku vrstu spider unutar web-a. Cilj spider-a je da pronađe što više putanja iz testirane aplikacije. Stoga, web crawling i eksterni izvori treba da se koriste da bi se pronašlo što više validnih putanja.
- gospider (go): HTML spider, LinkFinder u JS files i eksternim izvorima (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com).
- hakrawler (go): HML spider, sa LinkFider za JS files i Archive.org kao eksterni izvor.
- dirhunt (python): HTML spider, takođe označava "juicy files".
- evine (go): Interaktivni CLI HTML spider. Takođe pretražuje Archive.org
- meg (go): Ovaj alat nije spider ali može biti koristan. Možete samo navesti fajl sa hostovima i fajl sa putanjama i meg će fetch-ovati svaku putanju na svakom hostu i sačuvati odgovor.
- urlgrab (go): HTML spider sa JS rendering mogućnostima. Međutim, izgleda da nije održavan, prekompajlirana verzija je stara i trenutni kod se ne kompajlira
- gau (go): HTML spider koji koristi eksterne provajdere (wayback, otx, commoncrawl)
- ParamSpider: Skripta koja će naći URL-ove sa parametrima i izlistati ih.
- galer (go): HTML spider sa JS rendering mogućnostima.
- LinkFinder (python): HTML spider, sa JS beautify mogućnostima sposoban da traži nove putanje u JS files. Može biti korisno takođe pogledati JSScanner, koji je wrapper LinkFinder-a.
- goLinkFinder (go): Za ekstrakciju endpoints kako iz HTML source-a tako i iz embedded javascript fajlova. Korisno za bug hunter-e, red team-e, infosec ninje.
- JSParser (python2.7): Python 2.7 skripta koja koristi Tornado i JSBeautifier za parsiranje relativnih URL-ova iz JavaScript fajlova. Korisno za lako otkrivanje AJAX zahteva. Izgleda neodržavano.
- relative-url-extractor (ruby): Za dati fajl (HTML) ekstrahuje URL-ove koristeći zgodan regularni izraz da pronađe i izvuče relativne URL-ove iz "ružnih" (minify) fajlova.
- JSFScan (bash, nekoliko alata): Prikuplja interesantne informacije iz JS files koristeći više alata.
- subjs (go): Pronalazi JS files.
- page-fetch (go): Učita stranicu u headless browser-u i ispiše sve URL-ove koje je učitao da bi učitao stranicu.
- Feroxbuster (rust): Tool za otkrivanje sadržaja kombinujući nekoliko opcija prethodnih alata
- Javascript Parsing: Burp ekstenzija za pronalaženje path i params u JS files.
- Sourcemapper: Alat koji, dat .js.map URL, dobije beatified JS kod
- xnLinkFinder: Alat za otkrivanje endpoints za dati target.
- waymore: Otkrij linkove iz wayback machine-a (takođe preuzimajući odgovore u wayback i tražeći dalje linkove)
- HTTPLoot (go): Crawl-uje (čak i popunjavanjem formi) i takođe pronalazi osetljive informacije koristeći specifične regex-e.
- SpiderSuite: Spider Suite je napredni multi-feature GUI web security Crawler/Spider dizajniran za cyber security profesionalce.
- jsluice (go): Go package i command-line tool za ekstrakciju URL-ova, putanja, sekretâ i drugih interesantnih podataka iz JavaScript source koda.
- ParaForge: ParaForge je jednostavna Burp Suite extension za ekstrakciju parametara i endpoints iz request-a da bi se kreirao custom wordlist za fuzzing i enumeraciju.
- katana (go): Sjajan tool za ovo.
- Crawley (go): Ispisuje svaki link koji uspe da pronađe.
Brute Force directories and files
Počnite sa brute-forcing iz root folder-a i obavezno brute-force-ujte sve direktorijume koji su pronađeni koristeći ovu metodu i sve direktorijume otkrivene tokom Spidering (možete izvršiti brute-forcing rekurzivno i dodati na početak korišćene wordlist-e imena pronađenih direktorijuma).
Tools:
- Dirb / Dirbuster - Included in Kali, old (and slow) but functional. Allow auto-signed certificates and recursive search. Too slow compared with th other options.
- Dirsearch (python): It doesn't allow auto-signed certificates but allows recursive search.
- Gobuster (go): It allows auto-signed certificates, it doesn't have recursive search.
- 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): This isn't a spider but a tool that given the list of found URLs will to delete "duplicated" URLs.
- Scavenger: Burp Extension to create a list of directories from the burp history of different pages
- TrashCompactor: Remove URLs with duplicated functionalities (based on js imports)
- Chamaleon: It uses wapalyzer to detect used technologies and select the wordlists to use.
Preporučene liste reči:
- 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
Napomena: kad god se novi direktorijum otkrije tokom brute-forcing-a ili spidering-a, treba da bude Brute-Forced.
What to check on each file found
- Broken link checker: Pronađi broken links unutar HTML-a koji mogu biti podložni takeovers.
- File Backups: Kada nađete sve fajlove, tražite backup-ove svih izvršnih fajlova (".php", ".aspx"...). Uobičajene varijante imenovanja backupa su: file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old. Takođe možete koristiti alat bfac ili backup-gen.
- Discover new parameters: Možete koristiti alate kao što su Arjun, parameth, x8 i Param Miner da otkrijete skrivene parametre. Ako možete, pokušajte da tražite skrivene parametre u svakom izvršnom web fajlu.
- 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: Proverite komentare u svim fajlovima, možete pronaći credentials ili skrivenu funkcionalnost.
- Ako radite CTF, "uobičajen" trik je da sakrijete informacije unutar komentara na desnoj strani stranice (koristeći stotine space karaktera tako da ne vidite podatke ako otvorite source code u browser-u). Druga mogućnost je da koristite više novih linija i sakrijete informaciju u komentaru na dnu web strane.
- API keys: Ako pronađete bilo koji API key postoji vodič koji pokazuje kako koristiti API keys različitih platformi: keyhacks, zile, truffleHog, SecretFinder, RegHex, DumpsterDive, EarlyBird
- Google API keys: Ako pronađete API key koji izgleda kao AIzaSyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik možete koristiti projekat gmapapiscanner da proverite koje api-je ključ može da pristupi.
- S3 Buckets: Tokom spidering-a proverite da li neki subdomain ili neki link ima veze sa nekim S3 bucket-om. U tom slučaju, check the permissions of the bucket.
Special findings
Tokom izvođenja spidering i brute-forcing možete naići na interesantne stvari koje treba primetiti.
Interesting files
- Potražite linkove ka drugim fajlovima unutar CSS files.
- If you find a .git file some information can be extracted
- Ako nađete .env fajl, mogu se naći informacije kao što su api keys, dbs passwords i druge informacije.
- Ako nađete API endpoints treba da ih takođe testirate. Ovo nisu fajlovi, ali će verovatno "izgledati" kao oni.
- JS files: U sekciji spidering pomenuto je više alata koji mogu ekstrahovati putanje iz JS files. Takođe bi bilo interesantno monitorovati svaki JS fajl koji pronađete, jer u nekim situacijama promena može ukazivati da je potencijalna ranjivost uvedena u kod. Možete, na primer, koristiti JSMon.
- Takođe bi trebalo proveriti otkrivene JS files sa RetireJS ili JSHole da biste otkrili da li su ranjivi.
- 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 with chars:"[]!+" https://enkhee-osiris.github.io/Decoder-JSFuck/)
- TrainFuck:
+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23. - U više navrata biće potrebno razumeti regularne izraze koji se koriste. Ovo će biti korisno: https://regex101.com/ ili https://pythonium.net/regex
- Takođe možete monitorovati fajlove gde su detektovane forme, jer promena u parametrima ili pojavljivanje nove forme može ukazivati na potencijalno novu ranjivu funkcionalnost.
403 Forbidden/Basic Authentication/401 Unauthorized (bypass)
{{#ref}} 403-and-401-bypasses.md {{#endref}}
502 Proxy Error
Ako neka stranica odgovori tim kodom, verovatno je loše konfigurisan proxy. Ako pošaljete HTTP zahtev kao: GET https://google.com HTTP/1.1 (sa host header-om i ostalim uobičajenim header-ima), proxy će pokušati da pristupi google.com i tada ste pronašli SSRF.
NTLM Authentication - Info disclosure
Ako server koji traži autentifikaciju radi na Windows ili nađete login koji traži vaše credentials (i traži i domain name), možete izazvati otkrivanje informacija.
Pošaljite header: “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=” i zbog načina na koji NTLM authentication radi, server će u header-u "WWW-Authenticate" odgovoriti internim informacijama (IIS version, Windows version...).
Možete ovo automatizovati koristeći nmap plugin "http-ntlm-info.nse".
HTTP Redirect (CTF)
Moguće je ubaciti sadržaj unutar Redirection. Taj sadržaj neće biti prikazan korisniku (jer će browser izvršiti redirekciju) ali nešto može biti sakriveno u njemu.
Web Vulnerabilities Checking
Sad kada je izvršena sveobuhvatna enumeracija web aplikacije, vreme je da se proveri veliki broj mogućih ranjivosti. Možete pronaći checklist ovde:
{{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md {{#endref}}
Više informacija o web vuln-ovima:
- 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
Možete koristiti alate kao što je https://github.com/dgtlmoon/changedetection.io za praćenje stranica radi modifikacija koje bi mogle uvesti ranjivosti.
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}
{{#include ../../banners/hacktricks-training.md}}