80,443 - Metodologia Web de Pentesting
Reading time: 20 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
O serviço web é o serviço mais comum e abrangente e existem muitos tipos diferentes de vulnerabilidades.
Porta padrão: 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
Orientações para Web API
Resumo da metodologia
Nesta metodologia vamos supor que você irá atacar um domínio (ou subdomínio) e somente esse. Portanto, você deve aplicar esta metodologia a cada domínio, subdomínio ou IP descoberto com servidor web indeterminado dentro do escopo.
- Comece por identificar as tecnologias usadas pelo servidor web. Procure por truques para ter em mente durante o resto do teste se você conseguir identificar a tecnologia com sucesso.
- Alguma vulnerabilidade conhecida na versão da tecnologia?
- Usando alguma well known tech? Algum truque útil para extrair mais informação?
- Algum specialised scanner para rodar (like wpscan)?
- Execute general purposes scanners. Você nunca sabe se eles vão encontrar algo ou alguma informação interessante.
- Comece com as verificações iniciais: robots, sitemap, erro 404 e SSL/TLS scan (se HTTPS).
- Comece a spidering a página web: é hora de encontrar todos os possíveis arquivos, pastas e parâmetros em uso. Além disso, verifique por descobertas especiais.
- Note that anytime a new directory is discovered during brute-forcing or spidering, it should be spidered.
- Directory Brute-Forcing: Tente brute forcear todas as pastas descobertas procurando por novos arquivos e diretórios.
- Note that anytime a new directory is discovered during brute-forcing or spidering, it should be Brute-Forced.
- Backups checking: Teste se você consegue encontrar backups de arquivos descobertos adicionando extensões de backup comuns.
- Brute-Force parameters: Tente encontrar parâmetros ocultos.
- Uma vez que você tenha identificado todos os possíveis endpoints que aceitam user input, verifique todos os tipos de vulnerabilidades relacionados a eles.
- Siga este checklist
Versão do servidor (Vulnerável?)
Identificar
Verifique se há vulnerabilidades conhecidas para a versão do servidor que está em execução.
Os HTTP headers and cookies of the response podem ser muito úteis para identificar as technologies e/ou version em uso. Nmap scan pode identificar a versão do servidor, mas também podem ser úteis as ferramentas 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
Search for vulnerabilities of the web application version
Verificar se existe algum WAF
- https://github.com/EnableSecurity/wafw00f
- https://github.com/Ekultek/WhatWaf.git
- https://nmap.org/nsedoc/scripts/http-waf-detect.html
Truques de tecnologia web
Alguns truques para encontrar vulnerabilidades em diferentes tecnologias bem conhecidas em uso:
- 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)
- Sitecore
Tenha em conta que o mesmo domínio pode estar a usar diferentes tecnologias em diferentes ports, pastas e subdomínios.
Se a web application estiver a usar alguma tech/platform bem conhecida listada acima ou qualquer outra, não se esqueça de procurar na Internet por novos truques (e avise-me!).
Revisão de Código Fonte
Se o source code da aplicação estiver disponível no github, para além de realizar por sua própria um White box test da aplicação, há algumas informações que podem ser úteis para o atual Black-Box testing:
- Existe algum arquivo Change-log, Readme ou Version, ou qualquer coisa com informação de versão acessível via web?
- Como e onde são guardadas as credentials? Existe algum (acessível?) file com credentials (nomes de usuário ou senhas)?
- As senhas estão em plain text, encrypted ou que algoritmo de hashing é usado?
- Está a usar alguma master key para encriptar algo? Que algoritmo é usado?
- É possível aceder a algum destes ficheiros explorando alguma vulnerabilidade?
- Há alguma informação interessante no github (issues resolvidas e não resolvidas)? Ou no histórico de commits (talvez alguma password introduzida num commit antigo)?
Source code Review / SAST Tools
Automatic scanners
Scanners automáticos de propósito geral
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 scanners
Se um CMS for usado, não se esqueça de run a scanner, talvez algo interessante seja encontrado:
Clusterd: JBoss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfish
CMSScan: WordPress, Drupal, Joomla, vBulletin sites para problemas de segurança. (GUI)\
VulnX: Joomla, Wordpress, Drupal, PrestaShop, Opencart
CMSMap: (W)ordpress, (J)oomla, (D)rupal ou (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
Neste ponto você já deve ter algumas informações sobre o servidor web usado pelo cliente (se houver dados fornecidos) e alguns truques para ter em mente durante o teste. Se tiver sorte, talvez já tenha encontrado um CMS e executado algum scanner.
Descoberta de Aplicações Web passo a passo
A partir deste ponto vamos começar a interagir com a aplicação web.
Verificações iniciais
Páginas padrão com informações interessantes:
- /robots.txt
- /sitemap.xml
- /crossdomain.xml
- /clientaccesspolicy.xml
- /.well-known/
- Verifique também comentários nas páginas principais e secundárias.
Forçando erros
Servidores web podem comportar-se de forma inesperada quando dados estranhos são enviados a eles. Isso pode abrir vulnerabilidades ou revelar informação sensível.
- Acesse páginas falsas como /whatever_fake.php (.aspx,.html,.etc)
- Adicione "[]", "]]", and "[[" em valores de cookie e valores de parâmetro para criar erros
- Gere um erro fornecendo input como
/~randomthing/%s
no final da URL - Tente diferentes HTTP Verbs como PATCH, DEBUG ou incorretos como FAKE
Verifique se você pode enviar arquivos (PUT verb, WebDav)
Se você descobrir que o WebDav está habilitado mas não tem permissões suficientes para enviar arquivos na pasta root tente:
- Brute Force credenciais
- Faça upload de arquivos via WebDav para o restante das pastas encontradas dentro da página web. Você pode ter permissões para enviar arquivos em outras pastas.
Vulnerabilidades SSL/TLS
- Se a aplicação não estiver forçando o uso de HTTPS em nenhuma parte, então está vulnerável a MitM
- Se a aplicação estiver enviando dados sensíveis (senhas) usando HTTP, então é uma vulnerabilidade alta.
Use testssl.sh para verificar vulnerabilidades (Em programas de Bug Bounty provavelmente esse tipo de vulnerabilidade não será aceito) e use a2sv para rechecagem das 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>
Informações sobre vulnerabilidades SSL/TLS:
- https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/
- https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/
Spidering
Lance algum tipo de spider dentro da web. O objetivo do spider é encontrar o máximo de paths possível da aplicação testada. Portanto, web crawling e fontes externas devem ser usadas para localizar o maior número possível de paths válidos.
- gospider (go): HTML spider, LinkFinder em arquivos JS e fontes externas (Archive.org, CommonCrawl.org, VirusTotal.com).
- hakrawler (go): HML spider, com LinkFider para arquivos JS e Archive.org como fonte externa.
- dirhunt (python): HTML spider, também indica "juicy files".
- evine (go): Interactive CLI HTML spider. Também pesquisa no Archive.org
- meg (go): Esta ferramenta não é um spider, mas pode ser útil. Você pode indicar um arquivo com hosts e um arquivo com paths e o meg irá buscar cada path em cada host e salvar a resposta.
- urlgrab (go): HTML spider com capacidades de rendering de JS. No entanto, parece estar sem manutenção, a versão pré-compilada é antiga e o código atual não compila.
- gau (go): HTML spider que usa provedores externos (wayback, otx, commoncrawl)
- ParamSpider: Este script vai encontrar URLs com parâmetro e listá-las.
- galer (go): HTML spider com capacidades de rendering de JS.
- LinkFinder (python): HTML spider, com capacidades de JS beautify capaz de buscar novos paths em arquivos JS. Pode valer a pena também dar uma olhada em JSScanner, que é um wrapper do LinkFinder.
- goLinkFinder (go): Para extrair endpoints tanto do source HTML quanto de arquivos javascript embutidos. Útil para bug hunters, red teamers, infosec ninjas.
- JSParser (python2.7): Um script python 2.7 usando Tornado e JSBeautifier para parsear URLs relativas de arquivos JavaScript. Útil para descobrir facilmente requisições AJAX. Parece desatualizado.
- relative-url-extractor (ruby): Dado um arquivo (HTML) ele extrai URLs usando expressões regulares interessantes para encontrar e extrair URLs relativas de arquivos feios (minificados).
- JSFScan (bash, várias ferramentas): Coleta informação interessante de arquivos JS usando várias ferramentas.
- subjs (go): Encontra arquivos JS.
- page-fetch (go): Carrega uma página em um headless browser e imprime todas as urls carregadas para renderizar a página.
- Feroxbuster (rust): Ferramenta de content discovery que mistura várias opções das ferramentas anteriores
- Javascript Parsing: Uma extensão do Burp para encontrar paths e params em arquivos JS.
- Sourcemapper: Uma ferramenta que, dado o .js.map URL, obtém o código JS beautified
- xnLinkFinder: Ferramenta usada para descobrir endpoints para um dado target.
- waymore: Descobre links do wayback machine (também baixando as respostas no wayback e procurando mais links)
- HTTPLoot (go): Faz crawl (inclusive preenchendo forms) e também encontra info sensível usando regexes específicas.
- SpiderSuite: Spider Suite é um crawler/spider de segurança web multi-funcional com GUI, projetado para profissionais de cyber security.
- jsluice (go): É um pacote Go e command-line tool para extrair URLs, paths, secrets e outros dados interessantes do código fonte JavaScript.
- ParaForge: ParaForge é uma simples Burp Suite extension para extrair os parâmetros e endpoints da request para criar wordlists customizadas para fuzzing e enumeração.
- katana (go): Excelente ferramenta para isso.
- Crawley (go): Imprime todo link que consegue encontrar.
Brute Force directories and files
Comece o brute-forcing a partir da pasta root e tenha certeza de brute-forçar todos os diretórios encontrados usando este método e todos os diretórios descobertos pelo Spidering (você pode fazer esse brute-forcing recursivamente e acrescentando no início da wordlist usada os nomes dos diretórios encontrados).
Ferramentas:
- Dirb / Dirbuster - Incluído no Kali, old (e slow) mas funcional. Permite certificados autoassinados e busca recursiva. Muito lento comparado com as outras opções.
- Dirsearch (python): Não permite certificados autoassinados mas permite busca recursiva.
- Gobuster (go): Permite certificados autoassinados, não possui busca recursiva.
- 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): Isto não é um spider, mas uma ferramenta que, dada a lista de URLs encontradas, vai eliminar URLs "duplicadas".
- Scavenger: Burp Extension para criar uma lista de diretórios a partir do histórico do burp de diferentes páginas
- TrashCompactor: Remove URLs com funcionalidades duplicadas (baseado em imports js)
- Chamaleon: Usa wapalyzer para detectar tecnologias usadas e selecionar as wordlists a serem utilizadas.
Dicionários recomendados:
- 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: Encontra links quebrados dentro de HTMLs que podem ser propensos a takeover
- File Backups: Depois de encontrar todos os arquivos, procure por backups de todos os arquivos executáveis (".php", ".aspx"...). Variações comuns de nome para backups: file.ext~, #file.ext#, ~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp e file.old. Você também pode usar a ferramenta bfac ou backup-gen.
- Discover new parameters: Você pode usar ferramentas como Arjun, parameth, x8 e Param Miner para descobrir parâmetros ocultos. Se possível, tente buscar parâmetros ocultos em cada arquivo web executável.
- 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: Verifique os comentários de todos os arquivos, você pode encontrar credentials ou funcionalidade oculta.
- Se você estiver fazendo CTF, um truque "comum" é esconder informação dentro de comentários à direita da página (usando centenas de espaços para que você não veja os dados se abrir o source no navegador). Outra possibilidade é usar várias linhas novas e esconder informação em um comentário no final da página web.
- API keys: Se você encontrar alguma API key há projetos que indicam como utilizar API keys de diferentes plataformas: keyhacks, zile, truffleHog, SecretFinder, RegHex, DumpsterDive, EarlyBird
- Google API keys: Se encontrar qualquer API key que comece com AIzaSyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik você pode usar o projeto gmapapiscanner para verificar quais apis a key consegue acessar.
- S3 Buckets: Enquanto faz spidering verifique se algum subdomain ou link está relacionado a algum S3 bucket. Nesse caso, check the permissions of the bucket.
Special findings
Durante a execução do spidering e do brute-forcing você pode encontrar coisas interessantes que deve notar.
Arquivos interessantes
- Procure por links para outros arquivos dentro dos arquivos CSS.
- Se você encontrar um .git alguns dados podem ser extraídos
- Se encontrar um .env informações como api keys, senhas de dbs e outras informações podem ser encontradas.
- Se encontrar API endpoints você deve também testá-los. Estes não são arquivos, mas provavelmente "parecerão" com eles.
- JS files: Na seção de spidering foram mencionadas várias ferramentas que extraem paths de arquivos JS. Além disso, seria interessante monitorar cada arquivo JS encontrado, pois em algumas ocasiões, uma alteração pode indicar que uma potencial vulnerabilidade foi introduzida no código. Você pode usar, por exemplo, JSMon.
- Você também deve checar os arquivos JS descobertos com RetireJS ou JSHole para ver se estão vulneráveis.
- 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 com caracteres:"[]!+" https://enkhee-osiris.github.io/Decoder-JSFuck/)
- TrainFuck](https://github.com/taco-c/trainfuck):
+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.
- Em várias ocasiões, você precisará entender as expressões regulares usadas. Isso será útil: https://regex101.com/ ou https://pythonium.net/regex
- Você também pode monitorar os arquivos onde forms foram detectados, pois uma mudança nos parâmetros ou o aparecimento de um novo form pode indicar uma nova funcionalidade potencialmente vulnerável.
403 Forbidden/Basic Authentication/401 Unauthorized (bypass)
502 Proxy Error
Se alguma página responder com esse código, provavelmente é um proxy mal configurado. Se você enviar uma requisição HTTP como: GET https://google.com HTTP/1.1
(com o header host e outros headers comuns), o proxy tentará acessar google.com e você terá encontrado um SSRF.
NTLM Authentication - Info disclosure
Se o servidor que está pedindo autenticação for Windows ou você encontrar um login pedindo suas credentials (e pedindo o domain), você pode provocar uma divulgação de informação.
Envie o header: “Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”
e devido a como a NTLM authentication funciona, o servidor irá responder com informações internas (versão do IIS, versão do Windows...) dentro do header "WWW-Authenticate".
Você pode automatizar isso usando o nmap plugin "http-ntlm-info.nse".
HTTP Redirect (CTF)
É possível colocar conteúdo dentro de uma Redirection. Esse conteúdo não será mostrado ao usuário (já que o browser irá executar a redireção) mas algo pode estar escondido ali.
Web Vulnerabilities Checking
Agora que uma enumeração abrangente da aplicação web foi realizada, é hora de checar várias vulnerabilidades possíveis. Você pode encontrar o checklist aqui:
Web Vulnerabilities Methodology
Encontre mais info sobre web vulns em:
- 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
Você pode usar ferramentas como https://github.com/dgtlmoon/changedetection.io para monitorar páginas por modificações que possam inserir vulnerabilidades.
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
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.