¿Quién te choco? Hackeando Patentes

Iniciado por Muppet, Febrero 06, 2015, 01:27:07 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Febrero 06, 2015, 01:27:07 AM Ultima modificación: Febrero 06, 2015, 05:52:30 PM por Expermicid
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
by hdbreaker


Hace algún tiempo tuve la mala fortuna de estar envuelto en un accidente de trafico algo grave, donde yo por viajar en moto, me lleve la peor parte. Totalmente en contra a lo que esperaba, el responsable del accidente no se detuvo a asistirme, por su parte prefirió darse a la fuga.

Luego de todos los protocolos médicos, unos cuantos moretones y tras no encontrar respuestas en la policía por falta de testigos, decidí comenzar una búsqueda personal de identificación del vehículo con el único dato que había logrado divisar en el golpe.
###su numero de patente###

Por cuestiones de confidencialidad no utilizare la patente real del agresor sino una que alcance a leer en el registro del automotor mientras realizaba los tramites del seguro.


¿La pregunta?

Existe algún sistema que me permita consultar los datos y el estado de un vehículo que transita en la calle actualmente? La respuesta es si!


Luego de algunas consultas a google, logre dar con un servicio de Rentas en la provincia de Buenos Aires que nos permite consultar el estado de deuda de patentes de un vehículo.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


El mismo tiene dos formas de funcionar, si no eres el propietario solamente puedes obtener los datos correspondiente a deudas sobre el automóvil pero el sistema no te permite acceder a las secciones que identifica a la persona registrada en el Registro del Automotor como titular del vehículo.


Por otro lado, para comprobar la titularidad del vehículo, el sistema solicita ingresar un numero de verificación especial único que solo el dueño del automóvil debe poseer, ya que el mismo sirve para imprimir boletas de pago de deudas que incluyen los datos personales del propietario del automotor, de esta forma garantiza la privacidad de los datos de los usuarios.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Lo primero que podemos analizar en el sitio, es que el dígito especial y verificador del sistema, solo acepta valores que van desde 00 a 99 (el valor no es tan único como uno cree)


En fin, la patente a estudiar en esta entrada sera JMO089, luego de realizar algunas pruebas manuales podemos apreciar que el captcha del sistema nunca es actualizado una vez que nos encontramos asociado a una sesión, permitiéndonos probar de forma manual las 99 combinaciones posibles hasta dar con la correcta.



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


En la imagen podemos apreciar que el captcha no cambia a medida que vamos probando posibles combinaciones numéricas hasta lograr dar con el correcto, por lo que da la posibilidad de programar un Brute Forcer que valla probando todos los valores posibles hasta dar con el indicado. Pero un ataque así representa un problema al tener que enfrentarnos con un captcha, cosa que no estaba dispuesto por una falta de tiempo para programar un No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

La pregunta que me formule fue:

Cual es la forma en que el sistema valida el valor correcto del dígito verificador?

Lo primero que pensé es que el sistema validaba el valor del lado del servidor luego de la consulta, por lo que me puse a comprobar las peticiones que realizaba el sitio al momento de enviar el formulario. Para esto utilice Live HTTP headers


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Al encontrarme con esto, no podía creer lo que estaba viendo, técnicamente hablando si una validación no presenta una petición web hacia el Backend, quiere decir que la validación se esta realizado del lado del cliente osea:

EL SISTEMA VALIDA POR JAVASCRIPT!

Esto implica que el algoritmo de validación del código verificador se encuentra servido en algún archivo javascript del lado del navegador, por lo que me puse a analizar el source html del documento para lograr identificar algún indicio de la validación. Lo primero que analice fueron los siguientes archivos:



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Dentro del archivo consultaDatos.js encontré la siguiente función con un nombre revelador: validaDatos


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
if (!check.checked && patente.valido(dom1) != true)

En la misma función se puede apreciar  en las lineas remarcadas la estructura donde se decide el mensaje de patente valida cumpliendo los requisitos de que el checkbox se encuentre marcado y el resultado de la función patente.valido() sea el necesario para resolver de forma correcta la estructura de decisión if().


El problema resulto que la función patente.valido() no se encontraba dentro del mismo documento, por lo que debía encontrar el fichero donde se encontraba la misma.

Para lo que no conozcan el funcionamiento de javascript, les aclaro que los ficheros js representan un gran código estructurado dividido en distintos archivos para mejorar su organización, pero siempre que estos archivos sean incluidos en el html los mismos pueden realizar llamadas a las funciones definidas entre ellos como si todos fueran miembros de la misma clase.


Luego de buscar un poco, llegue al siguiente archivo:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Dentro del mismo podemos obtener la estructura del código validador:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Función Completa: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Luego de analizar detenida mente el código pude develar el comportamiento final del mismo.

