Jackp0t (Crypto 400)

By @f99942

Descripcion:

Has llegado al punto final, has encontrado la API que realiza las  
transferencias electronicas, sin embargo requerimos un poco de tus  
conocimientos de criptografía para poder romper este esquema, ya que al 
parecer se requiere un generador de tokens para dicha operacion el cual no se 
tiene físicamente. 
 
Nuestros informantes nos han compartido el archivo lineal.py y aunque a  
nosotros no nos dice nada, tal vez puedas identificar la lógica del número  
esperado para autorizar la transacción.  
En otras palabras, tu tarea será simplemente identificar cual es el numero  
siguiente, y enviarlo como parte de la transacción.

El challenge lo puedes obtener con el comando:

curl -Ns -H 'Content-Type: application/json' -X POST "http://3.15.x.x:1337/Challenge" --data '{"id-tarjeta":<Tarjeta de Ulises Fortress>, "to":<Nombre de tu equipo>, "quantity":<Cantidad a ser transferida>}'

Al parecer la aplicación tiene un sistema de integridad, se generan los números
aleatorios empleando la transacción, ten cuidado de reenviar la misma  
información a /Transaccion adjuntando el parámetro challenge con tu respuesta
al JSON, el challenge es el numero siguiente a la serie recibida.

Ejemplo:
curl -Ns -H 'Content-Type: application/json' -X POST "http://3.15.x.x:1337/Transaccion" --data '{"id-tarjeta":"1337-0000-0000-0000", "to":"DieBartDie", "quantity":"1","challenge":"555057527799"}'



El reto se trata de realizar una transacción bancaria empleando la cuenta de Ulises Fortress sin contar con el generador de tokens. Regularmente un generador de números pseudoaleatorios funciona tomando como semilla un valor desconocido, generado tomando valores del ambiente, o a través de una serie de operaciones que buscan generar la mayor aleatoriedad posible, sin embargo, los tokens bancarios tienen la desventaja de ser deterministas al depender de un valor numérico para generar otro valido.
La aplicación recibe una petición a través del método POST, recibiendo un JSON con campos específicos.
Para la generación de un challenge para la validación de una transacción se realiza con los datos:
  • Id-tarjeta
  • To
  • Quantity

Lo cual implica, la tarjeta desde la cual se realizará la transacción, a quien va dirigido el deposito y la cantidad a transferir.
 



Una vez enviados estos datos al endpoint /Challenge, se recibe una serie numérica. Si se intenta enviar al Endpoint /Challenge información incorrecta se obtendrá un mensaje de error.




Analizando el código fuente brindado junto al reto es posible definir como se realiza el challenge.



De este código se obtiene la información siguiente:
  •  La operación que genera los números aleatorios es (a*x+c)%p, investigando esta operación se sabe que se trata de un generador lineal congruencial.
  • Los datos p, a y c, son generados al instanciar el objeto y son constantes durante toda la existencia del mismo.
  • La generación de p, a y c, se realiza a partir de los valores numéricos de la tarjeta, que son conocidos al tener la tarjeta desde la cual se desea hacer la transacción.
  • Se generan 8 números y solamente estamos recibiendo 7
  • El valor x se genera a partir del generador de números pseudoaleatorios de Python, dentro del rango del valor máximo de p 
Existen diferentes formas de atacar este problema, es posible realizar fuerza bruta para obtener el valor X y ver si existe un patrón entre las diferentes X, o simplemente basta con analizar la ecuación y comprender como se comporta un objeto.




Al realizar la instancia de un objeto, los valores en el mismo se mantienen constantes durante su existencia. Es por eso que next() puede generar un nuevo numero aleatorio encadenado al anterior, al recibir self, que es una referencia a los elementos del mismo objeto.
Teniendo en cuenta esto, podemos saber que X es un valor aleatorio solo la primera vez que es instanciado el objeto, la siguiente iteración, el valor X será el numero anterior generado, por lo que contamos con todos los valores a,x,c y p.



El solver toma el numero de tarjeta desde el cual se realiza la transacción y el ultimo número aleatorio generado para obtener lo que genera el challenge.



Moraleja, comprender programación orientada a objetos es vital. Las implementaciones suelen ser el problema general de la criptografía, a veces tener acceso al código fuente es suficiente para romper cualquier esquema, es necesario como desarrollador, tener en cuenta el principio de Kerckhoff (No importa si el criptosistema es expuesto, eso no debe comprometer la información)

 Se manda la transferencia y ... voila!!!!  $1, 000, 000 USD Transfer accepted!!!






Comments