By @f99942
Descripcion:
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
Post a Comment