..

80,443 - Pentesting Web Methodology

{{#include ../../banners/hacktricks-training.md}}

Основна інформація

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

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

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

{{#ref}} web-api-pentesting.md {{#endref}}

Короткий огляд методології

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

  • Почніть з ідентифікації технологій, які використовує веб-сервер. Шукайте трюки/підказки, які варто мати на увазі під час решти тесту, якщо вам вдалося визначити технологію.
  • Чи є якісь відомі вразливості для версії цієї технології?
  • Використовується якась well known tech? Є якісь useful trick для отримання додаткової інформації?
  • Чи є specialised scanner, який потрібно запустити (наприклад wpscan)?
  • Запустіть general purposes scanners. Ви ніколи не знаєте, чи знайдуть вони щось або якусь цікаву інформацію.
  • Почніть з initial checks: robots, sitemap, 404 error та SSL/TLS scan (якщо HTTPS).
  • Почніть spidering веб-сторінки: настав час знайти всі можливі files, folders та parameters being used. Також перевірте на special findings.
  • Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється новий каталог, він має бути spidered.
  • Directory Brute-Forcing: Спробуйте brute force всі виявлені папки у пошуках нових files та directories.
  • Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється новий каталог, його слід Brute-Forced.
  • Backups checking: Перевірте, чи можете знайти backups для discovered files, додаючи поширені розширення резервних копій.
  • Brute-Force parameters: Спробуйте знайти приховані параметри.
  • Коли ви ідентифікували всі можливі endpoints, що приймають user input, перевірте їх на всі види пов'язаних вразливостей.
  • Дотримуйтесь цього контрольного списку

Server Version (Vulnerable?)

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

Перевірте, чи є відомі вразливості для версії сервера, яка запущена.\ HTTP headers and cookies of the response можуть бути дуже корисними для identify technologies та/або version, що використовуються. Nmap scan може визначити версію сервера, але також можуть бути корисні інструменти whatweb, webtech or https://builtwith.com/:

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

Шукати вразливості версії веб‑застосунку

Перевірити, чи є WAF

Хитрощі веб‑технологій

Деякі хитрощі для знаходження вразливостей у різних відомих технологіях, що використовуються:

Врахуйте, що той самий домен може використовувати різні технології на різних портах, папках та субдоменах.
Якщо веб‑застосунок використовує будь‑яку з перелічених вище відомих технологій/платформ або будь‑яку іншу, не забудьте шукати в Інтернеті нові хитрощі (і повідомте мені!).

Перегляд вихідного коду

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

  • Чи є Change-log or Readme or Version файл чи будь‑що з інформацією про версію, доступне через веб?
  • Як і де зберігаються credentials? Чи є якийсь (доступний?) файл з credentials (usernames або passwords)?
  • Чи зберігаються passwords у plain text, encrypted або який hashing algorithm використовується?
  • Чи використовується якийсь master key для шифрування чогось? Який algorithm використовується?
  • Чи можете ви отримати доступ до будь‑якого з цих файлів, експлуатуючи якусь вразливість?
  • Чи є якась цікава інформація в github (вирішені та невирішені) issues? Або в commit history (можливо якийсь password був доданий у старому коміті)?

{{#ref}} code-review-tools.md {{#endref}}

Автоматизовані сканери

Автоматичні сканери загального призначення

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

cmsmap [-f W] -F -d <URL>
wpscan --force update -e --url <URL>
joomscan --ec -u <URL>
joomlavs.rb #https://github.com/rastating/joomlavs

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

Step-by-step Web Application Discovery

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

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

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

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

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

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

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

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

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

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

SSL/TLS вразливості

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

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

Information about SSL/TLS vulnerabilities:

Spidering

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

  • gospider (go): HTML spider, LinkFinder у JS файлах та зовнішніх джерелах (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com).
  • hakrawler (go): HTML spider, з LinkFider для JS файлів та Archive.org як зовнішнім джерелом.
  • dirhunt (python): HTML spider, також вказує на "juicy files".
  • evine (go): Інтерактивний CLI HTML spider. Також шукає в Archive.org
  • meg (go): Цей інструмент не є spider, але може бути корисним. Ви можете вказати файл з hosts та файл з paths, і meg завантажить кожен path для кожного host та збереже відповіді.
  • urlgrab (go): HTML spider з можливістю рендерингу JS. Однак, здається, що він не підтримується, попередньо скомпільована версія стара і поточний код не компілюється.
  • gau (go): HTML spider, який використовує зовнішніх провайдерів (wayback, otx, commoncrawl)
  • ParamSpider: Скрипт, який знайде URL з параметрами і виведе їх список.
  • galer (go): HTML spider з можливістю рендерингу JS.
  • LinkFinder (python): HTML spider з можливістю beautify JS, здатний шукати нові шляхи у JS файлах. Також варто глянути на JSScanner, який є обгорткою для LinkFinder.
  • goLinkFinder (go): Для витягування endpoints як з HTML-джерела, так і з вбудованих javascript файлів. Корисно для bug hunters, red teamers, infosec ninjas.
  • JSParser (python2.7): Скрипт на python 2.7 з Tornado і JSBeautifier для парсингу відносних URL з JavaScript файлів. Корисний для швидкого виявлення AJAX-запитів. Здається, що не підтримується.
  • relative-url-extractor (ruby): Дає файл (HTML) і витягує URL з нього, використовуючи хитрі регулярні вирази для знаходження і витягання відносних URL з зламаних (minify) файлів.
  • JSFScan (bash, several tools): Збирає цікаву інформацію з JS файлів за допомогою кількох інструментів.
  • subjs (go): Знаходить JS файли.
  • page-fetch (go): Завантажує сторінку в headless browser і виводить всі URL, які були підвантажені для завантаження сторінки.
  • Feroxbuster (rust): Інструмент для content discovery, що поєднує кілька опцій попередніх інструментів.
  • Javascript Parsing: Розширення Burp для знаходження шляхів і параметрів у JS файлах.
  • Sourcemapper: Інструмент, який за .js.map URL дає вам beautified JS код.
  • xnLinkFinder: Інструмент для виявлення endpoints для заданої цілі.
  • waymore: Відкриває посилання з wayback machine (також завантажуючи відповіді у wayback і шукаючи більше посилань).
  • HTTPLoot (go): Краулер (навіть заповнюючи форми) та також знаходить чутливу інформацію використовуючи специфічні regex-и.
  • SpiderSuite: Spider Suite — це просунутий мультіфункціональний GUI web security Crawler/Spider для спеціалістів з кібербезпеки.
  • jsluice (go): Пакет на Go та command-line tool для витягання URL, шляхів, секретів та іншої цікавої інформації з JavaScript source code.
  • ParaForge: ParaForge — просте Burp Suite extension для витягання параметрів і endpoints з request-ів для створення кастомних wordlist-ів для fuzzing та enumeration.
  • katana (go): Чудовий інструмент для цього.
  • Crawley (go): Виводить кожне посилання, яке йому вдається знайти.

Brute Force directories and files

Починайте brute-forcing з кореневої папки і переконайтесь, що ви brute-force-ите всі директорії, знайдені цим методом, а також усі директорії, виявлені під час Spidering (ви можете робити brute-forcing рекурсивно і додавати на початок використовуваного wordlist імена знайдених директорій).
Інструменти:

  • Dirb / Dirbuster - Включено в Kali, старі (і повільні), але функціональні. Дозволяють auto-signed certificates і рекурсивний пошук. Занадто повільні у порівнянні з іншими опціями.
  • Dirsearch (python): Не дозволяє auto-signed certificates, але дозволяє рекурсивний пошук.
  • Gobuster (go): Дозволяє auto-signed certificates, але не має рекурсивного пошуку.
  • 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): Це не spider, але інструмент, який з даного списку знайдених URL видалить "дублікати" URL.
  • Scavenger: Burp Extension для створення списку директорій з burp history різних сторінок.
  • TrashCompactor: Видаляє URL з дубльованим функціоналом (на основі js imports).
  • Chamaleon: Використовує wapalyzer для визначення використаних технологій і підбору відповідних wordlists.

Рекомендовані словники:

Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється нова директорія, її слід Brute-Force-ити.

What to check on each file found

  • Broken link checker: Знайти broken links всередині HTML, які можуть бути вразливими до takeover.
  • File Backups: Після того як ви знайшли всі файли, шукайте бекапи всіх виконуваних файлів (".php", ".aspx"...). Поширені варіації імен для бекапів: file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp та file.old. Також можна використати інструмент bfac або backup-gen.
  • Discover new parameters: Ви можете використовувати інструменти, такі як Arjun, parameth, x8 та Param Miner для виявлення прихованих параметрів. Якщо можливо, спробуйте шукати приховані параметри у кожному виконуваному web-файлі.
  • 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: Перевіряйте коментарі у всіх файлах — там можна знайти credentials або приховану функціональність.
  • Якщо ви граєте в CTF, "поширений" трюк — ховати інформацію всередині коментарів праворуч від сторінки (використовуючи сотні пробілів, щоб ви не бачили дані при відкритті коду у браузері). Інша можливість — використовувати кілька нових рядків і сховати інформацію в коментарі внизу веб-сторінки.
  • API keys: Якщо ви знайдете будь-який API key, існують гайди/проекти, які показують, як використовувати API keys різних платформ: keyhacks, zile, truffleHog, SecretFinder, RegHex, DumpsterDive, EarlyBird
  • Google API keys: Якщо ви знайдете API key, що починається з AIzaSyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik — ви можете використати проект gmapapiscanner щоб перевірити, до яких API ключ має доступ.
  • S3 Buckets: Під час spidering перевіряйте, чи якийсь subdomain або link пов'язаний з S3 bucket. У такому випадку перевірте права доступу до bucket.

Special findings

Під час виконання spidering та brute-forcing ви можете знайти цікаві речі, на які слід звернути увагу.

Interesting files

  • Шукайте посилання на інші файли всередині CSS файлів.
  • Якщо ви знайдете .git файл, з нього можна витягти деяку інформацію
  • Якщо ви знайдете .env, там можна знайти інформацію, наприклад api keys, паролі до БД та інші дані.
  • Якщо ви знайдете API endpoints, ви повинні також протестувати їх. Це не файли, але вони, ймовірно, будуть "виглядати" як файли.
  • JS files: У розділі spidering згадувались інструменти, які можуть витягувати шляхи з JS файлів. Також корисно моніторити кожен знайдений JS файл, оскільки в деяких випадках зміни можуть вказувати, що в код було внесено потенційну вразливість. Можете використати, наприклад, JSMon.
  • Також варто перевіряти виявлені JS файли за допомогою RetireJS або JSHole на наявність відомих вразливостей.
  • 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.
  • У багатьох випадках вам знадобиться розуміти регулярні вирази, які використовуються. Це буде корисно: https://regex101.com/ або https://pythonium.net/regex
  • Ви також можете моніторити файли, в яких були знайдені форми, оскільки зміна параметрів або поява нової форми може вказувати на потенційно нову вразливу функціональність.

403 Forbidden/Basic Authentication/401 Unauthorized (bypass)

{{#ref}} 403-and-401-bypasses.md {{#endref}}

502 Proxy Error

Якщо будь-яка сторінка відповідає цим кодом, ймовірно це неправильно налаштований proxy. Якщо ви відправите HTTP-запит типу: GET https://google.com HTTP/1.1 (з заголовком host та іншими загальними заголовками), proxy спробує доступитися до google.com і ви знайдете SSRF.

NTLM Authentication - Info disclosure

Якщо сервер, який запитує аутентифікацію, — Windows, або ви бачите логін, що просить ваші credentials (і запитує domain name), ви можете спричинити витік інформації.
Відправте заголовок: “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=” і через те, як працює NTLM authentication, сервер відповість внутрішньою інформацією (версія IIS, версія Windows...) у заголовку "WWW-Authenticate".
Ви можете автоматизувати це за допомогою nmap плагіна "http-ntlm-info.nse".

HTTP Redirect (CTF)

Можна вкласти контент всередину редиректу. Цей контент не буде відображатися користувачу (бо браузер виконає редирект), але в ньому може бути схована інформація.

Web Vulnerabilities Checking

Тепер, коли виконана всебічна енумерація веб-застосунку, настав час перевірити велику кількість можливих вразливостей. Чекліст доступний тут:

{{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md {{#endref}}

Дізнайтесь більше про web vulns тут:

Monitor Pages for changes

Ви можете використовувати інструменти, такі як https://github.com/dgtlmoon/changedetection.io, щоб моніторити сторінки на предмет змін, які можуть ввести вразливості.

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}}