Evita que espíen tu navegación. Usa un túnel de SSH

tunel

Cuando te encuentras conectado a una red de datos existen muchas formas que un tercero puede utilizar para tener acceso a los datos transferidos: captura de tráfico en texto claro (sniffing), uso de equipos intermedios (un proxy, por ejemplo), ataques de Man-in-The-Middle, pharming, spoofing, etc. Como para cada ataque hay una contramedida, para evitar estos problemas se pueden usar comunicaciones cifradas (SSH, SSL, TLS, IPSEC), uso de cifrado en los datos directamente (PGP/GPG, SMIME, un archivo zip con contraseña, etc.), autenticación mutua empleando certificados digitales, etc.

Sin embargo, hay escenarios que requieren de un poco más de trabajo. Imaginemos lo siguiente: Estas trabajando tranquilamente en tu empresa y tienes el presentimiento que el listillo de turno está capturando tráfico y temes que el correo de Hotmail que le envías a tu novia o las fotos de la última fiesta que subes a Facebook caigan en manos no autorizadas. O necesitas acceder a un sitio web que está filtrado en la empresa y no puedes. O quieres navegar por algunos sitios con “mala reputación” (por aquello que estás aburrido y necesitas inspiración) y no quieres que queden registros de ello en los servidores de la empresa. O estás conectado al Starbucks de turno vía inalámbrica (red no confiable) y quieres evitar que capturen tu tráfico. O simplemente tienes un poco de “sana” paranoia (de esa que le hace falta a muchos) y sencillamente quieres encriptar TODO el tráfico de navegación que sale de tu equipo.  Podrías usar una VPN o si no quieres enrollarte, puedes hacer un túnel de SSH y obligar a que todo el tráfico HTTP y HTTPS sea encapsulado por ahí.

En este artículo explicaré de una forma muy sencilla cómo establecer un túnel usando SSH en sistemas operativos Windows y configurar tu browser para que todo el tráfico de navegación emplee dicho túnel.

Explicación

Secure Shell (SSH) es un protocolo y su aplicativo relacionado que permiten la conexión remota a terminales de comandos de forma cifrada. Es el remplazo del famoso y antiguo Telnet, que hacía lo mismo pero sin encriptar los datos y por ello cualquiera con un sniffer de red podía obtener las credenciales de autenticación y los datos de la sesión. Pero ahí no termina todo: SSH también permite “encapsular” (introducir datos dentro de otros datos) otro tipo de tráfico diferente al de una terminal de comandos. Y es ahí en donde aprovecharemos su fortaleza, “encapsulando” el tráfico de navegación (generalmente HTTP) dentro de una sesión de SSH.

El flujo de datos sería entonces:

  1. Usando tu navegador de Internet preferido (en mi caso uso Internet Explorer así todos me odien) “obligas” a que todo el tráfico sea redirigido a un servicio SOCKS que está escuchando (listen) localmente.
  2. Este servicio SOCKS lo que hará será enviar el tráfico a un puerto local de SSH que tienes abierto
  3. El tráfico recibido en este puerto local es cifrado y re-dirigido a un servidor SSH externo de confianza, por lo cual tú estarías actuando como un cliente de SSH
  4. El servidor externo SSH recibe los datos, los desencripta y los envía a la página web destino. Es decir: es como si estuvieras navegando desde ese servidor en vez de hacerlo desde tu equipo.
  5. La página web a la que quieres visitar contesta al servidor SSH, quien vuelve a encapsular y cifrar los datos recibidos antes de enviarlos de regreso a tu equipo.
  6. Los datos son recibidos por tu máquina y presentados al browser empleando SOCKS.
Túnel SSH

Túnel SSH

Durante todo ese transcurso, el tráfico desde tu máquina hasta el servidor SSH se encuentra cifrado.

Componentes y requisitos

Para empezar, requerirás del siguiente software:

Y los siguientes scripts en batch que puedes descargar aquí:

Download

Descarga y deja todos estos archivos en una carpeta. En mi caso – y en el de los scripts – tengo una carpeta llamada c:\ssh

Adicionalmente, necesitarás validar lo siguiente:

  • Que tienes un servidor SSH de confianza (que finalizará el túnel) ubicado en otro lugar. Si tienes en casa un enrutador inalámbrico que soporte SSH y DDNS y que puedas administrar será suficiente. Puedes usar un Raspbery Pi, un servidor SSH público o tu propio servidor en casa conectado a Internet
  • Que tienes un usuario y contraseña en ese servidor SSH de confianza
  • Que desde tu equipo puedes comunicarte con dicho servidor (esto es: que no tienes filtrado el tráfico SSH)

Configuración en el equipo Windows

Lo primero que debes hacer es generar una clave SSH para autenticar la conexión. Para ello usaremos PuTTYgen.exe. Simplemente ejecutamos el binario y generamos las claves:

Generación de claves SSH

Generación de claves SSH

Terminada la generación de claves hay que ejecutar dos acciones adicionales:

  1. Copiar la información de la clave en un documento de texto (ya la usaremos más adelante)
  2. Guardar las claves privada y pública en una ubicación segura.
Información y guardado de las claves SSH

Información y guardado de las claves SSH

