Se trata de un script que abre un servicio en un host. Para resolver el reto se proporciona el código del mismo; por lo tanto es posible su ejecución en local y hacer pruebas cuando uno quiera :) Más que crypto, esto consiste en entender el código del servidor.


Básicamente se trata de un programa que carga el contenido de un archivo llamado "flag". El objetivo es hacer que el script nos lo transmita, pero para llegar a ese punto (línea 53) se hacen primero dos checks (líneas 39 y 50). Si el flujo de ejecución entra en alguno de los dos "if"s, escupe un mensaje y se acabó la fiesta. Por lo tanto, esos son los dos puntos a bypassear. El script que soluciona el reto es éste.

 

  • Para resolver el primer check, el servidor devuelve 5 números en hexadecimal. Mirando el código se deduce que hay que bruteforcear "algo" cuyos primeros 5 valores de su hash MD5 resulten iguales al número recibido. Antes de optar por /dev/urandom, es mucho más eficiente (por rapidez y por no gastar entropía del sistema) calcular los hashes de 0, de 1, de 2...hasta encontrar uno cuyos primeros 5 bytes coincidan. No debería llevar más de 5 o 10 segundos en un portátil normalillo. En mi solución, estas operaciones se hacen con el while de la línea 19.

 

Como el número que proporciona el servidor es aleatorio y diferente en cada ejecución, NO se debe cerrar el socket. En caso de cerrarlo, habría que volver a hacer el procesado con otro número distinto. Este tipo de checks son habituales para evitar que la gente bruteforcee mediante red, la verdadera chicha (hay que hacer fuerza bruta pero en local, y mandar un único paquete con la solución).

 

  • El segundo check trata de entender lo que hace la función "learn_with_vibrations()", línea 17. Devuelve 40 filas de 7 valores octales. Mirando el código fuente del servidor, se comprueba que el último valor de cada fila es la suma del producto de cada uno de los primeros 6 valores con otros 6 valores "constantes" y aleatorios (array "solution", constante en cada ejecución para todas las filas). Todas las operaciones hechas en módulo 8. Y además, cada último valor se altera sumándole aleatoriamente uno de los valores siguientes [-1, 0, 1] (la vibración se modela de esa forma). El cliente debe devolver entonces el array de 6 valores "solution" correcto, deducido de las 40 ecuaciones. Un problema de ecuaciones lineales en módulo 8, sin más. Iterando con el for de la línea 33 se bruteforcean los 6 valores que satisfacen las 40 soluciones.

 

Flag:
INS{ErrorsOccurMistakesAreMade}

 

Besicos.