Mi número de identificación, mi contraseña

¿Quiénes de ustedes creen que es buena idea tener como contraseña su número de identificación (en otros países es el equivalente a Cédula de ciudadanía, DNI, ID, número de identificación, etc)? Bien, pues para aquellos que creen que es una gran contraseña, emprenderemos una trepidante aventura, con un laboratorio sencillo para demostrar que no lo es.

Antes que nada, veamos cuáles podrían ser los motivos por los cuáles alguien podría usar su número de identificación como contraseña:

  • Longitud: En Colombia, los números de identificación oscilan entre 8 y 10 caracteres y 8 son el mínimo exigido por muchos sistemas.
  • Fácil de recordar: Es nuestro número de identificación y lo necesitamos para casi todo, no nos podríamos olvidar de este dato tan fácilmente.
  • Personal: Sólo nosotros mismos nos sabemos este número, nadie va a andar por la vida aprendiéndose el número de identificación ajeno ¿O sí?
  • Sistemas laxos: Aunque me da la impresión que cada vez es menos frecuente, aún hay sistemas que no son estrictos con las políticas de asignación de contraseñas.

Consideraciones antes empezar

  • Habrá un par de elementos un poco técnicos, pero, para los no técnicos, por favor no pierdan el foco de lo que vamos a hacer: comprobar que no se debe usar el documento de identificación como contraseña.
  • Lo más común es que los números de identificación (por lo menos en Colombia), estén entre 10.000.000 y 1.111.111.111, sin embargo, por ser sólo una prueba de concepto, acortaremos el rango de documentos entre 40.000.000 y 89.000.000.
  • No vamos a escribir uno por uno cada documento (son 50.000.000 en el rango que elegimos), he creado un pequeño script en python que facilita el trabajo, basta con correr python3 dict.py > dict.txt para que el listado quede guardado en un archivo de texto llamado dict.txt, que a partir de ahora, nos referiremos como “diccionario”.

    #!/usr/bin/python3

    def dictionary():

       start = 40000000
       end = 90000000

       for i in range(start,end):
               print (i)


    if __name__ == "__main__":
       dictionary()

Armando el laboratorio

Para nuestro objetivo, he utilizado un router casero, como el que todos tenemos en casa, he configurado una red WiFi llamada “computadoresycafe” (Ja!, seguro no se esperaban ese nombre) y como contraseña elegí un número al azar dentro del diccionario, la seguridad será WPA2-PSK, que, es el común denominador en la mayoría de redes inalámbricas domésticas y algunas corporativas.

Script de python en una línea para elegir un número aleatorio en el rango seleccionado.
Configuración de red. Clave censurada porque vamos a adivinarla.
Red wifi configurada y lista para ser atacada.

Ahora bien. no describiré todo el proceso, ni mostraré el paso a paso, como es costumbre acá, siento que estaría empujando a alguien a hacer cualquier tontería y no quiero sentirme responsable por tonterías, más que por las mías y en la bastedad de internet realmente hay un montón de tutoriales que describen todo paso a paso. Sin embargo resumiré los pasos que se llevan a cabo y el resultado final.

Identificar nuestro objetivo

Es lo primero que necesitaremos, debemos identificar cuál será la red inalámbrica que utilizaremos para nuestro cometido, adicional necesitaremos la MAC del dispositivo, pero nada de nervios, no necesitamos acceder a ninguna arte oscura para obtenerlo, el programa que se utiliza para estas cosas hace todo por uno.

Monitorear

Bien, ahora sólo debemos monitorear qué sucede en la red que estamos atacando, básicamente necesitamos que alguien se conecte a esta, ¿por qué? fácil, cuando alguien se conecta a una red wifi, la contraseña viaja “por el aire” entre un dispositivo conectado y el router, el router valida que la contraseña sea correcta y ahí permite la conexión, a todo este proceso se le llama handshake.

Como ya se dijo, se debe esperar pacientemente a que alguien se conecte a la red en específico, o se puede forzar una desconexión entre alguien que ya lo esté, para que se tenga que reconectar, da igual el método, lo importante es obtener el dichoso handshake.

Se podría pensar que la contraseña se podría obtener si capturamos los paquetes que “viajan por el aire”, sin embargo esta va cifrada, por lo cual nos vamos al siguiente punto.

