guía

Como hacer (casi) todo con túneles SSH.

por Lógico (@LogicoDev)
28 de Noviembre, 2018 ⏱ 08:30 AM

En este post te mostramos algunas de las muchisimas cosas que podemos hacer con túneles SSH, desde copiar archivos hasta reemplazar TeamViewer y saltar restricciones de firewalls.

Imágen de portada

El protocolo SSH o Secure Shell, como también es conocido, es un método para iniciar sesiones seguras entre computadoras. Como tiene un cifrado sólido permite una fuerte autentificación y por ende, protege la seguridad e integridad de las comunicaciones. Sabiendo esto, tenemos una alternativa segura para rlogin o telnet, pero también, como SSH es un protocolo, podemos utilizarlo para muchas más cosas que "solo" iniciar sesiones remotas.

Para está guía principalmente utilizamos SSH en Linux, pero sirve también para MacOS. En Windows tenemos varias alternativas. La más popular es PuTTY, aunque nosotros que somos locos por la linea de comandos preferimos λcmder que tiene incorporado un cliente SSH. A todo esto, Windows 10 versión 1803 ya viene con un cliente activado por defecto para utilizarlo en POWERSHELL o CMD. En otras versiones anteriores de Windows 10 hay que habilitar manualmente esta característica.

Antes de comenzar, lo primero son las aclaraciones de los parametros de los comandos:

<user> : Nombre de usuario a conectarse, por ej : root
<port> : Puerto local o remoto, por ej : 22 que es el defecto de SSH
<remote> : Dirección de IP, nombre de host o FQDN, por ej : 192.168.1.1 o example.com
<local_path> | <remote_path> : Ruta donde se encuentra o donde se quiere guardar un archivo o directorio, ej: /home/usuario/ o /home/usuario/test.txt

SSH 101.

Lo primero que podemos hacer es... conectarnos e iniciar sesión en un host remoto (duh). Esta es la función principal y para lo que fue creado el protocolo.

ssh <user>@<remote>

Si el servidor remoto usa otro puerto SSH distinto al 22, utilizamos el modificador -p

ssh -p <port> <user>@<remote>

Una vez hecha la conexión, el host remoto solicitará el password y ¡voilá!, ya tenemos control sobre la computadora. Como veras querido lector, ahora podes ingresar toda clase de comando y el equipo responderá fielmente. ¿Genial no?. A medida que vayamos trabajando con este protocolo nos vamos a dar cuenta que es realmente molesto tener que ingresar la contraseña cada vez que nos tratamos de conectar. Máxime porque la contraseña es segura (espero que no sea abc123 o password ಠ_ಠ), la alternativa que tenemos es la de crear certificados y utilizar la infraestructura de clave pública. De esta manera ya nos olvidamos de andar ingresando contraseñas. Próximamente en un quickie te vamos a mostrar como hacerlo.

Copiar archivos.

Con SCP podemos copiar archivos entre hosts de manera segura a través de un túnel SSH. El siguiente comando copia un archivo desde un host remoto al nuestro.

scp <user>@<remote>:<file_path> <local_path>

Montar un directorio remoto.

Muchas veces se puede poner complicado andar tranfiriendo archivos, editarlos y volverlos a subir al host remoto. Generalmente pasa en desarrollo web, que se edita un script y se sube al servidor para testear. Pero no teman, llega SSHFS al rescate. Lo que hace es montar un directorio remoto de manera similar a como seria conectar un pendrive en la computadora. Podes navegar, editar, eliminar archivos como si estuvieran en la computadora local pero en el host remoto. Una maravilla.
SSHFS no viene por defecto, así que hay que instalarlo

Ubuntu/Debian

sudo apt-get install sshfs

En Mac OSX hay que descargar SSHFS y FUSE de la página de osxfuse. En Windows podemos utilizar SSHFS-Win.

Para montar el directorio primero hay que crear un directorio (<local_path>) donde se va a montar el directorio remoto (<remote_path>) y luego:

