80,443 - Pentesting Веб-методологія

Reading time: 20 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Базова інформація

Веб-сервіс — найпоширеніший і наймасштабніший сервіс, і існує багато різних типів вразливостей.

Порт за замовчуванням: 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

Керівництво Web API

Web API Pentesting

Резюме методології

У цій методології ми припускаємо, що ви збираєтеся attack один domain (або subdomain) і лише його. Тож цю методологію слід застосовувати до кожного виявленого domain, subdomain або IP з невизначеним web server у межах scope.

  • Почніть із ідентифікації technologies, які використовує web server. Якщо вдасться визначити tech, зверніть увагу на tricks, які варто пам'ятати під час решти тесту.
  • Чи є known vulnerability для версії цієї технології?
  • Використовується відомий tech? Є якісь корисні tricks для отримання додаткової інформації?
  • Чи є спеціалізований scanner для запуску (наприклад, wpscan)?
  • Запустіть general purposes scanners. Ви ніколи не знаєте, чи знайдуть вони щось або знайдуть якусь цікаву інформацію.
  • Почніть із початкових перевірок: robots, sitemap, 404 error та SSL/TLS scan (якщо HTTPS).
  • Почніть spidering веб-сторінки: настав час знайти всі можливі файли, папки та параметри, що використовуються. Також перевірте на особливі знахідки.
  • Зверніть увагу, що будь-який новий directory, виявлений під час brute-forcing або spidering, повинен бути spidered.
  • Directory Brute-Forcing: Спробуйте brute force всі виявлені папки в пошуку нових файлів та directory.
  • Зверніть увагу, що будь-який новий directory, виявлений під час brute-forcing або spidering, повинен бути Brute-Forced.
  • Backups checking: Перевірте, чи можете знайти backups виявлених файлів, додаючи поширені розширення резервних копій.
  • Brute-Force parameters: Спробуйте знайти приховані parameters.
  • Коли ви ідентифікували всі можливі endpoints, що приймають user input, перевірте їх на всі типи пов'язаних vulnerabilities.
  • Дотримуйтесь цього чекліста

Версія сервера (вразлива?)

Ідентифікація

Перевірте, чи є known vulnerabilities для сервер version, яка запущена.
HTTP headers and cookies of the response можуть бути дуже корисними для identify technologies і/або version, що використовується. Nmap scan може ідентифікувати версію сервера, але також можуть бути корисні інструменти 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

Шукати vulnerabilities of the web application version

Перевірте наявність WAF

Трюки для web-технологій

Деякі трюки для пошуку vulnerabilities у різних відомих technologies, що використовуються:

Vрахуйте, що same domain може використовувати different technologies на різних ports, folders та subdomains.
Якщо web application використовує будь-яку добре відому tech/platform listed before або any other, не забудьте search on the Internet нові трюки (і повідомте мені!).

Огляд вихідного коду

Якщо source code додатку доступний у github, окрім виконання власного White box test додатку, є деяка інформація, яка може бути корисною для поточного Black-Box testing:

  • Чи існує Change-log or Readme or Version файл або будь-який файл з інформацією про версію, доступний через веб?
  • Як і де зберігаються credentials? Чи існує якийсь (доступний?) file з credentials (usernames або passwords)?
  • Чи збережені passwords у plain text, encrypted, або який hashing algorithm використовується?
  • Чи використовується якийсь master key для шифрування чогось? Який algorithm використовується?
  • Чи можете ви access any of these files, експлуатуючи якусь вразливість?
  • Чи є якась interesting information in the github (вирішені та невирішені) issues? Або в commit history (можливо, якийсь password introduced inside an old commit)?

Source code Review / SAST Tools

Automatic scanners

General purpose automatic scanners

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"

CMS сканери

Якщо використовується CMS, не забудьте запустити сканер, можливо знайдеться щось цікаве:

