Crackear WPA de modems Infinitum

Como ejercicio mental estuve pensando en el tiempo y costo que tomaría crackear la contraseña de mi router Infinitum que tiene cifrado WPA en modo PSK y la contraseña viene escrita en 10 caracteres hexadecimales en la etiqueta del aparato. Cabe recordar que antes de 2012 todos venían con cifrado WEP de 40 bits.

Para algunas marcas de estos modems, como Thomson y Huawei, existen herramientas disponibles al público (Router Keygen) que permiten calcular la contraseña sin mayor esfuerzo, esto se debe a que sus contraseñas por defecto vienen derivadas del BSSID (MAC Address del router). También existen otros ataques fáciles de realizar para routers con el protocolo WPS (muchos Infinitum lo traen), una herramienta para esto es reaver.

Para los casos en los que esto no funciona y la única opción es la fuerza bruta nos enfrentamos a dos cosas: (1) tenemos que obtener un handshake entre el modem y un cliente (tablet, laptop, etc.) conectado y (2) tratar de encontrar la clave a través de ese handshake. Para la primera parte se puede hacer un ataque con aircrack. Para la segunda parte vamos a suponer que ya tenemos nuestro handshake propio capturado, que contiene el Pairwise Master Key (PMK), y de donde vamos a recuperar la contraseña WPA original (ver nota final).

Existen dos herramientas principales para hacer lo más rápido posible el cálculo de PMKs, la primera es coWPAtty y la segunda pyrit. La ventaja de pyrit es que funciona sobre tarjetas gráficas (en la página vienen los benchmarks de PMK/segundo por modelo de tarjeta). En Amazon EC2 podemos rentar instancias de GPU y según alguien que ya hizo las pruebas llegó hasta 50,000 PKM/segundo, con un costo de $2.10 dólares por hora. En una hora se pueden calcular un total de 180 millones de PMK (aprox 2^{27.42}).

Si quisiéramos realmente probar todas las claves posibles, que en este caso son 2^{40}, nos tomaría con una sola instancia un total de 6,109 horas a un costo de $12,821 dólares. No quiere decir que nos tardaríamos meses porque este proceso es completamente paralelizable y con 36 instancias simultáneas en una semana se hace el cracking total.

Podemos concluir que es un costo demasiado elevado y aunque no es una seguridad perfecta está muy fuera del alcance de un cracker de medio pelo pero no para un gobierno. Este análisis también sugiere el tiempo/costo necesario para crackear una contraseña TrueCrypt de 8 caracteres alfanuméricos, que es equivalente a una de 41.3 bits (log_2(36^8)), sólo tomaría poco más del doble de tiempo y recursos. Así que si la NSA quisiera podría cracker fácil una contraseña así y por eso TrueCrypt recomienda contraseñas de 20 caracteres, para al menos lograr una seguridad de 103 bits.

Nota: El handshake WPA contiene la contraseña pero no en texto plano, lo que contiene es la derivación de esa llave (Pairwise Master Keys) a partir del algoritmo PBKDF2. Dicho pronto y mal para WPA se aplica 4096 veces SHA1 sobre la contraseña y utiliza como salt el SSID (nombre de la red), por lo que probar una clave no es tan trivial como calcular sólo un SHA1, además que el salt evita tener tablas universales precalculadas.

Inseguridad Telmex

Estaba yo navegando por la página de El Universal, cuando veo un anuncio enorme en donde Telmex ofrece servicios de seguridad perimetral en redes. Sé que muchos ya estarán riéndose de esto, pero algunos pensarán que como es una empresa grande (que gana mucho dinero) alguna calidad deben tener sus servicios y algún otro tal vez hasta piense contratar esto para su empresa ¡cuidado!

Es bien sabido que Telmex es la principal empresa proveedora de enlaces a internet en este país y en el mundo de la seguridad (sobre todo para los amantes de aircrack) es además bien sabido que son la principal empresa que instala sus modems preconfigurados con la insegura y obsoleta tecnología WEP para proteger el acceso a las redes inalámbricas de cada punto de acceso. Para decirlo pronto y claro, cualquier persona con un pequeño entrenamiento puede colarse a la red inalámbrica de tu casa si es que tienes Infinitum.