sudo sshfs -o allow_other,defer_permissions <user>@<remote>:<remote_path> <local_path>

Saltar el filtro de internet.

Si por alguna razón tu ISP o en tu red local ponen restricciones o filtros para el acceso a sitios web y no podes acceder directamente al contenido, te cuento que SSH tiene una solución para vos. La idea es que hagamos un túnel proxy SOCKS 5 hasta un host remoto, desde allí se acceda al sitio y sea enviado a nosotros por el túnel encriptado, saltando así la restricción. Lógicamente el host tiene que estar fuera de la red. Un ejemplo básico, estás en un Wifi público, inicias una conexión SSH a una computadora en tu casa. Configuras el navegador para que pase el trafico por el proxy y a partir de ahí todas las páginas que visites van a ser como si estuvieras navegando desde tu casa. La configuración es sencilla:

 ssh -D <port> -f -C -q -N <user>@<remote>

-D: Puerto local donde acceder el túnel proxy. -f: El proceso corre en el fondo. -C: Comprimir la información antes de mandarla. -q: No ver los mensajes en la consola. -N: Indicamos que no vamos a mandar comandos por el túnel.

Una vez ejecutado el comando tenemos que configurar el navegador de la siguiente manera, el siguiente es un ejemplo en Firefox, buscamos con la palabra "proxy" y en configuración de red se completa así

Configuración proxy SOCKS5

Acá nosotros utilizamos el <port> 8123, pero podriamos utilizar cualquiera arriba del 1025 hasta el 65536.

Alternativa a TeamViewer.

Si no tenes dinero para pagar la suscripción de TeamViewer, podes acceder a los equipos mediante SSH y rdesktop o el escritorio remoto de Windows. Ahora lo que hacemos es forwardear la conexión, que básicamente es perforar el firewall, para acceder a la red interna sin tener que estar abriendo puertos. Para esto necesitamos tener una computadora o router con acceso SSH desde internet. Luego iniciamos el túnel con

ssh -L <port>:<remote_windows>:3389 <user>@<remote>

<remote_windows> es la computadora remota a la que queremos conectarnos. Notese que 3389 es el puerto de RDP por defecto. Entonces ahora lo que tenemos que hacer es iniciar rdesktop o escritorio remoto con la dirección de conexión localhost:<port>. En linux por ejemplo seria

ssh -L 9999:192.168.1.22:3389 root@179.0.0.1
rdesktop localhost:9999

Hacking 101.

Acá vamos a hacer hacking en el sentido original de la palabra: "Individuo que se dedica a programar de forma entusiasta, o sea un experto entusiasta de cualquier tipo". O como lo define Richard Stallman

Hackear significa explorar los límites de lo posible, con un espíritu de astucia juguetona

Yendo a lo nuestro, puede pasar, que muchas veces ni siquiera tenemos la posibilidad de abrir un puerto en el firewall para acceder a la computadora a la que se va a realizar la primera conexión por SSH (también conocido como bastión). Es entonces que tenemos que hackear un poco.

El escenario es el siguiente: Necesitamos conectar la computadora HostA con HostB, pero no se pueden conectar entre ellas (los firewalls no lo permiten). Lo que hacemos es utilizar un tercer equipo HostC al cual pueden conetarse el HostA y HostB.

Diagrama SSH

Mediante túneles reversos y forwardeo de puertos podemos lograrlo.

En HostB ejecutamos

ssh -n A -R 9097:localhost:22 sleep 999999999 &

En HostA ejecutamos

ssh -n A -L 9098:localhost:9097 sleep 999999999 &
ssh -p 9098 localhost

De esta manera logramos conectar 2 equipos que no tenían acceso entre ellos. Y así terminamos este post sobre las bondades de SSH. Por cualquier sugerencia o corrección en la caja de comentarios.

Portada

unsplash-logoClaudia Soraya