Enumeração, Reconhecimento e Fuzzing
Uma aula introdutória sobre enumeração, reconhecimento e fuzzing web usando Nmap, FFUF e Gobuster
A enumeração coleta informações sobre sistemas, serviços e usuários do alvo. O reconhecimento examina a infraestrutura de rede, aplicações e configurações para encontrar possíveis caminhos de exploração.
Em CTF, essa etapa costuma decidir o resto do desafio. Se a enumeração for fraca, a exploração vira tentativa aleatória.
Coleta
Reunir informações sobre IPs, portas, serviços, usuários, tecnologias e caminhos.
Descoberta
Identificar recursos expostos: páginas, diretórios, APIs, painéis e serviços.
Análise
Usar versões e tecnologias para pesquisar vulnerabilidades conhecidas.
Mapa
Transformar achados soltos em uma visão do alvo.
Resumo: enumeração não é só rodar ferramenta. É transformar saída de comandos em hipótese.
Enumeração passiva
Busca por informações públicas sem interagir diretamente com o alvo. Exemplos: registros de domínio, sites públicos, redes sociais, Shodan, Censys e GHDB.
Enumeração ativa
Interação direta com o alvo para descobrir serviços, versões, portas, diretórios e comportamentos.
A enumeração ativa costuma revelar informações mais úteis para um CTF, mas também gera tráfego visível. Em ambientes reais, isso pode ser detectado por logs, alertas e sistemas de defesa.
Escaneio de portas
Procura portas abertas no alvo e revela serviços em execução.
Verificação de serviços
Identifica versões e banners que ajudam na pesquisa de vulnerabilidades.
Enumeração web
Procura diretórios, arquivos, endpoints e tecnologias expostas.
Recursos compartilhados
Busca compartilhamentos, pastas, impressoras ou serviços internos.
O objetivo não é usar todos os comandos possíveis. O objetivo é descobrir o suficiente para decidir o próximo passo.
Nmap
Escaneia redes, identifica portas abertas, serviços, versões e scripts úteis.
Burp Suite
Intercepta e analisa tráfego HTTP. Ajuda a entender requisições e parâmetros.
FFUF
Faz fuzzing rápido de diretórios, arquivos, parâmetros, extensões e vhosts.
Gobuster
Ferramenta simples e direta para descoberta de diretórios, arquivos, DNS e vhosts.
Metasploit
Framework com módulos de enumeração, validação e exploração.
Enum4linux
Ajuda a enumerar informações de SMB em ambientes Linux/Windows.
# Scan básico nmap IP # Scan de portas comuns com scripts padrão e versão nmap -sC -sV IP # Scan de todas as portas TCP nmap -p- IP # Scan mais completo depois de descobrir portas nmap -sC -sV -p PORTAS IP
Um fluxo comum é primeiro descobrir todas as portas abertas e depois rodar scripts e detecção de versão apenas nas portas encontradas.
# Exemplo de fluxo nmap -p- --min-rate 5000 IP # Depois, com as portas encontradas: nmap -sC -sV -p 22,80,443 IP
Em CTF, anote serviço e versão. A busca por exploit depende disso.
nmap ALVO nmap -p- ALVO nmap -p 22,80,443 ALVO nmap -sV ALVO nmap -O ALVO nmap -A ALVO nmap --script=http-vuln* -p 80,443 ALVO nmap --script=smb-enum-shares,smb-enum-users -p 445 ALVO nmap --script=vuln ALVO nmap -sn REDE/CIDR nmap -sS ALVO nmap -sU ALVO nmap -f ALVO nmap -sA ALVO
-sC
Executa scripts padrão do Nmap.
-sV
Tenta identificar versão dos serviços.
-p-
Escaneia todas as portas TCP.
-O
Tenta identificar o sistema operacional.
Página inicial
O que aparece? Existe CMS, login, painel, versão ou rodapé?
Código fonte
Existem comentários, caminhos, scripts ou referências úteis?
Robots
Verifique arquivos como /robots.txt e /sitemap.xml.
Requisições
Use Burp ou DevTools para observar parâmetros e endpoints.
http://IP/ http://IP/robots.txt http://IP/sitemap.xml http://IP/simple
Se a aplicação web parecer vazia, o próximo passo costuma ser fuzzing de diretórios.
Servidores web normalmente não entregam uma lista completa de todos os diretórios, arquivos e endpoints disponíveis. Por isso usamos wordlists com nomes comuns para testar possibilidades.
A ideia é simples: trocar uma parte da URL por várias palavras e observar quais retornam algo diferente.
http://IP/admin http://IP/login http://IP/backup http://IP/uploads http://IP/config
Fuzzing
Testa entradas variadas para observar como a aplicação responde. Pode envolver caminhos, parâmetros, cabeçalhos, extensões e payloads.
Brute-force
Testa sistematicamente possibilidades para descobrir um valor específico, como senha, ID ou token.
Na prática, os termos às vezes aparecem misturados. Em diretórios web, por exemplo, estamos testando uma lista de nomes possíveis. Isso se parece com brute-force, mas dentro do fluxo de segurança web chamamos normalmente de fuzzing ou dirbusting.
Pense assim: fuzzing observa comportamento; brute-force tenta encontrar um valor correto.
Wordlist
Lista de palavras, nomes de diretórios, arquivos, parâmetros ou valores usados como entrada.
Payload
Valor enviado para a aplicação durante o teste.
Response analysis
Leitura de status code, tamanho, palavras, linhas e tempo de resposta.
Fuzzer
Ferramenta que automatiza o envio de payloads e organiza as respostas.
No Kali, algumas wordlists costumam estar disponíveis em:
/usr/share/wordlists/ /usr/share/seclists/
Alguns caminhos comuns:
/usr/share/wordlists/dirb/common.txt /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt /usr/share/seclists/Discovery/Web-Content/web-extensions.txt /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt
Comece com uma wordlist comum e pequena. Se nada aparecer, aumente a lista ou mude a estratégia.
Para procurar diretórios, colocamos FUZZ na parte da URL onde o nome do diretório entraria.
ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt
Esse comando testa cada palavra da lista no lugar de FUZZ.
http://IP/admin http://IP/login http://IP/backup http://IP/config
Esse comando simples resolve muita coisa em laboratório. Anote ele.
Também dá para associar uma wordlist a uma palavra-chave específica usando :FUZZ.
ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://IP/FUZZ
Isso ajuda quando usamos mais de uma wordlist ou quando queremos deixar explícito qual parte da requisição está sendo substituída.
# Descobrir extensão de um arquivo conhecido ffuf -w /usr/share/seclists/Discovery/Web-Content/web-extensions.txt:FUZZ -u http://IP/blog/indexFUZZ # Procurar páginas PHP dentro de um diretório ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://IP/blog/FUZZ.php
.php
Muito comum em aplicações antigas e CMS.
.txt
Pode revelar notas, robots, configs ou backups simples.
.bak
Pode indicar cópia de arquivo sensível.
.html
Páginas estáticas ou exportadas.
A varredura recursiva faz com que a ferramenta continue procurando dentro dos diretórios encontrados.
Isso pode ser útil, mas também pode demorar muito. Por isso, limite a profundidade.
ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://IP/FUZZ -recursion -recursion-depth 1 -e .php -v
-recursion
Continua o fuzzing dentro de diretórios encontrados.
-recursion-depth
Define até qual profundidade a ferramenta deve ir.
-e
Testa extensões adicionais.
-v
Mostra URLs completas.
Recursão sem limite pode gerar muito ruído e demorar bastante.
# Mostrar apenas status específicos ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200,301,302,403 # Filtrar por tamanho ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt -fs TAMANHO # Filtrar por quantidade de palavras ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt -fw PALAVRAS # Filtrar por quantidade de linhas ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt -fl LINHAS
Se tudo aparece como válido, compare tamanho, palavras e linhas. O falso positivo geralmente tem padrão repetido.
gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt
No Gobuster, o modo dir procura diretórios e arquivos a partir de uma URL base.
# Procurar com extensões gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt -x php,txt,bak,html # Definir status codes interessantes gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt -s 200,204,301,302,307,401,403 # Ignorar certificado TLS inválido gobuster dir -k -u https://IP/ -w /usr/share/wordlists/dirb/common.txt
Se FFUF e Gobuster derem resultados diferentes, compare filtros, redirects, status code e tamanho da resposta.
FFUF
Mais flexível para fuzzing de parâmetros, headers, vhosts, POST e filtros.
Gobuster
Simples, direto e fácil de usar para diretórios, arquivos, DNS e vhosts.
Para diretórios simples, os dois resolvem. Para fuzzing mais customizado, FFUF costuma ser mais confortável.
# Mesmo objetivo, duas ferramentas ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt
Guarde os dois comandos. Em laboratório, o caminho escondido às vezes aparece mais rápido quando você troca a ferramenta ou a wordlist.
Em CTFs, muitas máquinas só são acessíveis pela VPN e não existem no DNS público.
Quando usamos um domínio, o navegador tenta resolver o nome usando /etc/hosts e DNS. Se o nome não existir em nenhum lugar, ele não sabe para qual IP conectar.
# Adicionar domínio localmente sudo sh -c 'echo "IP dominio.site" >> /etc/hosts'
/etc/hosts
Arquivo local usado para mapear nome para IP.
DNS público
Resolve domínios públicos, mas não conhece nomes internos de CTF.
VPN
Permite alcançar IPs privados do lab.
Um subdomínio é qualquer nome subordinado a outro domínio.
Exemplo:
photos.google.com photos = subdomínio google.com = domínio principal
Podemos testar subdomínios com uma wordlist:
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u https://FUZZ.DOMINIO/
Se nada aparecer, isso não prova que não existem subdomínios. Pode significar apenas que eles não são públicos ou que a wordlist não contém o nome certo.
Em muitos casos, subdomínios internos não aparecem no DNS público. Para procurar vhosts em um IP conhecido, fazemos fuzzing no cabeçalho Host.
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u http://IP/ -H "Host: FUZZ.DOMINIO"
Com Gobuster:
gobuster vhost -u http://DOMINIO/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain
VHost fuzzing é útil quando a porta web responde, mas a página principal parece vazia ou genérica.
Em requisições GET, os parâmetros aparecem na URL depois de ?.
https://site.com/view.php?parametro=valor
Para testar nomes de parâmetros, colocamos FUZZ no lugar do nome.
ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u "http://IP/view.php?FUZZ=teste"
Requisições POST não passam os dados pela URL. Os valores vão no corpo da requisição.
No FFUF, usamos -X POST para definir o método e -d para enviar os dados.
ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u http://IP/view.php -X POST -d "FUZZ=teste" -H "Content-Type: application/x-www-form-urlencoded"
Em aplicações PHP, formulários comuns geralmente usam application/x-www-form-urlencoded.
# Criar lista de IDs de 1 até 1000 seq 1 1000 > ids.txt # Usar como valor de parâmetro ffuf -w ids.txt:FUZZ -u "http://IP/view.php?id=FUZZ"
Para POST:
ffuf -w ids.txt:FUZZ -u http://IP/view.php -X POST -d "id=FUZZ" -H "Content-Type: application/x-www-form-urlencoded"
Path
Onde o recurso está sendo acessado.
Query string
Parâmetros enviados na URL.
Headers
Host, Cookie, User-Agent, Content-Type e outros.
Body
Dados enviados em requisições POST.
Se o fuzzing não encontra nada, talvez a requisição precise de cookie, header ou método específico.
ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt
A diferença entre travar e avançar pode ser só trocar a ferramenta, ajustar o path ou prestar atenção em um 301/403.
# ========================================================= # NMAP # ========================================================= # Scan básico nmap IP # Scripts padrão + detecção de versão nmap -sC -sV IP # Todas as portas TCP nmap -p- IP # Descobrir portas mais rápido nmap -p- --min-rate 5000 IP # Scan detalhado nas portas encontradas nmap -sC -sV -p 22,80,443 IP # UDP nmap -sU IP # Scripts de vulnerabilidade nmap --script=vuln IP # Scripts HTTP nmap --script=http-vuln* -p 80,443 IP # Descobrir hosts em uma rede nmap -sn REDE/CIDR # ========================================================= # FFUF # ========================================================= # Fuzzing básico de diretórios ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt # Fuzzing com wordlist do SecLists ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://IP/FUZZ # Buscar extensões ffuf -w /usr/share/seclists/Discovery/Web-Content/web-extensions.txt:FUZZ -u http://IP/indexFUZZ # Buscar arquivos PHP ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://IP/FUZZ.php # Recursivo com profundidade 1 ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://IP/FUZZ -recursion -recursion-depth 1 -e .php -v # Filtrar status codes ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200,301,302,403 # Filtrar por tamanho ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt -fs TAMANHO # Fuzzing de parâmetro GET ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u "http://IP/view.php?FUZZ=teste" # Fuzzing de parâmetro POST ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u http://IP/view.php -X POST -d "FUZZ=teste" -H "Content-Type: application/x-www-form-urlencoded" # VHost fuzzing ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u http://IP/ -H "Host: FUZZ.DOMINIO" # ========================================================= # GOBUSTER # ========================================================= # Fuzzing básico de diretórios gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt # Diretórios com extensões gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt -x php,txt,bak,html # Status codes específicos gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt -s 200,204,301,302,307,401,403 # Ignorar certificado TLS inválido gobuster dir -k -u https://IP/ -w /usr/share/wordlists/dirb/common.txt # DNS/subdomínios gobuster dns -d DOMINIO -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt # VHost gobuster vhost -u http://DOMINIO/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain
Enumerar
Descobrir portas, serviços, versões e tecnologias.
Observar
Abrir a aplicação, ler respostas e entender comportamento.
Fuzzar
Procurar diretórios, arquivos, extensões, parâmetros e vhosts.
Anotar
Guardar achados, status codes, caminhos e comandos usados.