Solución de Fetch the Flag CTF 2022: Treasure Trove
Luke Watts
10 de noviembre de 2022
0 minutos de lectura¡Gracias por jugar Fetch con nosotros! Felicitaciones a los miles de jugadores que participaron en Fetch the Flag CTF. ¡Y muchas gracias a los Snykers que crearon, probaron y documentaron los desafíos!
Este año, Fetch the Flag fue muy divertido, ¡aunque también implicó mucho trabajo! Con 16 desafíos y poco tiempo, no todos los equipos pudieron completarlos. Para quienes no lograron vencer al reloj, veremos cómo nuestro equipo abordó el desafío Treasure Trove.
Guía paso a paso
El enunciado del desafío decía: «Ya está disponible el último Treasure Trove, pero ¿dónde puse mi clave de licencia?». Para empezar, hay una etiqueta que dice Ingeniería inversa y se proporciona un archivo obfuscator.js.
También hay un enlace a un sitio web que incluye campos de entrada de 5 x 5 caracteres, un botón y unas ilustraciones maravillosas que me recuerdan a cuando jugaba Curse of Monkey Island.

Si revisas el código proporcionado, encontrarás una herramienta que convierte código legible para las personas en código basura.
Ahora, revisa el sitio web. Hay un endpoint swashbuckle.js que contiene un método llamado validate. El código parece coincidir con el resultado que genera el ofuscador. Mmm…
Si miramos más de cerca, vemos que el método validate está disponible en window y se ejecuta al enviar el formulario. ¡Vaya! Parece que la única forma es aplicar ingeniería inversa a validate… ¿Podrá ayudarnos el navegador? Ejecutemos validate.toString() desde la consola del navegador. ¡Bingpot!
Al parecer, el código realiza los siguientes pasos:
Obtiene los valores de los campos de entrada HTML
Verifica que los caracteres estén dentro del rango
A-Z0-9Recorre los caracteres, los convierte a
charCodey suma esos valores. El métodocharCodeAt()devuelve un entero entre 0 y 65535 que representa la unidad de código UTF-16 en el índice indicado. FuenteGenera un error si el valor no es igual a 1800
Si el valor es igual a 1800, los valores de entrada originales se envían a un endpoint de API
La conclusión más interesante es que, a menos que el valor sea 1800, el código no es válido.
1800 / 25 (el total de caracteres disponibles)
72
String.fromCharCode(72)Devuelve H
Ingresar HHHHH en cada campo

¡Doble bingpot!

Logramos resolver este desafío sin tener que analizar el código del ofuscador. ¡Así nos quedó mucho tiempo para empezar con el siguiente desafío!
¿Quieres saber cómo encontramos las demás banderas? Visita nuestra página de soluciones de Fetch the Flag para ver cómo lo hicimos.
