Writeup: FlareOn 2021: 001 - credchecker

Task description

1. TLDR

Credchecker graph

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:

login panel

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ę:

flag

enter_the_funhouse@flare-on.com