El código calcula el dígito verificador en base a la patente del vehículo, sustituyendo las letras por números especiales para formar una cadena decimal, que luego suma según su indice, pares por un lado e impares por otro, como si de un array se tratase.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Luego si estos valores separados (digi1 y digi2) tienen un largo superior a un dígito (0 a 9), vuelve a sumarlos respectivamente hasta obtener 2 números de forma independiente con un largo de un dígito (0 a 9).


Y luego los concatena para obtener el numero mágico verificador:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Lo que resulta algo cómico es que esta función no tiene ninguna protección, y puede ser llamada desde la consola de desarrollo de Google Chrome o Firefox:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Con este numero verificador podemos realizar la consulta de forma exitosa:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Al momento de solicitar una factura podemos apreciar los datos personales como el nombre del titular registrado y la dirección residencial del mismo:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Realizando un poco de ingienería inversa desarrolle el siguientes scripts que permiten calcular cualquier dígito verificador solo con el numero de patente:
(Próximamente estaré agregando su versión en Python desarrollada por [Q]3rv[0]):

Ruby:


Código: php

require 'colorize' #by hdbreaker

class Calculate

  def initialize()
    #inicializo array asociativo de clase
    @letrasValidas ={'A' => '14','B' => '01','C' => '00','D' => '16','E' => '05','F' => '20','G' => '19',
                     'H' => '09','I' => '24','J' => '07','K' => '21','L' => '08','M' => '04','N' => '13',
                     'O' => '25','P' => '22','Q' => '18','R' => '10','S' => '02','T' => '06','U' => '12',
                     'V' => '23','W' => '11','X' => '03','Y' => '15','Z' => '17',' ' => '60',};
  end

  #Funcion para calcular el numero de patente
  def calculate(patente)
    patAux = patente.upcase;
    pares = 0;
    impares = 0;

    #Bloque para sustituir las letras por los numeros correspondisntes
    @letrasValidas.each { |key|
      if(patAux.include? key[0])
        patAux = patAux.gsub(key[0], key[1]);
      end
    }

    #Sumo los imares por un lado y los pares por el otro
    for x in (0...patAux.length)
      if (x % 2 == 0)
        pares += patAux[x].to_i;
      else
        impares += patAux[x].to_i;
      end
    end

    #Si la sumatoria de los pares da un numero mayor a 1 digito, los sumo nuevamente hasta obtener 1 digito
    digi1 =pares.to_s;
    while (digi1.length > 1)
      pares = 0;
      for x in (0...digi1.length)
        pares += digi1[x].to_i;
      end
      digi1 = pares.to_s;
    end

    #Si la sumatoria de los impares da un numero mayor a 1 digito, los sumo nuevamente hasta obtener 1 digito
    digi2 =impares.to_s;
    while (digi2.length > 1)
      impares = 0;
      for x in (0...digi2.length)
        impares += digi2[x].to_i;
      end
      digi2 = impares.to_s;
    end

    ###############Salida en Pantalla###############
    puts "\n############## Rentas Ciudad de Buenos Aires ##############".green
    puts "URL: ".green+"https://lbserver02.agip.gob.ar/ConsultaPat/index.html".red
    puts "Dominio: ".green+patente.red
    puts "Verificador: ".green+digi1.red+""+digi2.red
    puts "\n"
  end
end

if(ARGV.length==1)
  obj = Calculate.new()
  obj.calculate(ARGV[0].to_s)
else
  puts "Usage: ruby calculate.rb [patente]"
end



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Espero que esta entrega sirva para concientizar sobre la seguridad de nuestros datos personales, ya que recordemos que el fallo se encuentra en una red gubernamental que expone de forma descarada los datos personales de las personas.

Y si eres conductor... no vallas por la calle creyéndote intocable, nunca sabes con quien te puedes cruzar ni para que pueda utilizar tus datos, tal vez te encuentres con una persona que en vez de reportar el fallo utilice tu información para encontrarte, ir hacia tu casa y romperte las piernas.

Saludos!

Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".

Interesante aporte, buscaba algo asi y no lo pude encontrar !!

Muy interesante, la verdad lo leere cuando tenga tiempo. Eres de las personas que mas valoro sus aportes en esta comunidad me gusta sobre todo  a parte de la presentación que su contenido es atractivo me quito el sombrero antes usted.
Un saludo!
Lo que sabemos es una gota de agua; lo que ignoramos es el océano.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy interesante, la verdad lo leere cuando tenga tiempo. Eres de las personas que mas valoro sus aportes en esta comunidad me gusta sobre todo  a parte de la presentación que su contenido es atractivo me quito el sombrero antes usted.
Un saludo!

