Kern: zwakke/gokbare wachtwoorden, brute-force, username enumeration, reset-/2FA-fouten, en verborgen content vinden via fuzzing.
In een oogopslag
| Techniek | Concept |
|---|---|
| Zwakke/default creds | admin/admin, admin123, password, username = password |
| Brute-force login | ffuf met dictionary (geen rate-limit) |
| Username enumeration | verschil in respons verraadt geldige user |
| Verborgen/admin pagina’s | URL gokken, in JS zoeken, of fuzzen |
| Content fuzzing | ffuf / gobuster met wordlist |
| Hints in broncode | comments, id=/name= die naar een wordlist wijzen |
| Password reset | ?user=victim, token verwijderen/hergebruiken |
| 2FA bypass | doorklikken, account-cookie wijzigen, code brute-forcen |
Technieken in detail
Zwakke / default wachtwoorden
Zwakke / default wachtwoorden
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
Username enumeration
Username enumeration
- 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
Verborgen pagina's & hints
Verborgen pagina's & hints
- 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.txtverwijzen
Password reset-fouten
Password reset-fouten
- Guessable param:
reset-password?user=victim-> verander naar slachtoffer - Token niet gevalideerd: reset aanvragen voor jezelf, token verwijderen, username wijzigen
2FA bypass
2FA bypass
- 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
Extra checks
Extra checks
- 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 placeholderFUZZ.
- Dir fuzzing
- Login brute-force
- Filteren
-ckleur ;-wwordlist ;-t 40threads (verlaag bij trage server)- Status:
200bestaat ;403verboden (interessant) ;404niets
Response size in ffuf
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
| Flag | Wat doet het? | Handig wanneer |
|---|---|---|
-w lijst.txt | Gebruikt een wordlist. | Directory-, user-, password- of parameterfuzzing. |
-w users.txt:USER | Koppelt een wordlist aan een eigen placeholder. | Meerdere placeholders zoals USER en PASS. |
-u http://target/FUZZ | Zet de fuzzpositie in de URL. | Paden, files, parameters of waarden testen. |
-X POST | Gebruikt 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,302 | Matcht alleen bepaalde statuscodes. | Success heeft een herkenbare code, bv. 302 na login. |
-fc 401,403 | Filtert statuscodes weg. | Bekende mislukte responses uit de output halen. |
-ms 1308 | Matcht alleen response size. | De geslaagde response heeft een vaste afwijkende size. |
-fs 1287 | Filtert response size weg. | Alle foute pogingen hebben dezelfde size. |
-mw 50 / -fw 50 | Matcht 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. |
-ac | Probeert automatisch ruis te kalibreren. | Veel valse positieven met dynamische 404-pagina’s. |
-t 20 | Zet het aantal threads. | Sneller of juist rustiger scannen. |
-rate 50 | Limiteert requests per seconde. | Oefenomgeving of server niet overbelasten. |
-x http://127.0.0.1:8080 | Stuurt requests via proxy. | ffuf-verkeer in Burp bekijken. |
-replay-proxy http://127.0.0.1:8080 | Stuurt alleen matches opnieuw via proxy. | Alleen interessante hits in Burp onderzoeken. |
-request req.txt | Gebruikt een raw HTTP request uit een bestand. | Complexe Burp-request exact herhalen. |
-o out.json -of json | Slaat output op als JSON. | Resultaten later filteren of vergelijken. |
Burp -> ffuf
| In de les (Burp) | Met ffuf |
|---|---|
| Send to Intruder | request namaken met -u -X -d -H |
| Intruder markers | placeholders 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.