> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jaspervanzeir.be/llms.txt
> Use this file to discover all available pages before exploring further.

# Broken Authentication & Fuzzing

> Inlogbeveiliging breken + verborgen content vinden met ffuf.

<Note>
  Kern: zwakke/gokbare wachtwoorden, brute-force, username enumeration, reset-/2FA-fouten, en **verborgen content** vinden via fuzzing.
</Note>

<Warning>
  In de les kwam het snelheidsverschil tussen Burp Intruder Community en **`ffuf`** aan bod. ffuf was vooral nuttig voor grotere wordlists.
</Warning>

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

<AccordionGroup>
  <Accordion title="Zwakke / default wachtwoorden" icon="lock-keyhole-open">
    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
  </Accordion>

  <Accordion title="Username enumeration" icon="users-viewfinder">
    * 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
  </Accordion>

  <Accordion title="Verborgen pagina's & hints" icon="folder-magnifying-glass">
    * 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
  </Accordion>

  <Accordion title="Password reset-fouten" icon="rotate">
    * Guessable param: `reset-password?user=victim` -> verander naar slachtoffer
    * Token niet gevalideerd: reset aanvragen voor jezelf, token verwijderen, username wijzigen
  </Accordion>

  <Accordion title="2FA bypass" icon="mobile-screen">
    * 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
  </Accordion>

  <Accordion title="Extra checks" icon="list-check">
    * **JWT-tokens**: `{"alg":"none"}`, zwak getekend, geen expiry-validatie
    * Auth-tokens/wachtwoorden als URL-parameter = lekgevoelig
    * Rechten/identiteit die gewoon in een cookie staan
  </Accordion>
</AccordionGroup>

## ffuf - de snelle vervanger voor Burp Intruder

Zet overal waar je een woord uit een lijst wil invullen de placeholder **`FUZZ`**.

<Tabs>
  <Tab title="Dir fuzzing">
    ```bash theme={null}
    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
  </Tab>

  <Tab title="Login brute-force">
    ```bash theme={null}
    ffuf -w users.txt:USER -w pass.txt:PASS \
      -u http://<target>/login \
      -X POST \
      -d "username=USER&password=PASS" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -mode clusterbomb \
      -fs 1287
    ```

    * `-w lijst:NAAM` koppelt een wordlist aan een placeholder
    * `-mode clusterbomb` = alle combinaties (zoals Burp Cluster bomb)
  </Tab>

  <Tab title="Filteren">
    Een foute login geeft een baseline voor response size en filtering:

    | Flag          | Betekenis                                  |
    | ------------- | ------------------------------------------ |
    | `-mc 200,302` | match deze status codes (`302` = login OK) |
    | `-fc 401,403` | filter deze status codes weg               |
    | `-fs 1287`    | filter op response size                    |
    | `-fw 201`     | filter op aantal words                     |
    | `-ms 1308`    | match alleen deze size                     |

    Vuistregel: of match de geslaagde respons, of filter de mislukte weg.
  </Tab>
</Tabs>

### Response size in ffuf

<Steps>
  <Step title="Run zonder filter">
    De eerste ffuf-run toont de `Size`-kolom in de output.
  </Step>

  <Step title="Spot de afwijking">
    Bijna alles is bv. `Size: 1287` (foute logins), een is anders (`1308`).
  </Step>

  <Step title="Filter & herhaal">
    Voeg `-fs 1287` toe -> enkel de geslaagde poging blijft over.
  </Step>
</Steps>

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

```bash theme={null}
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 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

<CardGroup cols={3}>
  <Card title="ffuf" icon="bolt" href="https://github.com/ffuf/ffuf">
    Snelle fuzzing voor directories, parameters en login-combinaties.
  </Card>

  <Card title="gobuster" icon="folder-magnifying-glass" href="https://github.com/OJ/gobuster">
    Brute-force directories, DNS-namen, vhosts en bestanden.
  </Card>

  <Card title="SecLists" icon="list" href="https://github.com/danielmiessler/SecLists">
    Wordlists voor users, passwords, directories en payloads.
  </Card>

  <Card title="Burp Suite" icon="shield" href="https://portswigger.net/burp">
    Inspecteer loginflows, bouw requests na en vergelijk responses.
  </Card>

  <Card title="OWASP ZAP" icon="spider" href="https://www.zaproxy.org/">
    Proxy en scanner voor HTTP-verkeer en baseline checks.
  </Card>

  <Card title="wget" icon="download" href="https://www.gnu.org/software/wget/">
    Handig wanneer een oefenomgeving zelf een wordlist lekt.
  </Card>
</CardGroup>