Con esta información, da mucha risa que ofrezcan estos servicios de “seguridad” cuando sería trivial colarse a la red local de una empresa que tenga contratado un Infinitum, por más firewall, VPN e IPS que tengan configurado. Una vez dentro de la red local “de ahí pal real” con todas las máquinas Windows que tengan, recursos compartidos en red, conversaciones en MSN, passwords que viajen en texto plano (sin https), etc.

Al final es triste recordar la incultura en seguridad que se tiene en el mundo empresarial, las pésimas políticas que se adoptan y los engaños de marketing que les cuelan. Lo peor es que no se limita a México, sino en todo el mundo es lo mismo.

Si quieren verdadera seguridad para sus servicios, ahí les dejo nuestro enlace.

P.D. Dado que no quiero darle referencias de este blog a esa abominación de empresa llamada Telmex usé la etiqueta rel=”nofollow” para el enlace.

Autenticación segura sin SSL/TLS

Muchas veces no es necesario o es demasiado cifrar toda la comunicación entre el cliente y el servidor, por razones de performance o por el sobrecosto de implementar un esquema de PKI (Public Key Infraestructure) para usar SSL/TLS. Pero siempre hay algo que es necesario proteger por seguridad: las credenciales de autenticación del usuario. Por lo que en este post explicaré cómo se puede hacer una autenticación sin enviar esa información (no, no es telepatía).

Protocolos de conocimiento cero (ZKP)

Sabemos que sin un esquema de cifrado de llave pública es trivial para un atacante interceptar la información que se envía entre el cliente y el servidor, pero el sistema debe tener alguna manera de autenticar a los usuarios del sistema. Necesitamos enviar algo que si un atacante intercepta no pueda utilizar para autenticarse. Esto se conoce como un protocolo de conocimiento cero (Zero-knowledge proof), y en palabras coloquiales significa: “probar que poseemos cierta información sin revelar esa información”.

Como comúnmente la única información que queremos “probar que poseemos pero no queremos revelar” es la contraseña, voy a explicar el esquema que usa MySQL para implementar su autenticación de usuarios. Los detalles no están explicados de manera formal en la documentación de MySQL pero alguien se tomó el tiempo de leer el código fuente y explicar cómo funciona (MySQL 4.1.x authentication internals).

¿Cómo se almacenan las contraseñas?

Lo primero que hay que tener en cuenta es que, siguiendo los principios básicos de almacenamiento seguro de contraseñas, éstas se almacenan en el sistema sólo como un hash criptográfico. Que tiene la propiedad de ser prácticamente irreversible y prácticamente único. Por lo que esta es la primera parte del ZKP, ya que sólo quien conozca la contraseña podrá generar el hash criptográfico que le pertenece.

Desde MySQL 4.1 las contraseñas de usuario están almacenadas en la tabla “mysql.user” en la columna “Password” de la siguiente manera: SHA1(SHA1(password)). Donde SHA1 es el hash criptográfico SHA-1.

La transmisión

Si cada vez que el cliente se quiera autenticar sólo transmitiera SHA1(SHA1(password)), cumpliría con el principio de no revelar la contraseña, pero un atacante podría capturar y enviar después SHA1(SHA1(password)) para autenticarse exitosamente aún sin conocer la contraseña. Por lo que necesitamos agregar más cosas al protocolo para que la información que transmite el cliente sólo sea útil para un intento de autenticación.

Este sería el esquema cliente-servidor para la transmisión:

  1. Se inicia el intento de autenticación
  2. El servidor genera una cadena aleatoria salt y se la transmite al cliente.
  3. El cliente calcula S_1 = SHA1(pass), S_2 = SHA1(S_1) y S_3 = SHA1(salt+S_2) (aqui + significa concatenación).
  4. Finalmente el cliente transmite M = S_3 \oplus S_1. (aquí \oplus significa bitwise XOR)

Autenticación

El servidor sólo conoce H = SHA1(SHA1(password)), que está almacenado en la tabla de usuarios, y salt. Para autenticar hace lo siguiente:

  1. Calcula S'_3 = SHA1(salt+H).
  2. Calcula S'_1 = M\oplus S'_3.
  3. Calcula S'_2 = SHA1(S'_1).
  4. Sólo si H=S'_2 la autenticación es exitosa.

Observaciones

Nunca se transmite S_2 ni S_1, por lo que la fortaleza está en que este ZKP verifica que el cliente conoce SHA1(password)) y SHA1(SHA1(password)) pero sin revelar esa información, y que sería casi imposible que un atacante poseyera sin conocer password.

También hay que observar que salt es una cadena única por cada intento de autenticación, o sea que esa cadena siempre está cambiando.

Implementación

Próximamente trabajaremos en una implementación de este esquema para aplicaciones web usando JavaScript y PHP, que publicaremos bajo licencia LGPL.

Port Knocking : Evita ataques masivos a tu puertos

El port knocking se refiere a una combinación de puertos que debemos “tocar” para que el servidor nos de acceso a un servicio. Por ejemplo, cuando alguien establece una conexión por ssh implícitamente va un paquete al puerto 22 intentando iniciar la conexión, y esto sería “tocar” el puerto 22.

¿Para qué?

Si tenemos un servidor accesible desde internet, es común que recibamos ataques automáticos por diccionario contra nuestro servidor; esto es así porque hay muchas botnets que realizan ataques masivos contra todo lo que encuentren en internet. Pero al implementar port knocking estas botnets ignorarán nuestro servidor, y además los escaneos de puertos no podrán ver abiertos los puertos sensibles, aunque nosotros sí tengamos acceso a ellos.

Por otro lado, cuando un servicio como ssh o mysql están recibiendo un ataque por diccionario, la política automática por defecto es aumentar el tiempo de espera para hacer login, por lo que empezaríamos a notar comportamientos extraños en nuestro servidor (lentitud al realizar operaciones que requieran conexión a esos servicios).

Funcionamiento

El funcionamiento es simple: lo que va a pasar es que aparecerá cerrado el puerto 22, pues se está esperando a que le mandemos una combinación de puertos, supongamos la combinación 1200, 234, 654, 4509, 12; y, una vez enviada la combinación podremos establecer la conexión al puerto 22 (el del ssh).

Ya en la práctica tendríamos lo siguiente:

      Intentamos entrar al puerto 22 (aparece cerrado)
      Abrimos una conexión con el puerto 1200 (responderá que esta cerrado) pero el servidor sigue en espera de las demás conexiones
      Abriimos una conexión con el puerto 234 (nos aparece cerrado) el servidor ya sabe que tenemos las primeras dos combinaciones bien
      Abrimos una conexión con el puerto 654, luego 4509 y luego el 12
      Ahora tenemos 5 segundos para iniciar la conexion por ssh
      Iniciamos la conexión exitosamente

El port knocking es como si metieramos a una caja fuerte nuestra laptop, y aún después de poner la combinación se tendrían que poner el password de la computadora. Esto obviamente aumenta la seguridad en una forma considerable.

Hay que recordar que esto a pesar de ser una buena forma de asegurar un puerto, necesita tener dentrás una buena contraseña y unas buenas políticas, pues si para alguien que estuviera analizando nuestro tráfico sería trivial obtener la combinación de puertos.

Implementación con iptables

Con ayuda de iptables podríamos hacerlo suponiendo la combinacion 100, 200, 300, 400, ssh(22):

HOST_IP="12.34.56.78"

/sbin/iptables -N INTO-PHASE2
/sbin/iptables -A INTO-PHASE2 -m recent --name PHASE1 --remove
/sbin/iptables -A INTO-PHASE2 -m recent --name PHASE2 --set
/sbin/iptables -A INTO-PHASE2 -j LOG --log-prefix "INTO PHASE2: "

/sbin/iptables -N INTO-PHASE3
/sbin/iptables -A INTO-PHASE3 -m recent --name PHASE2 --remove
/sbin/iptables -A INTO-PHASE3 -m recent --name PHASE3 --set
/sbin/iptables -A INTO-PHASE3 -j LOG --log-prefix "INTO PHASE3: "

/sbin/iptables -N INTO-PHASE4
/sbin/iptables -A INTO-PHASE4 -m recent --name PHASE3 --remove
/sbin/iptables -A INTO-PHASE4 -m recent --name PHASE4 --set
/sbin/iptables -A INTO-PHASE4 -j LOG --log-prefix "INTO PHASE4: "

/sbin/iptables -A INPUT -m recent --update --name PHASE1

/sbin/iptables -A INPUT -p tcp --dport 100 -m recent --set --name PHASE1
/sbin/iptables -A INPUT -p tcp --dport 200 -m recent --rcheck --name PHASE1 -j INTO-PHASE2
/sbin/iptables -A INPUT -p tcp --dport 300 -m recent --rcheck --name PHASE2 -j INTO-PHASE3
/sbin/iptables -A INPUT -p tcp --dport 400 -m recent --rcheck --name PHASE3 -j INTO-PHASE4

/sbin/iptables -A INPUT -p tcp -s $HOST_IP --dport 22 -m recent --rcheck --seconds 5 --name PHASE4 -j ACCEPT

Y para hacer el knocking sería de esta forma:

$telnet 10.1.1.1 100 ; telnet 10.1.1.1 200 ; telnet 10.1.1.1 300 ; telnet 10.1.1.1 400 ; ssh 10.1.1.1

Luego presionamos Ctrl+C 4 veces y listo.

(Fuente: Debian Administration)

Angry IP Scanner para OS X

ipscan-mac

La herramienta de escaneo de redes por excelencia para windows, ya la podemos encontrar ahora para Mac OS X.

Había usado esta herramienta ya desde hace tiempo sin saber de su versión para Mac, la pueden bajar en insecure.org o directamente en el link.

Al parecer a partir de la actualización 10.5.5 de leopard el programa tiene problemas y crashea, pero con éstos comandos podemos resolverlo:

$ cd /Applications/Angry\ IP\ Scanner.app/Contents/MacOS/
$ rm /Applications/Angry\ IP\ Scanner.app/Contents/MacOS/ipscan
$ cp /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub ipscan

2008 el año de las grandes fallas en Internet

Este 2008 fue el año de las grandes catástrofes en Internet segun Hispasec, término que me parece muy interesante y cierto pues ha habido una serie de problemas que afectan a Internet en general como en ningún otro año hubo.

  • El descuido del OpenSSL en Debian : Debian ha sido una de las distribuciones más estables y seguras, con la premisa de mantener solamente versiones estables de software, aunque viejas. En 2006 un desarrollador comentó una línea de código del paquete open-ssl para evitar algunas molestas alertas del compilador, aunque antes se asesoró con los desarrolladores de open-ssl para tener la certeza de que no estaba haciendo nada mal. El problema de comentar esa línea es que se redujo drásticamente el rango de valores para escoger llaves publicas, provocando que la “aleatoriedad” al escoger llaves ya no sirviera como medida de seguridad, y se pudieron calcular muchísimas listas que contenían todas las posibles llaves. Esta falla ya esta solucionada.
  • Kaminsky y los DNS : En julio Dan Kaminsky descubre una vulnerabilidad en el protocolo, lo que permitiría falsificar las respuestas de un DNS, y así un atacante podría apoderarse de una zona o dominio entero; y, por consiguiente el atacante podría enviar páginas falsas pareciendo correctas a miles de personas. Esta falla ya esta solucionada
  • La falla en la arquitectura del BGP : Tony Kapela y Alex Pilosov demostraron una ataque que permite interceptar el tráfico de Internet en una forma casi idetectable. Es una falla en la arquitectura del protocolo BGP (Border Gateway Protocol), que permite interceptar y hasta modificar el tráfico de Internet que no esté cifrado y sin que ninguna persona pueda darse cuenta. Esta vulnerabilidad no se basa en algún error de software, es una falla en la arquitectura del protocolo BGP, ya que este protocolo que se basa en la confianza mutua. La falla no esta solucionada, y la solución que proponen es que los routers en su comunicación usen certificados de seguridad que eviten la confianza mutua.
  • La supuesta denegación de servicio del TCP : Outpost24 presume haber descubierto una vulnerabilidad en el protocolo TCP, que podría causar una denegación de servicio a cualquier implementación del mismo. Cabe destacar que el protocolo TCP es el más importante para la comunicación en todo Internet. No se han dado detalles del problema.
  • Los avances en la inseguridad de Wireless : Este año se caracterizó entre otras cosas por empezar a sacar provecho de los GPU. Hay que señalar que un GPU es el procesador de las tarjetas gráficas. Algunas compañías aseguran poder crackear una clave WPA mucho más rapidamente mediante el uso combinado de GPU y CPU. Poco después se descubren vulnerabilidades en el algoritmo TKIP (un cifrado muy utilizado en WPA). Todo el mundo comentaba que la seguridad en redes wireless está por los suelos, pero la verdad es que el problema con TKIP ni siquiera facilita la obtención de la clave, sólo permite descifrar parcialmente los paquetes; y, para realmente obtener una aceleración impresionante en el crackeo por GPU necesitaríamos una tarjeta gráfica realmente cara, no una convencional como anunciaban esas empresas de software.
  • El clickjacking : Jeremiah Grossman y Robert Hansen, dos expertos en seguridad Web, se reunen para demostrar una vulnerabilidad basada principalmente en las etiquetas iframe. La vulnerabilidad permite a un atacante forzar a que un usuario, sin saberlo, “haga click” en un vínculo que el atacante quiera. Lo peor es que todos los navegadores son vulnerables y la única forma en la que se puede evitar es deshabilitando las etiquetas iframe en el navegador.

¡ Esperemos un mejor año !

Autoridades Certificadoras (Certificados de Seguridad)

Como vimos anteriormente la criptografía asimétrica necesita de cuatro llaves para ser segura, pero siempre podemos dudar de que alguien no es quien dice ser. Para aumentar la seguridad se recurre a certificados de seguridad, los clásicos son VeriSign y Geotrust, que para mi punto de vista son muy caros, pero a veces la seguridad cuesta.

¿Cómo funcionan?

Las conexiones seguras en internet se hacen comúnmente usando el protocolo SSL. Cuando nos conectamos a un sitio seguro, leemos https:// en la barra de direcciones, en ocasiones vemos que sale en color amarillo y hasta aparece un candado. ¿Qué seguridad nos están brindando?, lo veremos a continuación:

Cuando inicias una conexión con un servidor, mediante SSL, se transmite la llave pública del servidor, luego tú también mandas tu llave pública, entonces de manera segura, se ponen de acuerdo para usar un sistema de cifrado simétrico; pero antes de establecer la conexión tú necesitas saber que el servidor pertenece realmente a la empresa que dice ser. Aquí entran las Autoridades Certificadoras, que lo único que hacen es dar de alta al servidor en GeoTrust, éstos a su vez mediante un estudio corroboran la identidad del servidor y, después de estar seguros, le otorgan un certificado de seguridad.

Un certificado de seguridad contiene los datos de la empresa y la llave pública del servidor, además está firmado digitalmente por la Autoridad Certificadora. Como los browsers tienen interconstruidas las llaves públicas de varias Autoridades Certificadoras, pueden revisar la firma digital del certificado, y así corroborar la identidad del servidor.

La firma digital de un certificado es simplemente el hash del certificado, que a su vez está encriptado con la llave privada de la Autoridad Certificadora. Para verificar que la firma es correcta y el certificado es válido, lo que se hace es descrifrar el hash del certificado, usando la llave pública de la Autoridad Certificadora; luego el hash desencriptado se compara con el hash del certificado. El proceso verifica implícitamente que: la Autoridad Certificadora en verdad firmó ese certificado, y que el certificado no ha sido alterado; por lo que se puede confiar plenamente en ese servidor para darle nuestro número de tarjeta de crédito, por ejemplo.

¿Pero realmente ésto nos brinda total seguridad?

Pues no, a pesar de todo el servidor nunca sabrá que quien se conecta a él es quien dice ser; pero definitivamente es mucho más seguro usar el certificado de seguridad que no usarlo.

¿Qué es y para qué sirve un DNS?

DNS (Domain Name Server o Servidor de nombre de dominio) es una tecnología de Internet que se utiliza para asociar nombres (como www.google.com) a su dirección IP (por ej. 72.14.253.99). Imagínense lo dificil que sería estar aprendiendonos números en lugar de nombres, creo que Internet no sería lo mismo, y obviamente no sería tan popular.

¿Qué es lo que pasa cuando tu escribes www.google.com en tu firefox o en tu safari, o en tu Konqueror?
(más…)

¿Crees que tu red inalámbrica es segura porque tiene password WEP?

Un grupo de investigadores dedicados a las Ciencias de la Computación en Alemania han anunciado que han logrado hacer un ataque contra redes inalámbicas cifradas WEP o sea alrededor del 50% de las redes inalámbricas, capaz de crackear un password de la red inalámbrica en aproximadamente un minuto, y en su página web viene un documento para quienes tengan conocimientos de matemáticas avanzadas y criptografía, que demuestra el ataque matemáticamente, obteniendo una probabilidad muy alta de lograr crackear el password en la mayoría de los casos. Espero que damián pueda explicarles después más a fondo y de una manera más técnica este ataque.

(Vía: Kriptópolis)