
ffuf v2.2.1
Fuzzer web rápido escrito em Go

ffuf - Fuzz mais rápido, seu tolo
Um fuzzer web rápido escrito em Go.
Instalação
-
Baixe um binário pré-compilado na página de releases, descompacte e execute!
ou
-
Se você estiver no Windows com o Scoop, o ffuf pode ser instalado com:
scoop install ffufou
-
Se você estiver no Windows com o Winget, o ffuf pode ser instalado com:
winget install ffuf.ffufou
-
Se você estiver no macOS com o homebrew, o ffuf pode ser instalado com:
brew install ffufou
-
Se você tiver um compilador Go recente instalado:
go install github.com/ffuf/ffuf/v2@latest(o mesmo comando serve para atualizar)ou
-
git clone https://github.com/ffuf/ffuf ; cd ffuf ; go get ; go build
- O ffuf depende do Go 1.20 ou superior.
- Uma compilação Go a partir de um checkout mostra
git-<date>-<commit>em vez da tag. Uma compilação local não é uma versão oficial, mesmo quando você está sobre uma tag, e as informações de compilação embutidas do Go nos dão o commit, mas não o nome da tag — por isso exibimos o commit exato a partir do qual foi compilado. Os binários versionados oficiais são os da página de releases.
Exemplo de uso
Os exemplos de uso abaixo mostram apenas as tarefas mais simples que você pode realizar usando o ffuf.
Uma documentação mais elaborada, que aborda muitos recursos com vários exemplos, está disponível no wiki do ffuf em https://github.com/ffuf/ffuf/wiki
Para uma documentação mais extensa, com exemplos de uso reais e dicas, não deixe de conferir o incrível guia: "Everything you need to know about FFUF" de Michael Skelton (@codingo).
Você também pode praticar suas varreduras de ffuf contra um host ao vivo com diferentes lições e casos de uso, seja localmente usando o contêiner docker https://github.com/adamtlangley/ffufme ou contra a versão hospedada em http://ffuf.me criada por Adam Langley @adamtlangley.
Descoberta típica de diretórios
Usando a palavra-chave FUZZ no final da URL (-u):
ffuf -w /path/to/wordlist -u https://target/FUZZ
Descoberta de host virtual (sem registros DNS)
Supondo que o tamanho padrão da resposta do virtualhost seja 4242 bytes, podemos filtrar todas as respostas com esse tamanho (-fs 4242) enquanto fazemos fuzzing no cabeçalho Host:
ffuf -w /path/to/vhost/wordlist -u https://target -H "Host: FUZZ" -fs 4242
Fuzzing de parâmetros GET
O fuzzing de nomes de parâmetros GET é muito semelhante à descoberta de diretórios e funciona definindo a palavra-chave FUZZ como parte da URL. Isso também assume um tamanho de resposta de 4242 bytes para um nome de parâmetro GET inválido.
ffuf -w /path/to/paramnames.txt -u https://target/script.php?FUZZ=test_value -fs 4242
Se o nome do parâmetro for conhecido, os valores podem ser alvo de fuzzing da mesma forma. Este exemplo assume um valor de parâmetro incorreto retornando o código de resposta HTTP 401.
ffuf -w /path/to/values.txt -u https://target/script.php?valid_name=FUZZ -fc 401
Fuzzing de dados POST
Esta é uma operação muito direta, novamente usando a palavra-chave FUZZ. Este exemplo faz fuzzing apenas em parte da requisição POST. Estamos filtrando novamente as respostas 401.
ffuf -w /path/to/postdata.txt -X POST -d "username=admin\&password=FUZZ" -u https://target/login.php -fc 401
Tempo máximo de execução
Se você não quiser que o ffuf execute indefinidamente, use o -maxtime. Isso interrompe todo o processo após um determinado tempo (em segundos).
ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime 60
Ao trabalhar com recursão, você pode controlar o maxtime por job usando -maxtime-job. Isso interrompe o job atual após um determinado tempo (em segundos) e continua com o próximo. Novos jobs são criados quando a funcionalidade de recursão detecta um subdiretório.
ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime-job 60 -recursion -recursion-depth 2
Também é possível combinar ambas as flags, limitando o tempo máximo de execução por job e o tempo total de execução. Se você não usar recursão, ambas as flags se comportam da mesma forma.
Usando um mutador externo para gerar casos de teste
Para este exemplo, faremos fuzzing de dados JSON enviados via POST. O Radamsa é usado como mutador.
Quando --input-cmd é usado, o ffuf exibe as correspondências pela sua posição. Esse mesmo valor de posição estará disponível para o chamador como uma variável de ambiente $FFUF_NUM. Usaremos esse valor de posição como semente para o mutador. Os arquivos example1.txt e example2.txt contêm payloads JSON válidos. Estamos correspondendo todas as respostas, mas filtrando o código de resposta 400 - Bad request:
ffuf --input-cmd 'radamsa --seed $FFUF_NUM example1.txt example2.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/FUZZ -mc all -fc 400
É claro que não é muito eficiente chamar o mutador para cada payload, então também podemos pré-gerar os payloads, ainda usando o Radamsa como exemplo:
# Generate 1000 example payloads
radamsa -n 1000 -o %n.txt example1.txt example2.txt
# This results into files 1.txt ... 1000.txt
# Now we can just read the payload data in a loop from file for ffuf
ffuf --input-cmd 'cat $FFUF_NUM.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/ -mc all -fc 400
Arquivos de configuração
Ao executar o ffuf, ele primeiro verifica se existe um arquivo de configuração padrão. O caminho padrão para um arquivo ffufrc é
$XDG_CONFIG_HOME/ffuf/ffufrc. Você pode configurar uma ou várias opções neste arquivo, e elas serão aplicadas em
todos os jobs subsequentes do ffuf. Um exemplo de arquivo ffufrc pode ser encontrado
aqui.
Uma descrição mais detalhada sobre os locais dos arquivos de configuração pode ser encontrada no wiki: https://github.com/ffuf/ffuf/wiki/Configuration

