Day 17: Hoperation Save McSkidy - Advent of Cyber 2025

xhetic

xhetic

@xhetic

TryHackMeAdventOfCyberCyberChef
Day 17: Hoperation Save McSkidy - Advent of Cyber 2025

📚 Esta publicación pertenece a las colecciones:

Day 17: Hoperation Save McSkidy - Advent of Cyber 2025

Este writeup pertenece al evento Advent of Cyber 2025 de TryHackMe. Si quieres seguir toda la serie, consulta nuestra colección completa del Advent of Cyber 2025.

La situación es crítica. McSkidy ha sido capturada y encerrada en la fortaleza cuántica de King Malhare. Sin embargo, ha logrado filtrar información vital sobre los mecanismos de seguridad que la retienen. Para rescatarla, debemos atravesar cinco puertas de seguridad, cada una custodiada por un guardia y protegida por un acertijo lógico.

Hoy, nuestra mejor aliada será CyberChef, la "navaja suiza" para el análisis y transformación de datos.

Room: CyberChef - Hoperation Save McSkidy
Dificultad: Medium


🚪 1. Outer Gate: La Barrera del Idioma

Nuestra primera parada es la puerta exterior. Nos encontramos con un formulario de acceso y un chat con el guardia, pero la comunicación no fluye: el guardia nos habla en lo que parece ser Base64.

Nivel 1 Outer Gate

Su saludo, QWxsIGhhaWwgS2luZyBNYWxoYXJlIQ==, se traduce rápidamente a "All hail King Malhare!".

Para avanzar, necesitamos ser observadores. Inspeccionando el tráfico de red en las herramientas de desarrollador, descubro una cabecera HTTP curiosa en la petición del nivel: X-Magic-Question: What is the password for this level?.

Si intento preguntárselo directamente en inglés, me ignora. La clave está en hablar su "idioma". Codifico la pregunta a Base64 (V2hhdCBpcyB0aGUgcGFzc3dvcmQgZm9yIHRoaXMgbGV2ZWw/) y se la envío.

¡Funciona! Me responde con la contraseña codificada: SGVyZSBpcyB0aGUgcGFzc3dvcmQ6IFNXRnRjMjltYkhWbVpuaz0=.

Tras limpiar el mensaje, obtengo la contraseña en texto plano: "Iamsofluffy".

Sin embargo, el login falla. ¿Por qué? Una revisión rápida al código app.js revela una lógica de validación asimétrica:

// User login logic
userOk = atob(usr) === guardName;
// Password login logic (Level 1)
passOk = btoa(pwd) === expectedConst;

El sistema espera que el usuario se envíe codificado en Base64, pero la contraseña se procesa tal cual.

  • Usuario: CottonTail -> Q290dG9uVGFpbA==
  • Contraseña: SGVyZSBpcyB0aGUgcGFzc3dvcmQ6IFNXRnRjMjltYkhWbVpuaz0= -> Iamsofluffy

Con la puerta abierta, podemos responder a la primera pregunta:

Pregunta: What is the password for the first lock?

Respuesta: CottonTail


🧱 2. Outer Wall: Doble o Nada

La segunda puerta sigue un patrón similar, custodiada por "CarrotHelm".

Esta vez, la cabecera oculta nos dice: X-Magic-Question: Did you change the password?.

Nivel 2 Outer Wall

Repetimos la estrategia: codificamos la pregunta y se la lanzamos al guardia. La respuesta que obtenemos parece una muñeca rusa de codificaciones, una tras otra.

Al decodificarla una vez, obtenemos otra cadena en Base64.

Aquí es donde CyberChef empieza a brillar. En lugar de decodificar manualmente paso a paso, podemos encadenar operaciones.

La lógica del script para este nivel confirma mis sospechas:

// Level 2
passOk = btoa(btoa(pwd)) === expectedConst;

La contraseña ha sido codificada dos veces en Base64. Al invertir el proceso, revelamos el secreto: "Itoldyoutochangeit!".

Ya podemos responder a la siguiente pregunta:

