Dit document bevat de volledige walkthrough en oplossingen (spoilers) voor de docent om de CTF applicatie te begeleiden.
- Open een terminal in de projectmap.
- Run
npm install(als dat nog niet is gebeurd). - Run
node server.jsofnpm startom de server te starten. - Ga naar
http://localhost:3000in je browser.
Wanneer een student naar de applicatie gaat, vullen ze hun studentnummer in (bijv. 123456). De applicatie genereert vervolgens unieke flags op basis van dit nummer en een server-side geheim. Hierdoor is de flag van student A (FLAG{123456_a1b2c3_RECON}) anders dan die van student B (FLAG{987654_x9y8z7_RECON}).
Doel: Leerlingen moeten kijken naar broncode die verborgen is voor het blote oog. Oplossing:
- Ga naar Challenge 1.
- Druk op
F12ofRechtermuisklik -> Paginabron bekijken(View Page Source). - Onderaan in de HTML-code zien ze een commentaar staan met hun unieke flag:
<!-- Your unique flag is: FLAG{...} -->
Doel: Inloggen als de administrator ("bbq_master") door middel van een SQL Injection. Oplossing:
- Ga naar Challenge 2.
- Vul bij
Username:de volgende payload in:' OR username='bbq_master' --(of een vergelijkbare werkende SQLi payload). - Vul bij
Password:een willekeurige waarde in (maakt niet uit, de query negeert dit door de--(comment)). - Klik op Login. Ze zijn nu ingelogd als
bbq_masteren zien de flag op het scherm verschijnen.
Doel: Begrijpen dat URL-parameters direct toegang kunnen geven tot objecten als autorisatie niet goed is ingeregeld. Oplossing:
- Ga naar Challenge 3.
- De standaard weergave laat zien dat je op
/challenge/3?user_id=1of3zit. - Pas de URL parameter aan naar
?user_id=2in de adresbalk en druk op Enter. - Je ziet nu het profiel van de "bbq_master" inclusief de geheime informatie en de flag.
Doel: Bestanden lezen die niet via de normale web-paden toegankelijk zouden moeten zijn. Oplossing:
- Ga naar Challenge 4.
- In het formulier zien ze dat het bestand
menu.txtwordt opgehaald via de parameter?file=menu.txt. - In de tekst op de pagina staat een hint: zoek naar
secret_bbq_recipe.txtin de parent directory. - Vul bij het invoerveld in:
../secret_bbq_recipe.txten klik op "Fetch File". - De applicatie gaat een map omhoog (
..) en leest het geheime bestand waar de laatste flag in staat.
Doel: Begrijpen dat Base64 codering geen encryptie is en makkelijk gemanipuleerd kan worden. Oplossing:
- Ga naar Challenge 5.
- Open Developer Tools (F12) en ga naar
Application->Cookies(ofStoragein Firefox). - Zoek de cookie genaamd
role. De waarde isZ3Vlc3Q=(wat "guest" is in Base64). - Decodeer "admin" naar Base64. Dit wordt
YWRtaW4=. - Verander de waarde van de
rolecookie naarYWRtaW4=. - Klik op de knop "Refresh Page" op de pagina. Je bent nu admin en ziet de flag.
Doel: Begrijpen dat validatie of prijzen in verborgen HTML-velden aan de client-side nooit te vertrouwen zijn. Oplossing:
- Ga naar Challenge 6.
- Inspecteer het formulier met Developer Tools (Rechtermuisklik op de knop -> Inspecteren).
- Zoek de verborgen input:
<input type="hidden" name="price" value="50">. - Dubbelklik op de
value="50"en verander dit naar-50of0. - Klik op "Buy Ticket".
- Omdat de server de negatieve of 0 waarde accepteert (en je 0 credits hebt), is de aankoop "succesvol" en krijg je de flag.
Studenten kunnen hun flags plakken op de "Mission Hub" (Dashboard) om direct feedback te krijgen of deze correct is. Zodra alle flags daar gevalideerd zijn, weten ze zeker dat ze de juiste oplossingen hebben om in te leveren in Simulise!
Omdat de flags cryptografisch zijn versleuteld met het studentnummer (FLAG{studentId_hash_CHALLENGE}), kunnen ze niet worden afgekeken. Om je als docent te helpen controleren of een ingeleverde flag in Simulise legitiem is, zijn er twee opties:
Optie 1: Via de webinterface (Aanbevolen)
- Ga naar
http://localhost:3000/docentin je browser. - Log in met gebruikersnaam
docenten wachtwoordbbq. - Plak de flag in de Flag Verificatie Tool op het dashboard om hem direct te controleren.
Optie 2: Via de terminal
- Open je terminal in de projectmap.
- Voer het script uit met de ingeleverde flag:
node verify_flags.js FLAG{123456_a1b2c3_RECON} - Het script controleert direct of de flag wiskundig klopt bij dat specifieke studentnummer.