80,443 - Pentesting Web Methodology

Reading time: 19 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Podstawowe informacje

Serwis webowy jest najbardziej powszechną i rozległą usługą, a występuje wiele różnych typów podatności.

Domyślny port: 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

Wskazówki dotyczące Web API

Web API Pentesting

Podsumowanie metodologii

W tej metodologii założymy, że zamierzasz zaatakować jedną domenę (lub subdomenę) i tylko ją. Zatem powinieneś stosować tę metodologię do każdej odkrytej domeny, subdomeny lub adresu IP z nieokreślonym serwerem WWW w zakresie.

  • Zacznij od identyfikacji technologii używanych przez serwer WWW. Poszukaj tricków, o których warto pamiętać podczas reszty testu, jeśli uda Ci się zidentyfikować technologię.
  • Czy istnieje jakaś znana podatność dla wersji tej technologii?
  • Używana jakaś well known tech? Jakiś przydatny trick do wydobycia większej ilości informacji?
  • Jakiś specialised scanner do uruchomienia (np. wpscan)?
  • Uruchom general purposes scanners. Nigdy nie wiesz, czy znajdą coś lub odkryją interesujące informacje.
  • Zacznij od initial checks: robots, sitemap, 404 error oraz SSL/TLS scan (jeśli HTTPS).
  • Rozpocznij spidering strony: to czas, aby znaleźć wszystkie możliwe pliki, foldery i parametry będące w użyciu. Sprawdź również special findings.
  • Uwaga: za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-forcing lub spidering, powinien zostać spidered.
  • Directory Brute-Forcing: Spróbuj brute force wszystkich odkrytych folderów w poszukiwaniu nowych plików i katalogów.
  • Uwaga: za każdym razem, gdy nowy katalog zostanie odkryty podczas brute-forcing lub spidering, powinien zostać Brute-Forced.
  • Backups checking: Sprawdź, czy możesz znaleźć backups odkrytych plików, dopisując typowe rozszerzenia kopii zapasowych.
  • Brute-Force parameters: Spróbuj odkryć ukryte parametry.
  • Gdy zidentyfikujesz wszystkie możliwe endpoints akceptujące user input, sprawdź wszystkie rodzaje vulnerabilities z nimi związane.
  • Postępuj według tej listy kontrolnej

Wersja serwera (Podatna?)

Identyfikacja

Sprawdź, czy istnieją znane podatności dla wersji serwera, która jest uruchomiona.
The HTTP headers and cookies of the response could be very useful to identify the technologies and/or version being used. Nmap scan can identify the server version, but it could also be useful the tools whatweb, webtech or https://builtwith.com/:

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

Wyszukaj dla vulnerabilities of the web application version

Sprawdź czy jest jakiś WAF

Triki technologii webowych

Kilka trików do znajdowania podatności w różnych znanych technologiach używanych:

Weź pod uwagę, że ta sama domena może korzystać z różnych technologii na różnych portach, folderach i subdomenach.
Jeśli aplikacja webowa używa którejś z wcześniej wymienionych dobrze znanych technologii/platform lub jakiejkolwiek innej, nie zapomnij poszukać w Internecie nowych trików (i daj mi znać!).

Przegląd kodu źródłowego

Jeśli kod źródłowy aplikacji jest dostępny w github, oprócz wykonania przez Ciebie White box test aplikacji istnieją pewne informacje, które mogą być użyteczne dla bieżącego Black-Box testingu:

  • Czy istnieje plik Change-log or Readme or Version lub cokolwiek z version info accessible dostępne przez web?
  • Jak i gdzie są przechowywane credentials? Czy istnieje jakiś (dostępny?) file z credentials (usernames or passwords)?
  • Czy passwords są w plain text, encrypted czy jaki hashing algorithm jest używany?
  • Czy używany jest jakiś master key do szyfrowania czegoś? Jaki algorithm jest używany?
  • Czy możesz access any of these files wykorzystując jakąś podatność?
  • Czy są jakieś interesting information in the github (solved and not solved) issues? Albo w commit history (może jakieś password introduced inside an old commit)?

Source code Review / SAST Tools

Automatyczne skanery

Skanery automatyczne ogólnego przeznaczenia

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"

Skanery CMS

Jeśli używany jest CMS, nie zapomnij run a scanner, może znajdziesz coś wartościowego:

