
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
As opções de configuração fornecidas na linha de comando substituem as carregadas do arquivo ffufrc padrão.
Nota: isso não se aplica a flags de CLI que podem ser fornecidas mais de uma vez. Um desses exemplos é a flag -H (header).
Nesse caso, os valores de -H fornecidos na linha de comando serão adicionados aos do arquivo de configuração.
Além disso, caso você queira usar vários arquivos de configuração para diferentes casos de uso, você pode fazer isso definindo
o caminho do arquivo de configuração usando a flag de linha de comando -config, que recebe o caminho do arquivo de configuração como
parâmetro.
Uso
Para definir o caso de teste para o ffuf, use a palavra-chave FUZZ em qualquer lugar na URL (-u), cabeçalhos (-H) ou dados POST (-d).
Fuzz Faster U Fool - v2.1.0
HTTP OPTIONS:
-H Header `"Name: Value"`, separated by colon. Multiple -H flags are accepted.
-X HTTP method to use
-b Cookie data `"NAME1=VALUE1; NAME2=VALUE2"` for copy as curl functionality.
-cc Client cert for authentication. Client key needs to be defined as well for this to work
-ck Client key for authentication. Client certificate needs to be defined as well for this to work
-d POST data
-http2 Use HTTP2 protocol (default: false)
-ignore-body Do not fetch the response content. (default: false)
-r Follow redirects (default: false)
-raw Do not encode URI (default: false)
-recursion Scan recursively. Only FUZZ keyword is supported, and URL (-u) has to end in it. (default: false)
-recursion-depth Maximum recursion depth. (default: 0)
-recursion-strategy Recursion strategy: "default" for a redirect based, and "greedy" to recurse on all matches (default: default)
-replay-proxy Replay matched requests using this proxy.
-sni Target TLS SNI, does not support FUZZ keyword
-timeout HTTP request timeout in seconds. (default: 10)
-u Target URL
-x Proxy URL (SOCKS5 or HTTP). For example: http://127.0.0.1:8080 or socks5://127.0.0.1:8080
GENERAL OPTIONS:
-V Show version information. (default: false)
-ac Automatically calibrate filtering options (default: false)
-acc Custom auto-calibration string. Can be used multiple times. Implies -ac
-ach Per host autocalibration (default: false)
-ack Autocalibration keyword (default: FUZZ)
-acs Custom auto-calibration strategies. Can be used multiple times. Implies -ac
-c Colorize output. (default: false)
-config Load configuration from a file
-json JSON output, printing newline-delimited JSON records (default: false)
-maxtime Maximum running time in seconds for entire process. (default: 0)
-maxtime-job Maximum running time in seconds per job. (default: 0)
-noninteractive Disable the interactive console functionality (default: false)
-p Seconds of `delay` between requests, or a range of random delay. For example "0.1" or "0.1-2.0"
-rate Rate of requests per second (default: 0)
-s Do not print additional information (silent mode) (default: false)
-sa Stop on all error cases. Implies -sf and -se. (default: false)
-scraperfile Custom scraper file path
-scrapers Active scraper groups (default: all)
-se Stop on spurious errors (default: false)
-search Search for a FFUFHASH payload from ffuf history
-sf Stop when > 95% of responses return 403 Forbidden (default: false)
-t Number of concurrent threads. (default: 40)
-v Verbose output, printing full URL and redirect location (if any) with the results. (default: false)
MATCHER OPTIONS:
-mc Match HTTP status codes, or "all" for everything. (default: 200-299,301,302,307,401,403,405,500)
-ml Match amount of lines in response
-mmode Matcher set operator. Either of: and, or (default: or)
-mr Match regexp
-ms Match HTTP response size
-mt Match how many milliseconds to the first response byte, either greater or less than. EG: >100 or <100
-mw Match amount of words in response
FILTER OPTIONS:
-fc Filter HTTP status codes from response. Comma separated list of codes and ranges
-fl Filter by amount of lines in response. Comma separated list of line counts and ranges
-fmode Filter set operator. Either of: and, or (default: or)
-fr Filter regexp
-fs Filter HTTP response size. Comma separated list of sizes and ranges
-ft Filter by number of milliseconds to the first response byte, either greater or less than. EG: >100 or <100
-fw Filter by amount of words in response. Comma separated list of word counts and ranges
INPUT OPTIONS:
-D DirSearch wordlist compatibility mode. Used in conjunction with -e flag. (default: false)
-e Comma separated list of extensions. Extends FUZZ keyword.
-enc Encoders for keywords, eg. 'FUZZ:urlencode b64encode'
-ic Ignore wordlist comments (default: false)
-input-cmd Command producing the input. --input-num is required when using this input method. Overrides -w.
-input-num Number of inputs to test. Used in conjunction with --input-cmd. (default: 100)
-input-shell Shell to be used for running command
-mode Multi-wordlist operation mode. Available modes: clusterbomb, pitchfork, sniper (default: clusterbomb)
-request File containing the raw http request
-request-proto Protocol to use along with raw request (default: https)
-w Wordlist file path and (optional) keyword separated by colon. eg. '/path/to/wordlist:KEYWORD'
OUTPUT OPTIONS:
-debug-log Write all of the internal logging to the specified file.
-o Write output to file
-od Directory path to store matched results to.
-of Output file format. Available formats: json, ejson, html, md, csv, ecsv (or, 'all' for all formats) (default: json)
-or Don't create the output file if we don't have results (default: false)
EXAMPLE USAGE:
Fuzz file paths from wordlist.txt, match all responses but filter out those with content-size 42.
Colored, verbose output.
ffuf -w wordlist.txt -u https://example.org/FUZZ -mc all -fs 42 -c -v
Fuzz Host-header, match HTTP 200 responses.
ffuf -w hosts.txt -u https://example.org/ -H "Host: FUZZ" -mc 200
Fuzz POST JSON data. Match all responses not containing text "error".
ffuf -w entries.txt -u https://example.org/ -X POST -H "Content-Type: application/json" \
-d '{"name": "FUZZ", "anotherkey": "anothervalue"}' -fr "error"
Fuzz multiple locations. Match only responses reflecting the value of "VAL" keyword. Colored.
ffuf -w params.txt:PARAM -w values.txt:VAL -u https://example.org/?PARAM=VAL -mr "VAL" -c
More information and examples: https://github.com/ffuf/ffuf
Modo interativo
Ao pressionar ENTER durante a execução do ffuf, o processo é pausado e o usuário é levado a um modo interativo semelhante a um shell:
entering interactive mode
type "help" for a list of commands, or ENTER to resume.
> help
available commands:
afc [value] - append to status code filter
fc [value] - (re)configure status code filter
afl [value] - append to line count filter
fl [value] - (re)configure line count filter
afw [value] - append to word count filter
fw [value] - (re)configure word count filter
afs [value] - append to size filter
fs [value] - (re)configure size filter
aft [value] - append to time filter
ft [value] - (re)configure time filter
rate [value] - adjust rate of requests per second (active: 0)
queueshow - show job queue
queuedel [number] - delete a job in the queue
queueskip - advance to the next queued job
restart - restart and resume the current ffuf job
resume - resume current ffuf job (or: ENTER)
show - show results for the current job
savejson [filename] - save current matches to a file
help - you are looking at it
>
neste modo, os filtros podem ser reconfigurados, a fila gerenciada e o estado atual salvo em disco.
Ao (re)configurar os filtros, eles são aplicados retroativamente e todas as correspondências falso-positivas da memória que teriam sido filtradas pelos filtros recém-adicionados são excluídas.
O novo estado das correspondências pode ser exibido com o comando show, que imprime todas as correspondências como se
tivessem sido encontradas pelo ffuf.
Como as correspondências "negativas" não são armazenadas na memória, afrouxar os filtros infelizmente não pode trazer de volta as correspondências perdidas.
Para esse tipo de cenário, o usuário pode usar o comando restart, que redefine o estado e inicia o job atual do início.
Contribuindo
Relatórios de bugs, solicitações de recursos e pull requests são bem-vindos. Consulte CONTRIBUTING.md para começar e a seção Contributing do wiki para a documentação de arquitetura e testes.
Licença
O ffuf é distribuído sob a licença MIT. Consulte LICENSE.