Ataque de diccionario

Este es el paso final, a grandes rasgos y de manera muy amplia, lo que debemos es comparar las 50.000.000 líneas que contiene nuestro diccionario, cifrarlo como se cifraría el handshake y compararlo con el que se capturó. Por supuesto, todo esto es automatizado, no tenemos que preocuparnos por nada, más que por escribir una línea de comando y esperar pacientemente.

Como podemos ver, este proceso tardará alrededor de unas 3 horas, entonces, mientras esto se ejecuta, vamos por un café…

Y después después de transcurrido un tiempo, logramos encontrar la contraseña de la red inalámbrica

La cual, por supuesto coincide con la contraseña configurada en nuestro router y podemos conectarnos a dicha red.

Preguntas que (espero) puedan surgir a partir de esto:

  • ¿Sólo me veo afectado si uso ese rango de números?
    RTA:
    No, esta prueba de concepto aplica para cualquier rango de números y de cualquier longitud.
  • ¿Es grave que un desconocido se conecte a mi red inalámbrica sin autorización?
    RTA:
    Sí, si alguien mal intencionado se conecta a una red inalámbrica puede ejecutar muchos otros ataques que pueden poner en riesgo la seguridad y la privacidad de una red.
  • Si agrego letras o símbolos a mi contraseña ¿estaré protegido?
    RTA:
    Parcialmente, una contraseña robusta puede dificultar este tipo de ataques, sin embargo, la premisa es que no hay un sistemas completamente seguro.
  • ¿Este ataque sólo aplica para redes inalámbricas?
    RTA:
    No, esto es sólo un ejemplo, usar números como contraseña hace vulnerables correos electrónicos, contraseñas de sitios web, redes sociales y demás.

Cierre

Espero que esta entrada haya sido de utilidad y de reflexión acerca de las contraseñas que utilizan en su día a día. ¿les surge alguna otra pregunta después de ver esto? ¿tienen algún otro motivo por el cuál usarían su número de identificación como contraseña? los invito a dejarlo en los comentarios y si quieren, ya saben que pueden invitarme a un café.

Inyección SQL

Una inyección SQL o en inglés SQL Injection es una de las vulnerabiliades web más explotadas según el top 10 de OWASP la cual consiste en manipular una sentencia SQL legítima aprovechando alguna vulnerabilidad o incorrecta validación de consultas para ejecutar otro tipo de comandos sobre la base de datos, por ejemplo, modificar su contenido, borrarla completamente o acceder a datos sensibles como usuarios, contraseñas y números de tarjetas de crédito, incluso ejecutar comandos sobre el sistema operativo, lo que la convierte en una técnica con un nivel de criticidad bastante alto.

Aunque se podría llegar a pensar que se necesitan altos conocimientos de lenguaje SQL, en la actualidad herramientas como sqlmap permiten realizar ataques automatizados con conocimientos mínimos.

Con esta pequeña información nos veremos en próximas entradas, donde estudiaremos en un laboratorio práctico y controlado, cómo se realizan este tipo de ataques y cómo se pueden mitigar.

¿Qué es YAML?

YAML es un lenguaje de marcado de documentos relativamente joven, creado en 2011 y que permite organizar y leer los datos contenidos de manera fácil, ya que uno de sus objetivos es tener un estándar amigable y de compresión rápida. Se caracteriza por tener una estructura en árbol e identada con espacios.

A continuación veremos un ejemplo bastante simple de cómo se ve una estructura en YAML:

Sin título
#Así lucen los comenatarios en YAML.

#Esto es una llave, se compone del nombre 
#de la llave y separado con un espacio, su valor.
llave: valor
otrallave: valor

#Esto es un mapa. 
hola_soy_un_mapa:
 #Dentro de los mapas podemos anidar elementos, identados 
 #con un espacio
  llave_identada: valor
  #También se pueden construir mapas dentro de un mapa
  mapa_numero_2:
  #Y podemos agregar secuencias a las llaves
   llave_secuenciada:
    - valor_1
    - valor_2
    - valor_3

Probablemente se preguntarán ¿Para qué sirve esto? Bueno en palabras de Mickey Mouse:

Hasta pronto.