jueves, 30 de diciembre de 2010

Robo de sesiones mediante cookies

Qué son las cookies
HTTP, el protocolo que se usa para ver páginas web, es un protocolo sin estado, lo que quiere decir que cada petición es independiente de las demás, así que hace falta algún mecanismo que permita relacionar todas las peticiones, es decir, las cookies.

Cuando inicias sesión en una página, digamos friendface.com, pones tu nombre de usuario y tu password y le das a enviar (eso es una petición), vas al perfil de un amigo (otra petición). Si no se relacionasen las peticiones, no podrías ver el perfil de tu amigo, porque para el servidor, al ser independientes las peticiones, no habrías iniciado sesión. Esto mismo se aplica cuando te conectas a la página del banco, a la de gmail o a cualquier cosa.

Cuando se hace la primera petición a un sitio, éste nos devuelve su respuesta, un documento HTML normalmente, junto con una identificador aleatorio que debería ser único, es decir, la cookie. En cada petición posterior a ese mismo sitio, le adjuntamos la cookie, de forma que sepa que esa petición está relacionada con la primera. Por eso precisamente no es necesario poner login y password en cada petición.

El problema en sí
Entonces tenemos que una cookie sirve para identificar todas las peticiones que se hacen bajo una sesión, de forma que se entiende que se trata de la misma persona, haciendo todas esas peticiones.

Pero, ¿y qué pasa si consigo la cookie de friendface.com de otra persona?. Efectivamente, podrías hacer peticiones a friendface.com y hacer creer al servidor de friendface.com que eres esa otra persona, teniendo acceso a toda su información.

Para evitar que las contraseñas puedan ser vistas en la red, se utilizan protocolos de cifrado (HTTPS por ejemplo) para enviarlas, pero el tráfico que se genera a partir del momento de iniciar sesión, van en claro, por lo que la cookie va en claro, permitiendo acceder a la información crítica.

Hasta aquí, digamos que sólo un 0,1% de la población mundial tiene capacidad técnica para hacer este tipo de cosas, despues de una hora de leer por internet, si no fuera porque van saliendo herramientas que te permiten hacerlo de forma automática con, literalmente, dos clicks y sin tener ni idea de lo que estás haciendo en realidad.

Un ejemplo
Está Alice, la mujer de Bob en una cafetería con su portatil usando la wifi y decide conectarse a friendface.com. Su clave va encriptada por HTTPS, si, pero la cookie que identifica su sesión no. Trudy que es un poco travieso está también con su portatil y, puesto que ambos están usando la misma wifi y los datos viajan en claro por la red, Trudy puede robar la cookie de friendface.com de Alice y se hace pasar por ella, cotilleando las cartas de amor que le escribe a Bob y dejando comentarios en sus fotos insinuándole que se está poniendo gordo y feo.

Conclusión

La única forma de que alguien te robe las cookies, como le ha pasado a la pobre Alice, es que se cumplan una serie de requisitos

  1. Tanto el ladrón como tú uséis un medio compartido para conectaros.
  2. Que la conexión vaya en claro, es decir, no use HTTPS.
  3. Que haya alguien con mala idea cerca.
De todas formas es buena política NO marcar la opción de "recordarme" y cerrar sesión SIEMPRE después de usar la página en cuestión. Si os roban las cookies y no cerráis sesión, el ladrón podrá seguir suplantándoos.
Maaaal! 
Es buena costumbre evitar conectarse a sitios con información sensible desde las conexiones públicas de sitios concurridos como bibliotecas, cafeterías, hoteles, etc, o bien saber cómo montártelo para evitar que te espíen la conexión, aunque no voy a entrar en eso, que ya es lo que me faltaba para escribir un ladrillo aún mayor que éste.

Lista de sitios web a evitar desde conexiones públicas:

  • amazon
  • basecamp
  • bitly
  • cisco
  • cnet
  • dropbox
  • enom
  • evernote
  • facebook
  • flickr
  • foursquare
  • github
  • google
  • gowalla
  • hackernews
  • harvest
  • live
  • nytimes
  • pivotal
  • sandiego_toorcon
  • slicemanager
  • tuenti
  • tumblr
  • twitter
  • wordpress
  • yahoo
  • yelp

martes, 28 de diciembre de 2010

FRITZ!Box 7270

Pues nada, cayó en mis manos uno de estos para certificarlo para la empresa de VoIP de unos amigos y acabé quedándome uno.


El chisme en si es varias cosas:
  • Modem-router ADSL que soporta tanto anexo A (sobre par de cobre analógico) como B (sobre RDSI), que además incorpora un switch de 4 puertos Ethernet.
  • Punto de acceso WiFI 802.11a+b+n (hasta 300mb). (Hasta aquí todo normal).
  • Centralita de telefonía tradicional que incorpora dos puertos para teléfonos analógicos y un puerto para teléfonos RDSI.
  • Base DECT, que permite asociar los teléfonos inalámbricos que tengamos por casa y convertirlos en extensiones.
  • Centralita VoIP, que permite añadir como extensiones teléfonos IP y softphones y además enviar y recibir llamadas a través de proveedores de VoIP
  • USB, que permite tanto enchufar discos duros, como hacer de servidor de impresión.
Permite también configurar horarios en los que deben sonar los teléfonos, contestadores automáticos, fax, lista de teléfonos y un montón de cositas interesantes pero que tampoco son la panacea. A mi lo que más útil me parece son dos cosas principalmente:

Hacer y recibir llamadas VoIP. 
Habitualmente tenemos una conexión ADSL o similar, asociada a una linea de teléfono que incluye una "tarifa plana" de llamadas a fijos nacionales, pero con precios para el resto de llamadas abusivos. Es aquí donde entra un operador de VoIP. Una vez configurada la cuenta con cualquier proveedor de VoIP que soporte SIP, es como si tuvieramos dos lineas, que FRITZ!Box gestionará de la forma que le digamos. Desde este momento, podremos recibir llamadas que nos entren por VoIP o por la linea convencional (en este punto es interesante mencionar los servicios que suelen proporcionar estas empresas: numeración de otros países, numeración especial como 902, 803, etc, o tarifas interesantes a destinos internacionales) y configurar comportamientos en función del tipo de llamada.

Pogamos un ejemplo... resulta que habitualmente, cuando llamo a un móvil utilizo un móvil, cuando llamo a un fijo utilizo el fijo y cuando llamo a otro país, me terminan clavando haga lo que haga. Es fácil configurar rutas salientes en función del prefijo que utilice:
  • 9x: llamadas a fijos que deben salir por la linea de teléfono (simplificando, aqui entrarían 902 y no entrarían los 81, 82, etc, numeraciones nuevas que se están empezando a dar para algunas comunidades).
  • 6x: móviles que saco a traves de un proveedor VoIP.
  • 00x: llamadas internacionales que saco por un proveedor VoIP.
Otro ejemplo: tengo una empresa en Cantabria y tengo muchos clientes en Madrid, así que decido habilitar un 91 para dar buena imagen a mi empresa. A través de un proveedor VoIP es sencillo obtener un número geográfico de cualquier comunidad y recibir las llamadas dirigidas al mismo.


Llevar la linea fija a cualquier sitio.
Pongamos que estoy de vacaciones y no quiero que se sepa, o que estoy esperando una llamada y tengo que salir. Es posible crear una extensión VoIP y que FRITZ!Box la maneje como si fuera un teléfono más de casa. Cuando llamen a casa sonará ese teléfono y cuando llame desde ese teléfono será como si llamase desde casa. Hay que decir que el FRITZ!Box no permite, por defecto, registrar extensiones VoIP desde fuera de la red, por lo que hay que hacer unos apaños que explicaré más adelante, aunque permite, por ejemplo llamar y recibir llamadas en un softphone desde el ordenador, iPhone, Android o cualquier teléfono IP.


