CardReader (Rev 400)

By @f99942

Descripcion:


A un paso de la gloria!!!

Este binario que gracias al reto cegat0n has descargado, permite leer las  
tarjetas de credito almacenadas dentro del Bunker! Sin embargo requiere de las 
credenciales de MySQL que debiste haber obtenido via:  
 
str0ke (username de Ulises Fortress) 
Y password ya sea via DrunkTillDawn o Guardian challenges.

El puerto de MySQL en el Bunker (3.15.187.232) es el 1344, pero esta bloqueado 
por seguridad, pero lo puedes activar ya que conoces la secuencia de puertos 
de este servicio gracias al reto Abonero (port knocker).

Utiliza la herramienta knock para mandar la serie de puertos necesaria. 
En ubuntu la instalas asi:

> sudo apt-get install knockd

Y la ejecutas pasandole la combinacion de puertos en este caso para el  
servicio MySQL: 
 
>knock -d 30 3.15.187.232 <puerto1> <puerto2> ... <puertoN>

NOTA: opcion -d muy importante para evitar problemas de latencia en la red.

Una vez activado el puerto, puedes retirar las tarjetas de credito encriptadas,
y tu tarea es hacerle ingenieria inversa para desencriptarlas y lo mas  
importante obtengas la tarjeta de credito del millonario Ulises Fortress el 
cual conoces su userID gracias al reto str0ke.

La bandera seran los 16 digitos de la tarjeta de credito de Ulises Fortress, 
tal como aparece desencripada.

Traenos esa damn tarjeta o no te pagamos!!



El binario brindado para la resolución de este reto fue compilado en un sistema GNU/Linux de 64bits, ligado dinámicamente y los símbolos no fueron removidos. Esta información puede ser comprobada fácilmente con el comando file sobre el binario.




La ejecución del binario revela los modos de uso. El uso del binario es desconocido, solo se sabe que se conecta a la base de datos que contiene las tarjetas de los usuarios del banco.
Es posible realizar un dump de la información o validar la información de un cuentahabiente con un número secreto asociado a su cuenta.





Al ser accesible únicamente desde la red interna, la opción de dump puede haberse pensado para generar respaldos, mientras que la opción validate podría ser la que permite realizar otras operaciones como transacciones.
Al ejecutar el binario, son necesarias las credenciales de la base de datos de retos anteriores, seguidas del modo de uso. Al emplear el modo dump, se obtiene el siguiente resultado.

 

Aparentemente se trata de base64, sin embargo al intentar realizar la decodificación de base64, se obtiene una salida parecida a la siguiente.



Lo anterior no representa un patrón propio de un tarjeta, ¿o si?
El campo validation key es el requerido para obtener la llave. Del reto srt0ke de criptografía se supo que el ID de Ulises Fortress era el ID 87, esta información permitía enfocarse sobre los campos específicos de la fila 87.



Decompilando el binario con Ghidra, es posible leer los nombres de las funciones, la aplicación nos indica que se trata de base64, o al menos los nombres de las funciones muestran que este es el caso.



Siguiendo el flujo de ejecución a través del decompiler de Ghidra, es posible ver que la opción dump únicamente realiza una consulta a la base de datos, es decir, funciona como una interfaz, pero no realiza ninguna tarea de codificación.





Sin embargo, dentro de la opción validate, se realiza una consulta sobre validation key. Y para realizar esta tarea, se emplea el resultado de la función encode con la verification key brindada por el usuario.




La función encode, parece únicamente realizar un base64 y agregar el carácter de terminación de cadena al final de lo devuelto por la función base64_encode:







La función base64_encode, parece ser una implementación manual de base64, sin embargo al analizar las variables que emplea, es notoria la existencia de una variable llamada encoding_table, la cual tiene el siguiente contenido.



Esta cadena puede ser obtenida a través del comando strings. Si se revisa el RFC de base64, se propone un charset muy diferente al empleado, por lo que podemos definir que para este reto el charset de base64 fue modificado por el siguiente:

"ZYXWVUTSRQPONMLKJIHGFEDCBAabcdefghijklmnopqrstuvwxyz0123456789+/"

Una vez sabiendo esto, es posible escribir un código en Python que realice la solución de manera instantánea, la cual consiste en sustituir el charset por el original en la validation key obtenida del servidor.





Obtenemos la llave de validación asociada a la tarjeta de Ulises Fortress, automatizando el proceso con pwntools, desencriptamos su tarjeta!!!


Comments