Hecho esto, el paso siguiente es configurar la conexión. Para ello haremos uso de plink.exe. Editamos el script llamado “tunnel.bat” con los valores de nuestra conexión:

@echo off
:repeat
C:\ssh\plink.exe -N -P 22 -D 1080 usuario@ip -pw password -i C:\ssh\keyfile.ppk
goto repeat

Con este script simplemente parametrizo plink para indicarle que escuche localmente en el puerto 1080, se conecte al puerto 22 del servidor “ip” usando la cuenta “usuario” y el password “password” (se supone que ya deberían estar creados en el servidor SSH remoto) y emplee la clave privada “keyfile.ppk” (o el nombre que yo le haya puesto a la clave). Todo dentro de un bucle infinito para garantizar que en caso de pérdida de conexión el script seguirá reintentando hasta que se pueda volver a conectar nuevamente.

Ahora bien, resulta que tener la consola del DOS ejecutando este script continuamente en el escritorio es un fastidio. No hay problema, usamos Hstart y con ello enviamos el proceso a background. Parametrizamos Hstart con el script “start.bat”:

@echo off
C:\ssh\hstart64.exe /NOCONSOLE /D="C:\ssh" "C:\ssh\tunnel.bat"

Finalmente, para que la conexión arranque cuando inicie el equipo, simplemente creamos una clave de tipo “String Value” (REG_SZ) en el registro de Windows bajo la rama HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run de la siguiente forma:

Configuración de clave en el registro de Windows

Configuración de clave en el registro de Windows

Configuración en el servidor SSH

Como se comentó en el apartado “Componentes y Requisitos”, se supone que tienes una cuenta de usuario y una contraseña en un servidor SSH remoto de confianza. Pues bien: ingresa al servidor y ejecuta el siguiente comando:

-bash-3.2$ mkdir ~/.ssh; touch ~/.ssh/authorized_keys; chmod 700 ~/.ssh

Lo que hemos hecho aquí es crear una carpeta .ssh en el directorio raíz de nuestra cuenta, crear un archivo vacío llamado “authorized_keys” y restringirle los permisos para que solamente nosotros lo podamos acceder.

¿Recuerdas la clave que se copió en un documento de texto? Pues el siguiente paso es copiar ese string en el archivo “authorized_keys” usando vi o tu editor de texto preferido. Al terminar, el contenido debería verse de la siguiente manera:

-bash-3.2$ more authorized_keys
ssh-rsa AAAAB3NsaC1yc2EAAAABJQAAAQEAmiuxNN12ohlcEEV4FniJHIbd2uLPqZ9BJLw1BPwvFNPkHRILjAtlqiY6jHeLr2JxrXcrEyqp+bzyQH0NYECEEUzLqZbr5LglYtQu6DEATisFxiNxhfOqnTql7twDKIK0cfsJMw5XM6+b3EoYv2JUBg2yT3aV+o8j/3uWNo3XLOgbpxOd0IM74/JoYm4l2qFMaZDqa4Nividy7whCx2C/IPvuLwkyQusx5H6eqr5P0HHshMTcgE+Ta/rENxqx7pHeukRLnfBl4RpeG52pU8EjAzlgqlE3H5HlOqRETVUe3mapb9gMnOiLgSw4nwME/TK6jUZQlUcOIaVoanYxHwJ6GQ== rsa-key-20140420

Configuración del browser

Finalmente, se debe configurar el browser para que redireccione todo el tráfico HTTP al servidor SSH usando la conexión establecida. Para ello, simplemente le indicamos que usaremos un servidor SOCKS en localhost (127.0.0.1) en el puerto 1080:

Configuración del proxy en el browser

Configuración del proxy en el browser

Para probar que todo está bien, puedes o reiniciar tu equipo (la conexión debería establecerse sin problema) o ejecutar el script “start.bat” y Voilà! tienes tu tráfico tunelizado para evitar que mirones indiscretos accedan a tu valioso tráfico.

Para comprobar que estás navegando usando otra dirección IP, simplemente desde el browser configurado navega a http://show-my-ip.com/ o http://www.whatismyip.com/ y valida que aparece la dirección IP del servidor SSH de confianza en vez de la IP de tu empresa.

Precauciones

Sin embargo, no todo es alegría. Debes tener las siguientes precauciones:

  • Proteger la carpeta con los scripts y las claves: Como lo viste, la conexión vía SSH usando plink con el script almacena las credenciales de usuario en texto claro.
  • Por otro lado, la clave privada SSH generada y compartida con el servidor remoto no tiene passphrase. No la dejes sin protección.

Otras utilidades para los más prácticos

Si todo lo que he explicado arriba te ha parecido complicado, en Internet existen programas que hacen todo esto y mucho más con solo tres clics. Algunos de ellos son:

Así mismo, aquí y aquí encontrarás otros tutoriales (en inglés) para hacer lo mismo empleando PuTTY directamente.

Comentar que esta misma técnica de encapsulamiento no sólo sirve para HTTP sino también para otros protocolos como POP3, IMAP, DNS, etc.

Pues bien. Si hay dudas, comentarios o erratas, puedes escribirme en los comentarios.

PD: Agradecimientos a mi amiga Lizz Quinteros quien me pidió este tutorial.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.