Writeup: FlareOn 2021: 001 - credchecker
1. TLDR
2. Dane wejściowe
Plik z zadaniem znajduje się tutaj. Hasło: flare.
Przedmiotem zadania jest strona html z osadzonym javascriptem. Dostępne pliki to:
admin.html
img/goldenticket.png
img/logo.png
Ze względu na fakt, że implementacja logiki programu znajduje się w pliku admin.html
, wystarczy ograniczyć się do analizy tego pliku.
3. Analiza interfejsu
Dostęp do panelu jest chroniony:
Należy zatem podjąć próbę analizy metody weryfikacji danych uwierzytelniających
4. Analiza kodu
W źródle strony można znaleźć fragment kodu weryfikujący dane uwierzytelniające:
function checkCreds() {
if (username.value == "Admin" && atob(password.value) == "goldenticket")
{
var key = atob(encoded_key);
var flag = "";
for (let i = 0; i < key.length; i++)
{
flag += String.fromCharCode(key.charCodeAt(i) ^ password.value.charCodeAt(i % password.value.length))
}
document.getElementById("banner").style.display = "none";
document.getElementById("formdiv").style.display = "none";
document.getElementById("message").style.display = "none";
document.getElementById("final_flag").innerText = flag;
document.getElementById("winner").style.display = "block";
}
else
{
document.getElementById("message").style.display = "block";
}
}
Można zauważyć, że oczekiwana nazwa użytkownika to Admin
. Hasło natomiast powinno stanowić zakodowany z wykorzystaniem base64 ciąg goldenticket
.
Hasło to wynik funkcji:
btoa("goldenticket")
zatem hasło to:
Z29sZGVudGlja2V0
5. Odczytanie flagi
Po wpisaniu poprawnych danych, można odczytać flagę:
enter_the_funhouse@flare-on.com