Clusterd: JBoss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfish
CMSScan: WordPress, Drupal, Joomla, vBulletin для виявлення проблем безпеки на сайтах. (GUI)
VulnX: Joomla, Wordpress, Drupal, PrestaShop, Opencart
CMSMap: (W)ordpress, (J)oomla, (D)rupal або (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

На цьому етапі у вас вже має бути деяка інформація про веб-сервер, що його використовує клієнт (якщо надано дані), та декілька прийомів, які варто пам'ятати під час тесту. Якщо пощастило, ви навіть знайшли CMS і запустили якийсь сканер.

Покрокове виявлення веб-застосунку

З цього моменту ми починаємо взаємодіяти з веб-застосунком.

Початкові перевірки

Сторінки за замовчуванням з цікавою інформацією:

  • /robots.txt
  • /sitemap.xml
  • /crossdomain.xml
  • /clientaccesspolicy.xml
  • /.well-known/
  • Перевірте також коментарі на головних і другорядних сторінках.

Виклик помилок

Веб-сервери можуть поводитися непередбачувано, коли їм надсилають некоректні дані. Це може відкрити вразливості або призвести до розкриття конфіденційної інформації.

  • Доступ до fake pages типу /whatever_fake.php (.aspx,.html,.etc)
  • Додайте "[]", "]]" і "[[" у значення cookie та значення параметрів, щоб спричинити помилки
  • Згенеруйте помилку, передавши введення як /~randomthing/%s в кінці URL
  • Спробуйте різні HTTP Verbs, наприклад PATCH, DEBUG або некоректні, як FAKE

Перевірте, чи можете завантажувати файли (PUT verb, WebDav)

Якщо ви виявите, що WebDav увімкнений, але у вас недостатньо прав для завантаження файлів в кореневу папку, спробуйте:

  • Brute Force credentials
  • Завантажувати файли через WebDav у інші знайдені папки на сайті. Можливо, у вас є права на завантаження файлів в інших папках.

SSL/TLS vulnerabilites

  • Якщо застосунок не змушує використовувати HTTPS в жодній частині, то він вразливий до MitM
  • Якщо застосунок надсилає конфіденційні дані (паролі) по HTTP — це серйозна вразливість.

Використовуйте testssl.sh для перевірки вразливостей (у Bug Bounty програмах такі вразливості, ймовірно, не будуть прийняті) та використовуйте 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>

Information about SSL/TLS vulnerabilities:

Spidering

Запустіть якийсь вид spider всередині веб-додатку. Мета spider — знайти якомога більше шляхів у тестованому застосунку. Тому для обходу слід використовувати web crawling та зовнішні джерела, щоб знайти якомога більше дійсних шляхів.

  • gospider (go): HTML spider, LinkFinder in JS files and external sources (Archive.org, CommonCrawl.org, VirusTotal.com).
  • hakrawler (go): HML spider, with LinkFider for JS files and Archive.org as external source.
  • dirhunt (python): HTML spider, also indicates "juicy files".
  • evine (go): Interactive CLI HTML spider. It also searches in Archive.org
  • meg (go): This tool isn't a spider but it can be useful. You can just indicate a file with hosts and a file with paths and meg will fetch each path on each host and save the response.
  • urlgrab (go): HTML spider with JS rendering capabilities. However, it looks like it's unmaintained, the precompiled version is old and the current code doesn't compile
  • gau (go): HTML spider that uses external providers (wayback, otx, commoncrawl)
  • ParamSpider: This script will find URLs with parameter and will list them.
  • galer (go): HTML spider with JS rendering capabilities.
  • LinkFinder (python): HTML spider, with JS beautify capabilities capable of search new paths in JS files. It could be worth it also take a look to JSScanner, which is a wrapper of LinkFinder.
  • goLinkFinder (go): To extract endpoints in both HTML source and embedded javascript files. Useful for bug hunters, red teamers, infosec ninjas.
  • JSParser (python2.7): A python 2.7 script using Tornado and JSBeautifier to parse relative URLs from JavaScript files. Useful for easily discovering AJAX requests. Looks like unmaintained.
  • relative-url-extractor (ruby): Given a file (HTML) it will extract URLs from it using nifty regular expression to find and extract the relative URLs from ugly (minify) files.
  • JSFScan (bash, several tools): Gather interesting information from JS files using several tools.
  • subjs (go): Find JS files.
  • page-fetch (go): Load a page in a headless browser and print out all the urls loaded to load the page.
  • Feroxbuster (rust): Content discovery tool mixing several options of the previous tools
  • Javascript Parsing: A Burp extension to find path and params in JS files.
  • Sourcemapper: A tool that given the .js.map URL will get you the beatified JS code
  • xnLinkFinder: This is a tool used to discover endpoints for a given target.
  • waymore: Discover links from the wayback machine (also downloading the responses in the wayback and looking for more links
  • HTTPLoot (go): Crawl (even by filling forms) and also find sensitive info using specific regexes.
  • SpiderSuite: Spider Suite is an advance multi-feature GUI web security Crawler/Spider designed for cyber security professionals.
  • jsluice (go): It's a Go package and command-line tool for extracting URLs, paths, secrets, and other interesting data from JavaScript source code.
  • ParaForge: ParaForge is a simple Burp Suite extension to extract the paramters and endpoints from the request to create custom wordlist for fuzzing and enumeration.
  • katana (go): Awesome tool for this.
  • Crawley (go): Print every link it's able to find.

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

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

If any page responds with that code, it's probably a bad configured proxy. If you send a HTTP request like: GET https://google.com HTTP/1.1 (with the host header and other common headers), the proxy will try to access google.com and you will have found a SSRF.

NTLM Authentication - Info disclosure

If the running server asking for authentication is Windows or you find a login asking for your credentials (and asking for domain name), you can provoke an information disclosure.
Send the header: “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=” and due to how the NTLM authentication works, the server will respond with internal info (IIS version, Windows version...) inside the header "WWW-Authenticate".
You can automate this using the nmap plugin "http-ntlm-info.nse".

HTTP Redirect (CTF)

It is possible to put content inside a Redirection. This content won't be shown to the user (as the browser will execute the redirection) but something could be hidden in there.

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

You can use tools such as https://github.com/dgtlmoon/changedetection.io to monitor pages for modifications that might insert vulnerabilities.

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

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks