material • 21/05/2026

Enumeração, Reconhecimento e Fuzzing

Uma aula introdutória sobre enumeração, reconhecimento e fuzzing web usando Nmap, FFUF e Gobuster

por rideckszz

C:\>aula_ □ ×

Enumeração, Reconhecimento e Fuzzing

Uma aula introdutória sobre como mapear um alvo, identificar serviços e encontrar recursos web escondidos usando Nmap, FFUF e Gobuster.

A ordem importa: primeiro entendemos o alvo, depois fazemos fuzzing de caminhos, arquivos, parâmetros e hosts.

1. Enumeração e reconhecimento
C:\>conceito_ □ ×

Entender antes de atacar

As primeiras etapas de um teste de penetração são enumeração e reconhecimento.

A ideia é entender a superfície de ataque: IPs, portas, serviços, versões, aplicações, rotas e possíveis pontos de entrada.

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.

2. Enumeração passiva e ativa

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.

C:\>ativa_ □ ×

O que buscamos?

  • portas abertas;
  • serviços em execução;
  • versões de software;
  • tecnologias web;
  • diretórios e arquivos escondidos;
  • parâmetros e endpoints interessantes.
3. Técnicas de enumeração ativa

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.

4. Ferramentas de enumeração

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.

5. Nmap
C:\>nmap_ □ ×

Primeiro mapa do alvo

O Nmap é uma das ferramentas mais usadas para descobrir portas, serviços e versões.

Em CTF, ele geralmente é o primeiro comando mais importante.

# 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.

6. Comandos úteis do Nmap
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.

7. Depois do Nmap
C:\>web_ □ ×

Se tem HTTP, olhe a aplicação

Quando uma porta web aparece, o próximo passo é abrir no navegador e observar o comportamento.

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.

8. Fuzzing web
C:\>fuzzing_ □ ×

Testar caminhos automaticamente

Web fuzzing é uma técnica usada para identificar recursos escondidos por meio de testes automatizados.

A ferramenta envia várias entradas e analisa as respostas para descobrir páginas, diretórios, arquivos, parâmetros ou hosts.

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
9. Fuzzing vs brute-force

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.

10. Conceitos essenciais

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.

11. Wordlists
C:\>wordlists_ □ ×

A lista muda o resultado

O fuzzing depende bastante da wordlist.

Uma lista pequena encontra o óbvio. Uma lista grande demora mais, mas pode achar caminhos menos comuns.

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.

12. FFUF
C:\>ffuf_ □ ×

Fuzzing rápido no terminal

O FFUF usa a palavra FUZZ para marcar onde a wordlist será aplicada.

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.

13. FFUF com alias de keyword

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.

14. Extension fuzzing
C:\>extensão_ □ ×

Descobrir tecnologias e arquivos

Nem todo arquivo aparece sem extensão.

Podemos usar fuzzing para descobrir extensões como .php, .txt, .bak ou .html.

# 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.

15. Fuzzing recursivo

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.

16. Filtrando resultados no FFUF
C:\>filtros_ □ ×

Nem todo 200 é interessante

Muitos servidores retornam páginas parecidas para tudo.

Nesses casos, precisamos filtrar por status, tamanho, palavras ou linhas.

# 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.

17. Gobuster
C:\>gobuster_ □ ×

Dirbusting direto ao ponto

O Gobuster também é muito usado para descobrir diretórios e arquivos.

A sintaxe é simples e funciona bem para enumeração web inicial.

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.

18. FFUF ou Gobuster?

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.

19. Domain fuzzing

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.

20. Subdomain fuzzing

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.

21. VHost fuzzing
C:\>vhost_ □ ×

Mesmo IP, sites diferentes

Virtual hosts permitem que o mesmo IP sirva sites diferentes dependendo do cabeçalho Host.

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.

22. Parameter fuzzing
C:\>parâmetros_ □ ×

Procurar entradas escondidas

Além de diretórios e arquivos, também podemos procurar parâmetros aceitos pela aplicação.

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"
23. POST fuzzing

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.

24. Custom wordlist
C:\>wordlist_ □ ×

Quando a lista pronta não basta

Nem sempre uma wordlist pronta faz sentido para o parâmetro.

Para IDs numéricos, por exemplo, podemos criar uma lista própria.

# 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.

25. Checklist de enumeração web
C:\>checklist_ □ ×

Antes de procurar exploit

  • rodei Nmap em todas as portas?
  • anotei serviços e versões?
  • abri a aplicação web no navegador?
  • verifiquei código fonte, robots.txt e sitemap.xml?
  • rodei fuzzing de diretórios?
  • testei extensões comuns?
  • analisei status code, tamanho e redirects?
  • verifiquei parâmetros ou endpoints suspeitos?
  • salvei os achados importantes?
26. Dica para CTFs
C:\>anotação_ □ ×

O simples também funciona

Antes de complicar, rode uma enumeração web simples e leia a saída com calma.

Em muitos labs, o primeiro caminho interessante aparece com uma wordlist comum.

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.

27. Cheat sheet final
C:\>cheat sheet_ □ ×

Comandos úteis

Referência rápida para usar durante a prática.

# =========================================================
# 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
29. Conclusão
C:\>fechamento_ □ ×

Enumeração guia o resto

Nmap mostra a superfície inicial. FFUF e Gobuster ajudam a encontrar o que a página inicial não mostra.

O objetivo é transformar portas, caminhos e respostas HTTP em hipóteses testáveis.

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.