Incluso extendiendo estos dos últimos conceptos, se podría usar para "unir" dos sedes de una empresa.


Apaños varios
La primera de las cosas que hemos hecho (entre mi padre y yo) ha sido pasar del cable enorme que por uno de los extremos tiene dos conectores RJ11, uno para el ADSL y el otro para el teléfono (con un convertidor por si es RDSI en lugar de RTB), y por el otro un RJ45, que es el que se enchufa en el FRITZ!Box. Midiendo con un multímetro, hemos llegado a la conclusión de que el teléfono va por el par (3,6) y el ADSL por el par (4,5), así que hemos cambiado la roseta de teléfono de RJ11 por dos gemeladas RJ45 con esa correspondencia en los pines, de forma que con un cable standard de red, el FRITZ!Box sea feliz. 




La pena ha sido que el teléfono no fuera por el par central, lo que nos habría permitido enchufar en cualquiera de las rosetas un teléfono directamente. Tampoco es una gran putada. Con un microfiltro se arregla  :).




El otro apaño consiste en poder usar mi Nexus One como teléfono IP y poder hacer y recibir llamadas como si estuviera en casa a través de una conexión de datos (fuera de mi WiFi). Esto, aunque parece complicado, es muy sencillo. Por defecto, por seguridad, el FRITZ!Box no permite registros SIP desde su interfaz WAN, así que ha sido necesario decirle que para mi extensión lo permita. Se da por hecho que los asistentes permiten crear extensiones de una forma sencilla y por eso no voy a entrar en ello.


Es necesario conectarse por telnet al FRITZ!Box y editar un fichero de configuración de la NVRam. Pasos:

  1. Habilitar el servicio telnet que viene deshabilitado por defecto. Desde un teléfono conectado físicamente al FRTIZ!Box, marcar #96*7*.
  2. Hacer telnet a la dirección que tenga el FRTIZ!Box (por defecto 192.168.178.1) y poner la misma clave que tiene el portal web:
    $ telnet 192.168.178.1
    Trying 192.168.178.1...
    Connected to 192.168.178.1.
    Escape character is '^]'.
    Fritz!Box web password:


    BusyBox v1.8.2 (2009-03-27 11:37:25 CET) built-in shell (ash)
    Enter 'help' for a list of built-in commands.

    ermittle die aktuelle TTY
    tty is "/dev/pts/0"
    Console Ausgaben auf dieses Terminal umgelenkt
    #

  3. Abrir el fichero /var/flash/voip.cfg
    # nvi /var/flash/voip.cfg
  4. Buscar la linea que dice reg_from_outside = no; . Esto podemos hacerlo con las flechas arriba y abajo o bien escribiendo directamente /reg_from_outside.
  5. Poner el valor a yes. Para entrar en modo edición, pulsar la tecla i y escribir normalmente. Que quede con esta pinta:
    reg_from_outside = yes;
  6. Guardar y salir. Para salir del modo edición, pusar la tecla esc y para guardar y salir, escribir :wq.
  7. Reiniciar
    # reboot
  8. Volver a desactivar el servicio telnet, por si acaso. Para esto, volver a coger el mismo teléfono de antes y marcar #96*8*.
Pues hasta aquí. Igual otro día me animo y pongo cómo configurar una cuenta VoIP con algún operador.

Personalmente, para Android utilizo el Siproid, que es bastante fácil de usar y de configurar.

Estreno

Llevo mucho tiempo pensándolo y hace unos días me hice una cuenta de blogspot (si, ya estoy mayor para montar servidores con wordpress y cosas de esas. Prefiero aprovechar el trabajo de otro, que seguramente se equivoque menos que yo :) ). La idea es escribir de lo que se me vaya ocurriendo, que en un 99% de los casos serán frikadas relacionadas con la informática. El 1% restante, se lo repartirán entre Jose Luis Rodríguez Zapatero y Alejandro Sanz... o no, ya veré xD.


Espero que guste y se aceptan comentarios.