80,443 - Metodología de Pentesting Web
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Información Básica
El servicio web es el servicio más común y extenso y existen muchos tipos diferentes de vulnerabilidades.
Puerto por defecto: 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
Guía para Web API
Resumen de la metodología
En esta metodología vamos a suponer que vas a atacar un dominio (o subdomain) y solo ese. Por tanto, debes aplicar esta metodología a cada dominio, subdomain o IP descubierta con un servidor web no determinado dentro del alcance.
- Empieza por identificar las tecnologías usadas por el servidor web. Busca trucos a tener en cuenta durante el resto del test si logras identificar la tecnología.
- ¿Alguna vulnerabilidad conocida de la versión de la tecnología?
- ¿Usando alguna well known tech? ¿Algún truco útil para extraer más información?
- ¿Algún specialised scanner para ejecutar (como wpscan)?
- Lanza general purposes scanners. Nunca sabes si van a encontrar algo o si van a encontrar información interesante.
- Comienza con las initial checks: robots, sitemap, 404 error y SSL/TLS scan (si HTTPS).
- Comienza a spidering la página web: es momento de encontrar todos los posibles files, folders y parameters being used. También, revisa por special findings.
- Nota que cada vez que se descubra un nuevo directorio durante brute-forcing o spidering, este debe ser spidered.
- Directory Brute-Forcing: Intenta brute force en todas las carpetas descubiertas buscando nuevos files y directories.
- Nota que cada vez que se descubra un nuevo directorio durante brute-forcing o spidering, este debe ser Brute-Forced.
- Backups checking: Prueba si puedes encontrar backups de discovered files añadiendo extensiones de backup comunes.
- Brute-Force parameters: Intenta encontrar parámetros ocultos.
- Una vez que hayas identificado todos los posibles endpoints que aceptan user input, revisa todo tipo de vulnerabilidades relacionadas con ellos.
- Sigue esta lista de verificación
Versión del servidor (¿Vulnerable?)
Identificar
Comprueba si hay vulnerabilidades conocidas para la versión del servidor que está corriendo.
Las HTTP headers y cookies de la respuesta pueden ser muy útiles para identificar las tecnologías y/o la versión empleada. Un escaneo con Nmap puede identificar la versión del servidor, pero también pueden ser útiles las herramientas 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
Buscar por vulnerabilidades de la versión de la aplicación web
Check if any WAF
- https://github.com/EnableSecurity/wafw00f
- https://github.com/Ekultek/WhatWaf.git
- https://nmap.org/nsedoc/scripts/http-waf-detect.html
Web tech tricks
Algunos trucos para encontrar vulnerabilidades en diferentes tecnologías bien conocidas que se estén usando:
- AEM - Adobe Experience Cloud
- Apache
- Artifactory
- Buckets
- CGI
- Custom UDP RPC Protocols
- Dotnet SOAP WSDL client exploitation
- Drupal
- Flask
- Fortinet FortiWeb
- 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
- Roundcube
- Spring Actuators
- Symphony
- Tomcat
- VMWare
- Web API Pentesting
- WebDav
- Werkzeug
- Wordpress
- Electron Desktop (XSS to RCE)
- Sitecore
- Zabbix
Ten en cuenta que el mismo dominio puede estar usando diferentes tecnologías en distintos puertos, carpetas y subdominios.
Si la aplicación web está usando alguna tecnología/plataforma listada antes o cualquier otra, no olvides buscar en Internet nuevos trucos (¡y avísame!).
Source Code Review
Si el código fuente de la aplicación está disponible en github, además de realizar por tu cuenta un White box test de la aplicación, hay alguna información que podría ser útil para el actual Black-Box testing:
- ¿Existe un Change-log or Readme or Version file o cualquier cosa con version info accesible vía web?
- ¿Cómo y dónde se guardan las credenciales? ¿Hay algún (¿accesible?) file con credenciales (usernames o passwords)?
- ¿Las passwords están en plain text, encrypted o qué hashing algorithm se usa?
- ¿Está usando alguna master key para encriptar algo? ¿Qué algorithm se usa?
- ¿Puedes acceder a alguno de estos archivos explotando alguna vulnerabilidad?
- ¿Hay alguna información interesante en el github (issues resueltos y no resueltos)? ¿O en el commit history (quizá alguna password introducida en un commit antiguo)?
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"
Escáneres de CMS
Si se utiliza un CMS, no olvides ejecutar un scanner, quizá se encuentre algo jugoso:
Clusterd: JBoss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfish
CMSScan: WordPress, Drupal, Joomla, vBulletin sitios web en busca de problemas de seguridad. (GUI)
VulnX: Joomla, Wordpress, Drupal, PrestaShop, Opencart
CMSMap: (W)ordpress, (J)oomla, (D)rupal o (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
En este punto ya deberías tener algo de información sobre el servidor web que usa el cliente (si se dio algún dato) y algunos trucos para tener en cuenta durante la prueba. Si tienes suerte, incluso habrás encontrado un CMS y ejecutado algún scanner.
Descubrimiento paso a paso de la aplicación web
Desde este punto vamos a empezar a interactuar con la aplicación web.
Comprobaciones iniciales
Páginas por defecto con información interesante:
- /robots.txt
- /sitemap.xml
- /crossdomain.xml
- /clientaccesspolicy.xml
- /.well-known/
- También revisa los comentarios en la página principal y en las páginas secundarias.
Provocar errores
Los servidores web pueden comportarse de manera inesperada cuando se les envían datos extraños. Esto puede exponer vulnerabilidades o revelar información sensible.
- Accede a páginas falsas como /whatever_fake.php (.aspx,.html,.etc)
- Añade “[]”, “]]” y “[[” en cookie values y parameter values para provocar errores
- Genera un error dando como entrada
/~randomthing/%sal final de la URL - Prueba different HTTP Verbs como PATCH, DEBUG o incluso incorrectos como FAKE
Comprueba si puedes subir archivos (PUT verb, WebDav)
Si descubres que WebDav está habilitado pero no tienes permisos suficientes para subir archivos en la carpeta raíz, intenta:
- Realizar Brute Force sobre las credenciales
- Subir archivos vía WebDav al resto de las carpetas encontradas dentro de la página web. Puede que tengas permisos para subir archivos en otras carpetas.
Vulnerabilidades SSL/TLS
- Si la aplicación no obliga al uso de HTTPS en ninguna parte, entonces es vulnerable a MitM
- Si la aplicación envía datos sensibles (contraseñas) usando HTTP, entonces es una vulnerabilidad alta.
Usa testssl.sh para comprobar vulnerabilidades (en los programas de Bug Bounty probablemente este tipo de vulnerabilidades no serán aceptadas) y usa a2sv para volver a comprobar las vulnerabilidades:
./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:
- https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/
- https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/
Spidering
Lanza algún tipo de spider dentro de la web. El objetivo del spider es encontrar la mayor cantidad de rutas posible desde la aplicación testeada. Por lo tanto, se debe usar web crawling y fuentes externas para localizar la mayor cantidad de rutas válidas posible.
- gospider (go): HTML spider, LinkFinder en archivos JS y fuentes externas (Archive.org, CommonCrawl.org, VirusTotal.com).
- hakrawler (go): HML spider, con LinkFider para archivos JS y Archive.org como fuente externa.
- dirhunt (python): HTML spider, también indica “juicy files”.
- evine (go): CLI interactivo HTML spider. También busca en Archive.org
- meg (go): Esta herramienta no es un spider pero puede ser útil. Puedes indicar un archivo con hosts y un archivo con paths y meg hará fetch de cada path en cada host y guardará la respuesta.
- urlgrab (go): HTML spider con capacidades de renderizado JS. Sin embargo, parece estar sin mantenimiento, la versión precompilada es antigua y el código actual no compila
- gau (go): HTML spider que usa proveedores externos (wayback, otx, commoncrawl)
- ParamSpider: Este script encontrará URLs con parámetros y las listará.
- galer (go): HTML spider con capacidades de renderizado JS.
- LinkFinder (python): HTML spider, con capacidades de JS beautify capaz de buscar nuevas rutas en archivos JS. También puede valer la pena mirar JSScanner, que es un wrapper de LinkFinder.
- goLinkFinder (go): Para extraer endpoints tanto del source HTML como de archivos javascript embebidos. Útil para bug hunters, red teamers, infosec ninjas.
- JSParser (python2.7): Un script python 2.7 que usa Tornado y JSBeautifier para parsear URLs relativas desde archivos JavaScript. Útil para descubrir fácilmente peticiones AJAX. Parece estar sin mantenimiento.
- relative-url-extractor (ruby): Dado un archivo (HTML) extraerá URLs usando una expresión regular ingeniosa para encontrar y extraer URLs relativas de archivos “feos” (minificados).
- JSFScan (bash, varias herramientas): Recolecta información interesante de archivos JS usando varias herramientas.
- subjs (go): Encuentra archivos JS.
- page-fetch (go): Carga una página en un headless browser e imprime todas las urls que se cargaron para renderizar la página.
- Feroxbuster (rust): Herramienta de discovery de contenido que mezcla varias opciones de las herramientas anteriores
- Javascript Parsing: Una extensión de Burp para encontrar paths y params en archivos JS.
- Sourcemapper: Una herramienta que, dado el .js.map URL, te obtiene el código JS beautified
- xnLinkFinder: Herramienta usada para descubrir endpoints para un target dado.
- waymore: Descubre links desde la wayback machine (también descargando las respuestas en la wayback y buscando más links)
- HTTPLoot (go): Crawl (incluso rellenando forms) y también encuentra info sensible usando regexes específicas.
- SpiderSuite: Spider Suite es un avanzado crawler/spider GUI multifunción diseñado para profesionales de ciberseguridad.
- jsluice (go): Es un paquete Go y una herramienta de línea de comandos para extraer URLs, paths, secrets y otros datos interesantes del código fuente JavaScript.
- ParaForge: ParaForge es una simple Burp Suite extension para extraer los parámetros y endpoints de las requests para crear wordlists personalizadas para fuzzing y enumeración.
- katana (go): Excelente herramienta para esto.
- Crawley (go): Imprime cada link que es capaz de encontrar.
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:
- 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 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: Find broken links inside HTMLs that may be prone to takeovers
- File Backups: Once you have found all the files, look for backups of all the executable files (“.php”, “.aspx”…). Common variations for naming a backup are: file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old. You can also use the tool bfac or backup-gen.
- Discover new parameters: You can use tools like Arjun, parameth, x8 and Param Miner to discover hidden parameters. If you can, you could try to search hidden parameters on each executable web file.
- 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: Revisa los comentarios de todos los archivos; puedes encontrar credenciales o funcionalidad oculta.
- If you are playing CTF, a “common” trick is to hide information inside comments at the right of the page (using hundreds of spaces so you don’t see the data if you open the source code with the browser). Other possibility is to use several new lines and hide information in a comment at the bottom of the web page.
- API keys: If you find any API key there is guide that indicates how to use API keys of different platforms: keyhacks, zile, truffleHog, SecretFinder, RegHex, DumpsterDive, EarlyBird
- Google API keys: If you find any API key looking like AIzaSyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik you can use the project gmapapiscanner to check which apis the key can access.
- S3 Buckets: While spidering look if any subdomain or any link is related with some S3 bucket. In that case, check the permissions of the bucket.
Special findings
While performing the spidering and brute-forcing you could find interesting things that you have to notice.
Interesting files
- Look for links to other files inside the CSS files.
- If you find a .git file some information can be extracted
- If you find a .env information such as api keys, dbs passwords and other information can be found.
- If you find API endpoints you should also test them. These aren’t files, but will probably “look like” them.
- JS files: In the spidering section several tools that can extract path from JS files were mentioned. Also, It would be interesting to monitor each JS file found, as in some ocations, a change may indicate that a potential vulnerability was introduced in the code. You could use for example JSMon.
- You should also check discovered JS files with RetireJS or JSHole to find if it’s vulnerable.
- 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. - On several occasions, you will need to understand the regular expressions used. This will be useful: https://regex101.com/ or https://pythonium.net/regex
- You could also monitor the files were forms were detected, as a change in the parameter or the apearance f a new form may indicate a potential new vulnerable functionality.
403 Forbidden/Basic Authentication/401 Unauthorized (bypass)
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:
- 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
You can use tools such as https://github.com/dgtlmoon/changedetection.io to monitor pages for modifications that might insert vulnerabilities.
HackTricks Automatic Commands
HackTricks Automatic Commands
```yaml 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 outEntry_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}
</details>
> [!TIP]
> Aprende y practica Hacking en AWS:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Aprende y practica Hacking en GCP: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Aprende y practica Hacking en Azure: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Apoya a HackTricks</summary>
>
> - Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
> - **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos en** **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
>
> </details>


