Hacking de Parkings
Articulo dedicado a la seguridad de los sistemas de pago de los parkings con códigos de barras.
Introducción
Hace tiempo me aficioné a ir a unos cines de un centro comercial que quedaban bastante lejos de mi casa, a unos 50 minutos en coche exactamente, solía ir con amigos a ver películas o simplemente aparcar ya que era medianamente accesible. El tema es que como muchos parking, era CARO, CARO de narices.
Y cuando hay una necesidad, surje el aburrimiento, y con él las ideas…
Tormenta de ideas
El sistema de parking es típico, llegas, una cámara identifica la matrícula de tu coche y se añade al sistema informático para empezar a cobrarte por el tiempo que tu vehículo esté aparcado allí.
El parking ofrece inicialmente dos horas gratis, lo típico, para que la gente vaya a comprar al supermercado y resto de grandes superficies del centro comercial. Y además, si vas al cine, te dan un descuento de una hora para el parking, hasta aquí bien. Es decir, si vamos al cine tenemos un total de 3 horas gratis de parking.
¿Pero y si no hiciese falta ir al cine para tener ese descuento? ¿Y si pudiesen acumularse? ¿Siguen los descuentos algún tipo de patrón? ¿Son nominales o genéricos?
Investigación
Lo primero que hice fue ir al cine, si, es en serio, hay que conseguir al menos dos descuentos, y muy importante, si es posible que sean consecutivos, ya que eso nos va a permitir encontrar patrones en códigos de barras, identificadores y demás posibles atributos a investigar. En este caso de la fotografía no son consecutivos, pero se sigue intuyendo bien.
Análisis de los descuentos
Como se puede ver tenemos varios valores a simple vista:
- Valor del descuento: 1 hora
- Identidad: Anónimo
- Nº de descuento
- Fecha de caducidad
Pero lo importante de verdad, es el código de barras, escaneandolo con una aplicación móvil podemos saber que tipo es, y que contiene exactamente.
Se pueden llegar a intuir los siguientes campos:
- 5 = prefijo fijo de 1 dígito
- 600200 = bloque fijo (o eso parece)
- NNNNN = contador / bloque variable de 5 dígitos
- DDDD = días desde 01/01/2008
- 0000 = padding fijo final
Por tanto la estrctura el código queda así: [5][600200][NNNNN][DDDD][0000]
Ahora ya sabemos como se generan los códigos, siguen un patrón fijo y son genéricos. Con un simple html y js he creado un generador de códigos de descuento para probar con unos pocos clicks.
El generador se basa en una relación lineal entre la fecha de caducidad y el bloque variable del código. Primero convierte la fecha en el número de días transcurridos desde el 01/01/2008; después aplica una fórmula 25.181818 descuentos × día + 19875433.91, redondea el resultado y se queda únicamente con sus últimos cinco dígitos.
Esos cinco dígitos forman el campo variable NNNNN, mientras que el bloque de fecha se introduce directamente como DDDD. Por tanto, el código final se genera a partir de una estructura predecible:
5 + 600200 + NNNNN + DDDD + 0000
Puedes abrir y usar el generador AQUÍ.
I+D+I
Lo primero que hice fue probarlo y no es una ciencia exacta, esto es porque la formula matemática intuye que siempre se usan unos 25 descuentos del cine al día, pero pueden ser muchos más o menos dependiendo de la fecha en la que estemos, cartelera y otros factores.
Por tanto el código generado no siempre es válido, hay que jugar un poco con el generador, números arriba - números abajo. Otra cosa a tener en cuenta es que al “predecir” descuentos, es posible que se lo estemos quitando a alguien que todavía no lo haya usado.
La otra verdadera pena es que no son acumulables, por lo que si aplicas un descuento válido y luego otro, te saldrá un mensaje indicando que ya se ha usado un descuento. Queda probar que pasa si en dos maquinas diferentes se aplican dos descuentos válidos a la vez, concurrencia, paralelismo, esas cosillas…
Conclusiones
Los códigos de barras son super-inseguros y los fallos no se hacen esperar, quizá no es la gran cosa, pero ahora puedo ahorrarme 1 hora de parking en el centro comercial, vaya al cine o no ;)