HackIt 2024 / EE32 / Level 3 (II/II)

W3irDCrypT0, indeed.

Este level nos trajo por la calle de la amargura. Conseguimos pasar 4 niveles por encima de este pero aquí nos atascamos más allá del cierre del HackIt. No fuimos los únicos, como ya dije.

Pero quisimos solucionarlo y aprender por el camino, llegando al script final que acompaña a este post. Básicamente el servidor espera comandos cifrados (como «HELP ME PLEASE») tomando como clave la IP del cliente (suma de bytes). Así:

HELP ME PLEASE = 48 45 4c 50 20 4d 45 20 50 4c 45 41 53 45
IP CLIENTE = 207.188.163.1 = 0xcfbca301 (cada octeto a hex, concatenado)
MENSAJE = \xab\xab\xae\xb3\x81\x80uQ\xb3\xb2\xa7\xa4\xb4x

Por ejemplo, para la primera letra (‘H’), sería así:

hex(0x48 + ord(‘c’)) = ‘0xab’

Con respecto a la respuesta que envía el servidor al comando HELP ME PLEASE, podemos descifrarla de forma equivalente, pero esta vez la clave será la IP del servidor:

Mensaje cifrado: add2a451939f9d93cfc7a0a4509499a5d1d29f9a929c95a581d6a09f6a508073b4b6888082745082ada87284755c5074baa80a
IP del servidor: 172.17.0.2 (la IP de ikasten.io es 95.216.157.127, pero se está ejecutando sobre un container docker) = 0xac110002
Texto en claro: Los comandos disponibles son: PASSWORD PLEASE, BYE

De nuevo, un ejemplo: la L de ‘Los’ se obtiene así:
chr(0xad – ord(‘a’)) = ‘L’

Si enviamos ahora el comando PASSWORD PLEASE, obtendremos la clave esperada.

Addendum: habíamos llegado a la conclusión de que la clave a usar para cifrar tenía que ver con la IP del cliente y para descifrar con la IP del server. ¿Cómo? Porque compartimos un script de cifraba el «HELP ME PLEASE» y lo enviaba al server… y sólo funcionaba en uno de los ordenadores del equipo. Así que el cifrado dependía del cliente… y la pista indicaba que también del servidor. En su momento habíamos pensado en un XOR (para cifrar, funciona igual que la suma de bytes), pero no probamos la combinación ganadora: pasar los octetos de la IP a hexa, concatenar y usar esa clave como string, caracter a caracter (no como el valor hexa de 0xa =10, sino como ord(‘a’)) = 97 🤷‍♂️)

¡Ah! El script que soluciona el reto:
https://gist.github.com/juananpe/d98d4f5223c7c4b3341ca4962e1160fc

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.