Clusterd: JBoss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfish
CMSScan: WordPress, Drupal, Joomla, vBulletin witryny pod kątem problemów z bezpieczeństwem. (GUI)
VulnX: Joomla, Wordpress, Drupal, PrestaShop, Opencart
CMSMap: (W)ordpress, (J)oomla, (D)rupal lub (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

W tym momencie powinieneś już mieć pewne informacje o serwerze WWW używanym przez klienta (jeśli podano jakiekolwiek dane) oraz kilka sztuczek, o których warto pamiętać podczas testu. Jeśli masz szczęście, znalazłeś nawet CMS i uruchomiłeś jakiś scanner.

Step-by-step Web Application Discovery

Od tego momentu zaczniemy wchodzić w interakcję z aplikacją webową.

Initial checks

Default pages with interesting info:

  • /robots.txt
  • /sitemap.xml
  • /crossdomain.xml
  • /clientaccesspolicy.xml
  • /.well-known/
  • Sprawdź także komentarze na stronach głównych i pomocniczych.

Forcing errors

Serwery WWW mogą zachowywać się nieoczekiwanie, gdy zostaną do nich wysłane dziwne dane. To może otworzyć podatności lub ujawnić wrażliwe informacje.

  • Dostęp do fake pages takich jak /whatever_fake.php (.aspx,.html,.etc)
  • Dodaj "[]", "]]", and "[[" do wartości cookie i wartości parametrów, aby wywołać błędy
  • Wygeneruj błąd, podając wejście jako /~randomthing/%s na końcu URL
  • Spróbuj różnych HTTP Verbs jak PATCH, DEBUG lub błędnych, np. FAKE

Sprawdź, czy możesz przesyłać pliki (PUT verb, WebDav)

Jeśli odkryjesz, że WebDav jest włączony, ale nie masz wystarczających uprawnień do uploading files w katalogu root, spróbuj:

  • Brute Force credentials
  • Upload files via WebDav to the rest of found folders inside the web page. You may have permissions to upload files in other folders.

SSL/TLS podatności

  • Jeśli aplikacja nie wymusza użycia HTTPS w żadnej części, to jest podatna na MitM
  • Jeśli aplikacja wysyła wrażliwe dane (hasła) przez HTTP. To jest poważna podatność.

Use testssl.sh to checks for podatności (In Bug Bounty programs probably these kind of vulnerabilities won't be accepted) and use a2sv to recheck the 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>

Informacje o podatnościach SSL/TLS:

Spidering

Uruchom jakiś spider w obrębie serwisu. Celem spidera jest znalezienie jak największej liczby ścieżek w testowanej aplikacji. Dlatego web crawling i źródła zewnętrzne powinny być użyte, aby znaleźć jak najwięcej poprawnych ścieżek.

  • gospider (go): HTML spider, LinkFinder w plikach JS i źródłach zewnętrznych (Archive.org, CommonCrawl.org, VirusTotal.com).
  • hakrawler (go): HML spider, z LinkFinder dla plików JS i Archive.org jako źródłem zewnętrznym.
  • dirhunt (python): HTML spider, dodatkowo wskazuje "juicy files".
  • evine (go): Interaktywny CLI HTML spider. Szuka też w Archive.org
  • meg (go): To narzędzie nie jest spiderem, ale może być przydatne. Możesz wskazać plik z hostami i plik ze ścieżkami, a meg pobierze każdą ścieżkę na każdym hoście i zapisze odpowiedź.
  • urlgrab (go): HTML spider z możliwością renderowania JS. Wygląda jednak na nieutrzymywany, wersja prekompilowana jest stara, a aktualny kod nie kompiluje się.
  • gau (go): HTML spider, który używa dostawców zewnętrznych (wayback, otx, commoncrawl)
  • ParamSpider: Ten skrypt znajdzie URL-e z parametrami i je wypisze.
  • galer (go): HTML spider z możliwością renderowania JS.
  • LinkFinder (python): HTML spider z funkcjami beautify JS, potrafi wyszukiwać nowe ścieżki w plikach JS. Warto też zerknąć na JSScanner, który jest wrapperem LinkFinder.
  • goLinkFinder (go): Do ekstrakcji endpointów zarówno z źródła HTML, jak i osadzonego javascriptu. Przydatne dla bug hunterów, red teamerów, infosec ninja.
  • JSParser (python2.7): Skrypt w pythonie 2.7 używający Tornado i JSBeautifier do parsowania względnych URL-i z plików JavaScript. Przydatny do odkrywania zapytań AJAX. Wygląda na nieutrzymywany.
  • relative-url-extractor (ruby): Dając plik (HTML) wydobędzie z niego URL-e używając sprytnych regexów do znalezienia i ekstrakcji względnych URL-i z "brzydkich" (minifikowanych) plików.
  • JSFScan (bash, kilka narzędzi): Zbiera interesujące informacje z plików JS używając kilku narzędzi.
  • subjs (go): Znajdź pliki JS.
  • page-fetch (go): Ładuje stronę w headless browser i wypisuje wszystkie URL-e załadowane przy ładowaniu strony.
  • Feroxbuster (rust): Narzędzie do discovery treści łączące kilka opcji z poprzednich narzędzi.
  • Javascript Parsing: Rozszerzenie Burp do znajdowania ścieżek i parametrów w plikach JS.
  • Sourcemapper: Narzędzie, które mając URL do .js.map pobierze dla Ciebie zbeautyfikowany kod JS.
  • xnLinkFinder: Narzędzie służące do odkrywania endpointów dla danego targetu.
  • waymore: Odkrywa linki z wayback machine (również pobierając odpowiedzi z wayback i szukając w nich kolejnych linków).
  • HTTPLoot (go): Crawluje (nawet przez wypełnianie formularzy) i dodatkowo znajduje wrażliwe informacje używając specyficznych regexów.
  • SpiderSuite: Spider Suite to zaawansowany multi-feature GUI web security Crawler/Spider zaprojektowany dla profesjonalistów cyberbezpieczeństwa.
  • jsluice (go): Go package i narzędzie wiersza poleceń do ekstrakcji URL-i, ścieżek, sekretów i innych interesujących danych z kodu źródłowego JavaScript.
  • ParaForge: ParaForge to proste Burp Suite extension do ekstrakcji parametrów i endpointów z requestów do tworzenia custom wordlist do fuzzingu i enumeracji.
  • katana (go): Rewelacyjne narzędzie do tego.
  • Crawley (go): Wypisuje każdy link, który jest w stanie znaleźć.

Brute Force directories and files

Start brute-forcing from the root folder and be sure to brute-force all the directories found using this method and all the directories discovered by the Spidering (you can do this brute-forcing recursively and appending at the beginning of the used wordlist the names of the found directories).
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.

Recommended dictionaries:

Note that anytime a new directory is discovered during brute-forcing or spidering, it should be Brute-Forced.

What to check on each file found

  • Broken link checker: Znajdź broken links wewnątrz HTML-i, które mogą być podatne na takeover.
  • File Backups: Gdy znajdziesz pliki, szukaj backupów wszystkich plików wykonywalnych (".php", ".aspx" ...). Typowe warianty nazewnictwa backupu to: file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp oraz file.old. Możesz też użyć narzędzia bfac lub backup-gen.
  • Discover new parameters: Możesz użyć narzędzi takich jak Arjun, parameth, x8 i Param Miner do odkrywania ukrytych parametrów. Jeśli możesz, spróbuj wyszukać ukryte parametry w każdym wykonywalnym pliku webowym.
  • 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: Sprawdź komentarze we wszystkich plikach — możesz znaleźć credentials lub ukrytą funkcjonalność.
  • Jeśli grasz w CTF, "powszechnym" trikiem jest ukrycie informacji w komentarzach po prawej stronie strony (używając setek spacji tak, by nie widzieć danych przy otwarciu źródła strony w przeglądarce). Inną możliwością jest użycie wielu nowych linii i ukrycie informacji w komentarzu na dole strony.
  • API keys: Jeśli znajdziesz jakiś API key istnieją projekty pokazujące jak używać kluczy do różnych platform: keyhacks, zile, truffleHog, SecretFinder, RegHex, DumpsterDive, EarlyBird
  • Google API keys: Jeśli znajdziesz klucz API zaczynający się od AIzaSyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik możesz użyć projektu gmapapiscanner aby sprawdzić, do których API ten klucz ma dostęp.
  • S3 Buckets: Podczas spiderowania zwróć uwagę, czy jakiś subdomain lub link nie odnosi się do S3 bucket. W takim wypadku sprawdź uprawnienia bucketu.

Special findings

While performing the spidering and brute-forcing you could find interesting things that you have to notice.

Interesting files

403 Forbidden/Basic Authentication/401 Unauthorized (bypass)

403 & 401 Bypasses

502 Proxy Error

Jeśli jakaś strona odpowiada tym kodem, prawdopodobnie jest to źle skonfigurowany proxy. Jeśli wyślesz żądanie HTTP takie jak: GET https://google.com HTTP/1.1 (z host header i innymi standardowymi headerami), proxy spróbuje dostępować do google.com i znalazłeś SSRF.

NTLM Authentication - Info disclosure

Jeśli serwer wymagający autoryzacji to system Windows lub znajdziesz login proszący o Twoje credentials (i o nazwę domeny), możesz wywołać ujawnienie informacji.
Wyślij header: “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=” i z powodu działania NTLM authentication, serwer odpowie wewnętrznymi informacjami (wersja IIS, wersja Windows...) w headerze "WWW-Authenticate".
Możesz zautomatyzować to za pomocą nmap pluginu "http-ntlm-info.nse".

HTTP Redirect (CTF)

Można umieścić treść wewnątrz Redirection. Ta treść nie będzie wyświetlona użytkownikowi (ponieważ przeglądarka wykona przekierowanie), ale coś może być tam ukryte.

Web Vulnerabilities Checking

Now that a comprehensive enumeration of the web application has been performed it's time to check for a lot of possible vulnerabilities. You can find the checklist here:

Web Vulnerabilities Methodology

Find more info about web vulns in:

Monitor Pages for changes

Możesz użyć narzędzi takich jak https://github.com/dgtlmoon/changedetection.io do monitorowania stron pod kątem zmian, które mogą wprowadzić podatności.

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

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks