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.

De balas perdidas, cines y Hendrik

Por la petición a gritos de un conocido hace tiempo, hice el ejercicio de calcular la trayectoria de una bala disparada por un arma calibre 9mm a la lejanía. Primero para saber hasta donde podría llegar, en qué angulo caía y por último para saber si era posible que el proyectil a su caída pudiera herir a alguien. Todo esto a raíz del sonado caso que ocurrió en la Ciudad de México, de un niño llamado Hendrik que recibió un proyectil en la cabeza mientras estaba en una función de cine. [Nota periodística]

La trayectoría balística

La manera más simple de calcular la trayectoria de una bala es mediante el movimiento parabólico, que dice que un objeto disparado desde el suelo con cierta inclinación recorre una parábola perfecta y toca el suelo con la misma velocidad con la fue disparado. Esta sería una aproximación muy buena si el objeto viajara a velocidades bajas, digamos a velocidades en donde a simple vista se pudiera observar perfectamente el objeto en movimiento, pero para el caso de una bala esto no es así por lo que es necesario considerar que el aire frena al objeto durante la trayectoria recorrida.

En el siguiente dibujo se puede observar la trayectoria ideal (en verde) y la trayectoria real (en rojo) de una bola de beisbol al ser lanzada. La trayectoria real, cuando se considera la fricción del aire, no describe tal cual una parábola y el ángulo de caída es más cerrado que el ángulo de salida.

Ejemplo de trayectoria

La cuestión es compleja y cada instante que el objeto viaja en el aire es frenado en cierta magnitud, dependiendo de la densidad del aire y el área del objeto. Para modelar esta desaceleración en conjunto con el movimiento parabólico es necesario usar una ecuación diferencial y el cálculo de la trayectoria se torna más complejo que simplemente dibujar una parábola.

Calculando la trayectoria

Para hacer el cálculo de la trayectoria, me basé en el artículo de Amanda Wade, GOING BALLISTIC: BULLET TRAJECTORIES. En el texto se describe cómo calcular la trayectoria real de una bala disparada por un rifle con cierta inclinación, considerando la desaceleración producida por el aire en el movimiento horizontal. Lo más interesante es que también detalla la manera de calcular esta trayectoria usando el Método de Euler, para ecuaciones diferenciales de primer orden y con ayuda de Excel.

Lo único que hace falta es considerar que la bala es diferente, con diferente masa, diferente área y velocidad inicial. Para este caso se considerará una bala de diámetro 9mm, masa de 8 gramos y velocidad de salida de 360 m/s. Con todo eso se puede calcular la trayectoria de un disparo “al aire”, digamos con una inclinación de 70º, ya que sería absurdo considerar un tiro vertical perfecto de 90º o tiro de 45º, porque la bala podría chocar antes con un edificio cercano. El archivo de Excel con las fórmulas se puede descargar de aquí [Bala Excel].

Una vez hecho el cálculo lo graficamos y podemos observar la trayectoria de la bala en el siguiente dibujo.

En resumen los datos que se obtienen indican que la bala alcanza unos 1,700 metros de distancia y otro dato muy importante, que no se puede observar en la gráfica pero en los cálculos detallados sí, es que la magnitud de la velocidad final al tocar el suelo es de 133 m/s, bastante menos que su velocidad de salida, pero letal. Se sabe, desde los años 20, que una bala desde 61 m/s atraviesa la piel [Ver artículo].

Ángulo de entrada

Un aspecto más que se debe analizar para efectos del caso que ocurrió en México es el ángulo de entrada. Digamos que si se quisiera uno proteger de esa bala colocándose atrás de una pared de 10 metros, ¿qué tan cerca tengo que colocarme de la pared para que la bala ni me roce?

El ángulo de entrada durante los últimos 100 metros de caída es de aproximadamente 7º. Por lo que si hacemos un diagrama considerando una pared de 10 metros, nos quedaría algo así:

bala-pared

Es decir que un adulto de 1.8 m de altura tendría que estar parado a 1 metro o menos de la pared para que la bala ni siquiera lo roce. Bastante cerca.

Otra observación que se puede hacer es que aunque el tiro fuera a 45º, el ángulo de entrada sería de aprox. 18º, por lo que aún así tendríamos que estar a 3 metros o menos de la misma pared para que ni nos roce la bala. Se ve muy minada la protección que podría ofrecer esa pared dado el ángulo de entrada.

Los Mythbusters

Los Mythbusters son especiales para abordar los asuntos quisquillosos y se dedican a hacer experimentos para decidir si cierta afirmación es: verdadera, posible o imposible. Lo único malo es que están muy bien producidos, son esclavos del rating y tienen que levantar polémica si no perdería lo interesante su programa, en el momento en que mencionen una ecuación diferencial perderían el 80% de la audiencia, caso contrario de lo que pasa cuando realizan disparos con una Barret calibre .50. No podemos culparlos, estoy hablando de ellos por su fama.

Ellos abordaron un asunto similar a este, pero disparando al aire en ángulo de 90º y concluyeron, pronto y mal, que la velocidad terminal impediría que una bala disparada al aire fuera letal al caer (o al menos eso es lo que entendió la audiencia). Lo único malo es que no dijeron, y nunca dicen, es que hacer un tiro de 90º perfecto es casi imposible y que cualquier tiro en un ángulo menor hace que la bala mantenga su giro, ya que las balas van girando al salir porque los barriles de las pistolas tienen forma de espiral por dentro para darles el efecto. Al mantener el giro la bala no simplemente sube y cae como un pedazo de metal, mantiene su posición con la punta hacia el objetivo.

Por ello se han escrito muchas entradas en otros blogs tratando de poner perspectiva a las afirmaciones de los Mythbusters. Aquí hay una en donde calculan las velocidades terminales para tiro en diferentes ángulos con calibre 9mm. Y un artículo de wikipedia sobre tiros de celebración al aire.

Conclusión

Haya sido como haya sido la “imbestigación” de las autoridades en México, el pésimo manejo de Cinépolis, etc. etc. Muy al estilo de los Mythbusters: un niño sentado en un cine SÍ puede morir por una bala al aire que cae y atraviesa el endeble plafón del techo del cine. Además el cráneo de un niño es más suave que el de un adulto, porque somos el mamífero que tiene el mayor crecimiento del cerebro postparto.

Sesión SSH duradera

Las conexiones SSH, así como las HTTP y de otros servicios, tienen por defecto una política de timeout que cierra la conexión si no hay actividad, por seguridad y por eficiencia para liberar los recursos no usados.

En muchas ocasiones, como cuando se hacen túneles SSH, es más cómodo mantener una conexión abierta que no se cierre por timeout. Una manera de hacerlo es mediante las políticas del servidor SSH, pero otra manera más sencilla es hacerlo por cada conexión desde el cliente.

Comúnmente en los clientes SSH en Unix están las opciones TCPKeepAlive y ServerAliveInterval. La primera indica que se quiere mandar un paquete SSL por TCP hacia el servidor para mantener la actividad y la otra indica el intervalo en segundos en el cual se van a mandar los paquetes. Un ejemplo de uso sería el siguiente:

ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 usuario@servidor

Así ya podrán mantener sus sesiones de SSH abiertas todo el tiempo que quieran y no olviden cerrarlas cuando las dejen de usar.

Mejores prácticas para Time Machine

A estas alturas del partido, dado el uso extendido de las computadoras en todos los ámbitos, es ya imprescindible mantener respaldos de todo el trabajo realizado para no pasar un mal rato cuando el disco duro falle, y lo peor de todo es que la vida útil de un disco duro es menor que cualquier otro componente de una computadora (salvo la batería quizá).

Hace poco tuve un accidente con mi MacBook Pro y el disco fue lo único que se dañó, porque también es el componente más sensible a una caída (ya ni la pantalla) y no se volvió inservible, pero se dañó lo suficiente para que no todos los archivos fueran recuperables, por lo que perdí casi toda mi música y algunas otras cosas. Lo único bueno es que generalmente mis proyectos de software están en un SVN por lo que no perdí información trascendental y valiosa. Pero para cualquier desarrollador es muy engorroso y lento instalar de nuevo todo el software que utilizas de diario, por lo que me arrepiento tanto de no haber tenido un Time Machine.

Antes de hacer mi copia me estuve informando y estuve pensando seriamente cómo debía hacer este proceso, por lo que aquí les dejo unas recomendaciones:

  1. Compra un buen disco duro externo, con capacidad de al menos el doble de capacidad de tu disco duro actual
  2. La versión inicial de Time Machine es muy importante, porque de ahí se derivará todo un árbol a futuro de los cambios que se vayan haciendo a tus archivos
  3. Baja una herramienta como GrandPerspective o DaisyDisk para observar cómo está distribuido el espacio en tu disco actual.
  4. Organiza tus archivos, haz un directorio llamado “NoBK” en donde vayan archivos grandes o cosas que ocupen mucho espacio y que si el día de mañana no estuvieran no tendría importancia.
  5. Algunos discos duros externos vienen con algún formato o traen herramientas para formartearlos. Lo mejor será abrir la Utilidad de Discos, borrar todo el disco y formatearlo en Mac OS Plus
  6. Antes de hacer la primer copia de seguridad, configura tu Time Machine y excluye tu carpeta “NoBK” y la de “Descargas”. Algunos recomiendan otras de sistema pero es un error si quieres poder recuperar tu instalación actual en caso de un percance
  7. Haz tu copia de seguridad inicial y procura diario hacer una al menos por las noches

Time Machine no sólo sirve para hacer copias de seguridad en caso de daño a tu disco o robo, también si quieres jubilar tu actual Mac a una más nueva puedes usar la copia de Time Machine para restaurar tu instalación en otro equipo.

Otra reflexión interesante cuando ocurrió el percance, es que mis datos más importantes nunca estuvieron en peligro, porque actualmente todo está en la nube, el correo, documentos, calendarios y código fuente en svn.

Si en lugar de usar Time Machine quieres algo más ubiquo y en la nube puedes probrar CrashPlan, es un servicio que te permite hacer respaldos en la nube, pero debes tener una muy buena conexión para que sea útil.

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.

Vulnerabilidad LNK

El 17 de junio de 2010 se descubrió una vunerabilidad 0-day que afecta a todas las versiones de Windows. Lo terrible del asunto es que se descubrió después de que ya estaba siendo explotada por un troyano cuyo fin era el espionaje industrial.

La noticia saltó a los medios especializados el 16 de julio. Los primeros detalles indicaban que la vulnerabilidad permitía a un atacante ejecutar automáticamente código al insertar un medio extraíble en el sistema. La crónica y más detalles se puede encontrar aquí:

Interesante (y peligroso) troyano que aprovecha un interesante (y peligroso) 0 day en Microsoft Windows

Ahora el código es público y ni lentos ni perezosos ya lo incluyeron en la archiconocida suite MetaSploit. Aunque ya es posible mitigarlo mediante una Directiva de Seguridad Local, Microsoft no ha publicado aún ningún parche.

Gracias a Un informático en el lado del mal por la recopilación de fuentes.

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.

Malware en Linux

Recientemente se descubrió un malware para Linux. Alojado en una página muy popular de descargas de temas para Gnome.

Este malware viene incorporado en un screensaver contenido en un paquete .deb que requiere privilegios de administrador para instalarse. Específicamente es un troyano diseñado para formar parte de una Botnet y hacer ataques DDoS.

Las instrucciones para eliminarlo revelan dónde se instala y cómo se autoejecuta:

sudo rm -f /usr/bin/Auto.bash /usr/bin/run.bash /etc/profile.d/gnome.sh index.php run.bash && sudo dpkg -r app5552

Hace tiempo reflexioné sobre este futuro poco alentador en un artículo sobre un troyano en mac. Lo que me lleva a hacer una reflexión que me gustaría que todos los linuxeros nos hiciéramos: ¿cuántas veces has revisado lo que hace e instala un paquete .deb antes de ponerle tu contraseña de administrador?

Eso de creernos invulnerables por usar Linux o Mac OS pronto va a dar frutos, y son frutos podridos. Si se le sigue diciendo a la gente, sistemáticamente, que es invulnerable al malware es casi seguro que caiga en un engaño por exceso de confianza. También pasó con el troyano que venía en la versión de bittorrent de iWork y quién sabe cuántos aún sigan infectados.

Compara el costo de vivir en un país diferente

Cuando planeamos un viaje largo, una estancia universitaria o simplemente tenemos curiosidad económica, es bastante difícil comparar efectivamente la diferencia de precios sin caer en el error de darle demasiada importancia a la evidencia anecdótica de alguien que viajó a ese lugar o extrapolar experencias propias.

Para hacer este tipo de cuestiones existe un sitio que nos permite hacer una comparación general de precio en diferentes cosas: restaurantes, productos básicos, transporte, renta de departamentos, gasolina, internet y telefonía. El sitio es:

http://www.numbeo.com/cost-of-living/compare_countries.jsp