Muchas gracias! y gracias a todos los lectores q valoran el trabajo de un researcher, da gusto compartir información y estudiar nuevas vulnerabilidades o simplemente curiosidades cuando los lectores agradecen, comparten o simplemente dan su opinion al respecto, creo q una comunidad esta para eso, para que entre todos podamos obtener una vista mucho mas objetiva y profesional sobre un fallo! Te invito pases a mi blog!

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".

Madre mía, menuda ñapa hacer eso desde el lado del cliente... jajajaja. Enorme la idea de automatizarlo, HD!
Contacto: @migueljimeno96 -

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Madre mía, menuda ñapa hacer eso desde el lado del cliente... jajajaja. Enorme la idea de automatizarlo, HD!
En el blog esta el codigo en Python tambien!

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".

Terrible post! Es increíble todo, desde encontrar la vulnerabilidad, explotarla y encima automatizarla!  ;D
Sin duda fue un excelente trabajo!

Tremendo post!!!! Felicidades muy buen aporte, aca en mexico es diferente ya que para consultar necesitas el numero de matricula mas aparte los ultimos tres digitos(dependiendo de la ciudad) de el numero de tarjeta de circulacion del vehiculo estos numeros son unicos y no se de que manera se calcula un numero de circulacion, pero felicidades me gusto bastante.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Estos posts en forma de relato son cojonudos. Me pregunto qué otros sitios institucionales de allí tienen la misma implementación...

Kudos hdbreaker

Esto está muy bueno! Peeero me genera este error

/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- colorize (LoadError)
   from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
   from funca.rb:1:in `<main>'


Alguna idea???? saludos y muchas gracias!

pd; le saqué la primer línea del código y me genera entonces este error
funca.rb:56:in `calculate': undefined method `green' for "\n############## Rentas Ciudad de Buenos Aires ##############":String (NoMethodError)
   from funca.rb:66:in `<main>'

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Esto está muy bueno! Peeero me genera este error

/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- colorize (LoadError)
   from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
   from funca.rb:1:in `<main>'


Alguna idea???? saludos y muchas gracias!

pd; le saqué la primer línea del código y me genera entonces este error
funca.rb:56:in `calculate': undefined method `green' for "\n############## Rentas Ciudad de Buenos Aires ##############":String (NoMethodError)
   from funca.rb:66:in `<main>'

Huep! Sorry por la respuesta, no ando muchos por estos pagos, el problema lo tienes porq te falta la gema colorize, prueba:

sudo gem install colorize

y cuando termine la instalación, vuelve a ejecutar el código. Saludos!

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".

Excelente nota.

Muy didáctica, muy bien explicada.

Estimado, le solicito permiso para desarrollarla como ejemplo, con fuente, por supuesto, en mis clases de capacitación.

Pienso que puede servir especialmente para motivar a que las personas aprendan la importancia de entender Javascript, Ruby y las herramientas de desarrollo del navegador, de una forma amena y divertida.
Pancutan
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Excelente nota.

Muy didáctica, muy bien explicada.

Estimado, le solicito permiso para desarrollarla como ejemplo, con fuente, por supuesto, en mis clases de capacitación.

Pienso que puede servir especialmente para motivar a que las personas aprendan la importancia de entender Javascript, Ruby y las herramientas de desarrollo del navegador, de una forma amena y divertida.

Si karancho, no tengo problema, un gusto que compartas mis estudios, pensamiento distribuido y open source es lo que le falta al mundo.

PD: Eres karancho de Lugmen Mendoza? de ser así hemos compartido mesa en algun momento de la vida, saludos!

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".

Un excelente aporte. sigue asi y muchos exitos...!

Excelente post!!!  además bien explicado y detallado

Enviado desde mi GT-I9300 mediante Tapatalk


la unica palabra que puedo decir esto es "IMPRESIONANTE" y la duda que tengo es
para que usaste sus datos personales? tiene las piernas rotas?

Junio 11, 2016, 04:13:07 PM #16 Ultima modificación: Junio 11, 2016, 05:36:12 PM por jona872
Genial! mas allá del (conocimiento + ganas de compartir), el enfoque de fallo de vulnerabilidad que le das, cuando comúnmente esta todo plagado de "vamos a hachear y romper todo" (que es lo que busca la mayoría de la gente).


Slds!

sinceramente, muy buen aporte, aunque soy un novato todavía (y siempre lo seré  ;D) me atrapo la forma de explicar que tienes la facilidad con la que me ayudo a entender lo que hiciste es increíble... muy buen aporte gracias por compartirlo :D ;D

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
sinceramente, muy buen aporte, aunque soy un novato todavía (y siempre lo seré  ;D) me atrapo la forma de explicar que tienes la facilidad con la que me ayudo a entender lo que hiciste es increíble... muy buen aporte gracias por compartirlo :D ;D

No te tires para abajo, todos empezamos siendo novatos!

grandioso es leer estos aporte por parte de usted , saludos
maneje con cuidado