Ao acessar o site, podemos ver que ele possui um campo de senha, onde diz que a senha deve conter 12 caracteres.
Página principal do site
Podemos inspecionar o código fonte da página. Podemos perceber que quando o usuário clica para verificar a senha, o site chama uma função chamada validatePassword(), e também há um script ofuscado que parece ser o responsável por validar a senha.
Código fonte da página
Deobfuscando o código com deobfuscate.io, achamos a função validatePassword().
Podemos trocar o nome das variáveis para facilitar a leitura do código.
async function validatePassword(password) {
if (password.length !== 12) {
return {
"valid": false,
"message": "A senha deve ter 12 caracteres"
};
}
const passwordParts = [password.slice(0, 3), password.slice(3, 6), password.slice(6, 9), password.slice(9, 12)];
const generatedPassword = passwordParts[0].split('').reverse().join('') + passwordParts[1].split('').map(char => String.fromCharCode(char.charCodeAt(0) + 2)).join('') + btoa(passwordParts[2]) + passwordParts[3].split('').map((char, index) => String.fromCharCode(char.charCodeAt(0) + index + 1)).join('');
if (generatedPassword == "F4#:}cMVUzIBk") {
// ...
A senha que enviamos é dividida em 4 partes, e cada parte passa por uma transformação diferente. Vamos analisar cada parte:
Parte 1:passwordParts[0].split('').reverse().join('') - Inverte a string.
Parte 2:passwordParts[1].split('').map(char => String.fromCharCode(char.charCodeAt(0) + 2)).join('') - Adiciona 2 ao valor ASCII de cada caractere.
Parte 3:btoa(passwordParts[2]) - Codifica a string em Base64.
Parte 4:passwordParts[3].split('').map((char, index) => String.fromCharCode(char.charCodeAt(0) + index + 1)).join('') - Adiciona o índice + 1 ao valor ASCII de cada caractere.
Depois disso, as 4 partes são concatenadas e comparadas com a string F4#:}cMVUzIBk. Sendo assim, podemos montar a senha original com base nas operações que foram feitas:
const password = "F4#:}cMVUzIBk"; // Tem 13 caracteres. A operação de base64 gerou 4 caracteres.
const part1 = password.slice(0, 3).split('').reverse().join(''); // Inverte a string
const part2 = password.slice(3, 6).split('').map(char => String.fromCharCode(char.charCodeAt(0) - 2)).join(''); // Subtrai 2 do valor ASCII de cada caractere
const part3 = atob(password.slice(6, 10)); // Decodifica a string em Base64
const part4 = password.slice(10, 13).split('').map((char, index) => String.fromCharCode(char.charCodeAt(0) - (index + 1))).join(''); // Subtrai o índice + 1 do valor ASCII de cada caractere
console.log(part1 + part2 + part3 + part4); // Imprime a senha original
Rodando o código, obtemos a senha original: #4F8{a1U3H@h.
Agora, podemos enviar a senha para o site e obter a flag.