Skip to main content
Kern: zwakke/gokbare wachtwoorden, brute-force, username enumeration, reset-/2FA-fouten, en verborgen content vinden via fuzzing.
In de les kwam het snelheidsverschil tussen Burp Intruder Community en ffuf aan bod. ffuf was vooral nuttig voor grotere wordlists.

In een oogopslag

TechniekConcept
Zwakke/default credsadmin/admin, admin123, password, username = password
Brute-force loginffuf met dictionary (geen rate-limit)
Username enumerationverschil in respons verraadt geldige user
Verborgen/admin pagina’sURL gokken, in JS zoeken, of fuzzen
Content fuzzingffuf / gobuster met wordlist
Hints in broncodecomments, id=/name= die naar een wordlist wijzen
Password reset?user=victim, token verwijderen/hergebruiken
2FA bypassdoorklikken, account-cookie wijzigen, code brute-forcen

Technieken in detail

De eerste notities gingen over snelle, eenvoudige checks:
  • Top: password, 123456, qwerty, admin, admin123, 111111
  • Wachtwoord = username, blank, of nog de default
  • Soms staat het wachtwoord gewoon in de broncode
  • Thematische hints uit de oefening kunnen richting geven
  • Let op verschillen: response size, status code, of foutmelding-tekst
  • “Invalid username” vs “Invalid password” = verbose failure message
  • Geldige user -> afwijkende respons -> filter daarop met ffuf
  • URL gokken (/admin, /administration, /AdminTools)
  • Route zoeken in de main JS-file
  • Een wordlist kan soms op de site zelf staan (/fuzz.txt)
  • Een attribuut zoals <form id="Dict.txt_might_help"> kan naar /.../Dict.txt verwijzen
  • Guessable param: reset-password?user=victim -> verander naar slachtoffer
  • Token niet gevalideerd: reset aanvragen voor jezelf, token verwijderen, username wijzigen
  • Skip-test: na stap 1 werd soms direct een “logged-in only” pagina geopend
  • account-cookie wijzigen naar slachtoffer bij het indienen van de code
  • De 4-6 cijfer code brute-forcen als er geen lockout is
  • JWT-tokens: {"alg":"none"}, zwak getekend, geen expiry-validatie
  • Auth-tokens/wachtwoorden als URL-parameter = lekgevoelig
  • Rechten/identiteit die gewoon in een cookie staan

ffuf - de snelle vervanger voor Burp Intruder

Zet overal waar je een woord uit een lijst wil invullen de placeholder FUZZ.
ffuf -c -w wordlist.txt -u http://<target>/FUZZ
  • -c kleur ; -w wordlist ; -t 40 threads (verlaag bij trage server)
  • Status: 200 bestaat ; 403 verboden (interessant) ; 404 niets

Response size in ffuf

1

Run zonder filter

De eerste ffuf-run toont de Size-kolom in de output.
2

Spot de afwijking

Bijna alles is bv. Size: 1287 (foute logins), een is anders (1308).
3

Filter & herhaal

Voeg -fs 1287 toe -> enkel de geslaagde poging blijft over.

Handige ffuf parameters

Bij ffuf is het handig om matchers en filters apart te onthouden:
  • matchers houden responses over die aan een voorwaarde voldoen
  • filters gooien responses weg die te veel op ruis lijken
FlagWat doet het?Handig wanneer
-w lijst.txtGebruikt een wordlist.Directory-, user-, password- of parameterfuzzing.
-w users.txt:USERKoppelt een wordlist aan een eigen placeholder.Meerdere placeholders zoals USER en PASS.
-u http://target/FUZZZet de fuzzpositie in de URL.Paden, files, parameters of waarden testen.
-X POSTGebruikt een andere HTTP-methode.Loginforms, API calls of PUT/DELETE tests.
-d "a=FUZZ"Stuurt een body mee.POST-login, JSON of form data fuzzing.
-H "Name: value"Voegt een header toe.Cookies, auth headers, JSON content type of Host fuzzing.
-b "a=b; c=d"Stuurt cookies mee.Fuzzen binnen een ingelogde sessie.
-mc 200,302Matcht alleen bepaalde statuscodes.Success heeft een herkenbare code, bv. 302 na login.
-fc 401,403Filtert statuscodes weg.Bekende mislukte responses uit de output halen.
-ms 1308Matcht alleen response size.De geslaagde response heeft een vaste afwijkende size.
-fs 1287Filtert response size weg.Alle foute pogingen hebben dezelfde size.
-mw 50 / -fw 50Matcht of filtert op aantal woorden.Size wisselt licht, maar de tekststructuur blijft gelijk.
-mr "Welcome"Matcht bodytekst met regex.Alleen success-responses tonen.
-fr "Invalid"Filtert bodytekst met regex weg.Foute logins tonen altijd dezelfde foutmelding.
-acProbeert automatisch ruis te kalibreren.Veel valse positieven met dynamische 404-pagina’s.
-t 20Zet het aantal threads.Sneller of juist rustiger scannen.
-rate 50Limiteert requests per seconde.Oefenomgeving of server niet overbelasten.
-x http://127.0.0.1:8080Stuurt requests via proxy.ffuf-verkeer in Burp bekijken.
-replay-proxy http://127.0.0.1:8080Stuurt alleen matches opnieuw via proxy.Alleen interessante hits in Burp onderzoeken.
-request req.txtGebruikt een raw HTTP request uit een bestand.Complexe Burp-request exact herhalen.
-o out.json -of jsonSlaat output op als JSON.Resultaten later filteren of vergelijken.
ffuf -w passwords.txt:PASS \
  -u http://<target>/login \
  -X POST \
  -d "username=admin&password=PASS" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -fr "Invalid password"

Burp -> ffuf

In de les (Burp)Met ffuf
Send to Intruderrequest namaken met -u -X -d -H
Intruder markersplaceholders USER / PASS
Cluster bomb-mode clusterbomb
Pitchfork-mode pitchfork
Sorteren op Length-fs / -ms
Grep match-mc / -fc

Tools

ffuf

Snelle fuzzing voor directories, parameters en login-combinaties.

gobuster

Brute-force directories, DNS-namen, vhosts en bestanden.

SecLists

Wordlists voor users, passwords, directories en payloads.

Burp Suite

Inspecteer loginflows, bouw requests na en vergelijk responses.

OWASP ZAP

Proxy en scanner voor HTTP-verkeer en baseline checks.

wget

Handig wanneer een oefenomgeving zelf een wordlist lekt.