Pregunta: What is the password for the second lock?

Respuesta: Itoldyoutochangeit!


🏠 3. Guard House: La Clave XOR

En la casa de la guardia, "LongEars" nos espera.

La cabecera HTTP cambia y ahora nos da una pista más técnica: X-Recipe-Key: cyberchef.

Nivel 3 Guard House

Le pido la contraseña amablemente (en su idioma Base64, por supuesto) y recibo una cadena de bytes sin sentido aparente. El código fuente nos aclara el panorama:

// Level 3
const bytes = xorWithKey(toBytes(pwd), toBytes(recipeKey));

No es una simple codificación, es una operación XOR usando la clave "cyberchef".

Para obtener la contraseña original, configuro una receta en CyberChef:

  1. From Base64: Para convertir la respuesta del guardia a bytes.
  2. XOR: Usando la clave cyberchef (UTF-8) para revertir la operación.

Receta CyberChef XOR

La contraseña aparece limpia y clara.

Tras abrir la puerta con la contraseña obtenida, podemos responder a la pregunta:

Pregunta: What is the password for the third lock?

Respuesta: BugsBunny


🏰 4. Inner Castle: Rompiendo el Hash

Nos acercamos al corazón de la fortaleza. Tras preguntarle al guardia "Lenny" la contraseña, nos entrega lo que parece ser la contraseña, pero tiene un formato muy reconocible: b4c0be7d7e97ab74c13091b76825cf39.

Nivel 4 Inner Castle

El código confirma que estamos ante un hash MD5:

// Level 4
passOk = (md5(pwd) === expectedConst);

A diferencia de Base64 o XOR, un hash es una función unidireccional; no se puede "decodificar". La única forma de encontrar el texto original es mediante fuerza bruta o usando tablas precalculadas (Rainbow Tables).

Recurro a CrackStation, una base de datos masiva de hashes conocidos. Al introducir el hash, la respuesta es instantánea.

CrackStation MD5
Click para ver imagen

Ya podemos abrir la puerta y responder a la pregunta:

Pregunta: What is the password for the fourth lock?

Respuesta: passw0rd1


🗼 5. Prison Tower: La Receta Final

La última puerta antes de llegar a McSkidy. El guardia "Carl" nos da la contraseña final codificada: ZTN4cDB5T3VwNDNlT2UxNQ==.

Las cabeceras nos dan las instrucciones exactas para resolver este puzzle:

  • X-Recipe-ID: R1
  • X-Recipe-Key: cyberchef

Analizando el switch en el código app.js para el caso R1:

case "R1":
  // CyberChef: From Base64 => Reverse => ROT13
  tp = btoa(reverse(rot13(tp)));
  break;

El sistema aplica: ROT13 -> Reverse -> Base64. Para obtener la contraseña original, debemos aplicar la ingeniería inversa a estos pasos en CyberChef:

  1. From Base64: Decodificamos la cadena inicial.
  2. Reverse: Invertimos el orden de los caracteres.
  3. ROT13: Rotamos los caracteres 13 posiciones (ROT13 es su propio inverso).

Receta Nivel 5

La receta mágica nos revela la llave final, y con ello, podemos responder a la pregunta:

Pregunta: What is the password for the fifth lock?

Respuesta: 51rBr34chBl0ck3r

¡Lo logramos! Hemos superado las cinco barreras de seguridad y asegurado la ruta de escape para McSkidy.

La room nos muestra la flag final:

Flag Final
Click para ver imagen

🏁 Conclusión

Este reto ha sido un excelente ejercicio para entender cómo los datos pueden ser transformados, ofuscados y hasheados.

Herramientas como CyberChef son indispensables para cualquier analista de seguridad que necesite "hablar el idioma" de los datos.

Si te perdiste el análisis forense del registro de ayer, echa un vistazo al Día 16: Registry Furensics.

Recuerda que puedes seguir toda la serie de retos en nuestra colección completa del Advent of Cyber 2025.

¡Nos vemos mañana para más hacking navideño! 🎄

~ Xhetic