27 nov 2017

SSH Tunneling: Jugando a lo Super Mario Bros entre túneles

El otro día en el trabajo, junto con mi compañero Borja González toco trastear para ver si era viable proponer un túnel SSH para realizar las pruebas, por ello he dedidio escribir esta entrada de blog, donde vamos a ver cómo crear un túnel en SSH, antes de entrar en detalle, se muestra una definición de la Wikipedia, en la que explica que es un túnel:


También desde la Wikipedia se puede obtener para que sirve un túnel SSH:


¿Por qué querríamos crear un túnel en SSH? Por diversos motivos, entre ellos:
  • Evitar Firewalls. 
  • Mandar la información por un canal seguro. 
  • Evitar restricciones, como pueden ser las que ponen en una empresa para visitar X página, o en un determinado país a usar un servicio. 
  • Realizar Pivoting
Aquí se va a realizar una prueba de concepto en local, vamos a imaginar el siguiente escenario:
  • Conexión a una red no confiable (¿verdad que nadie se conecta a este tipo de redes?)
  • Queremos establecer una conexión segura a un determinado FTP - [IP: 192.168.0.197].
  • Contamos corriendo un servicio SSH en un servidor, o nuestro PC de casa (IP estática) 
  • [IP: 192.168.0.196]
Vamos a usar OpenSSH, para establecer este túnel tendremos que ejecutar un comando en la terminal como sigue:

ssh <Usuario@HostConSSH> -L <PuertoLocal>:<HostConFTP>:<PuertoFTP>

Si definimos las máquinas: 


  • Máquina A → Nuestro PC, que se encuentra conectado a la red no confiable. 
  • Máquina B → Máquina corriendo SSH con IP: 192.168.0.196. 
  • Máquina C → Máquina corriendo FTP con IP: 192.168.0.197 (objetivo). 
En nuestro caso, el comando quedaría como sigue:


ssh josue@192.168.0.196 -L 9999:192.168.0.197:21

Ahora vamos a explicarlo: 


  • josue@192.168.0.196: Indicamos el usuario SSH y la dirección donde se encuentra corriendo el servicio (Máquina B). 
  • -L 9999:192.168.0.197:21: Aquí decimos que en nuestro PC, la Máquina A, se ponga a “escuchar” el puerto 9999, y que la conexión a 192.168.0.197 (Máquina C) al puerto 21, se realicé en la máquina que corre el SSH. 
De esta manera ya tenemos configurado el túnel. Es importante ver que la conexión entre nuestra máquina y el servicio SSH en 192.168.0.196 irá cifrada, pero que desde esta máquina al FTP no irá cifrada, por lo tanto, habría que usar FTPS o SFTP. 



Para conseguir ver mejor el concepto, se deja una imagen con un pequeño esquema de como sería el escenario:



Todavía no se ha conectado al FTP, para ello desde una terminal, ejecutaremos:

ftp localhost 9999


Como podemos ver la conexión se realiza al túnel, que comienza en nuestro PC (Máquina A), por ello localhost, en el puerto 9999.



Ya estaríamos conectados a través de una máquina intermedia al servicio FTP que queríamos. Si capturamos el tráfico con tcpdump o Wireshark, veremos las conexiones, a continuación, un ejemplo usando tcpdump (sudo tcpdump -A dst 192.168.0.196):


Si se filtra con destino 192.168.0.197 (Máquina C) no capturaremos ningún paquete.

Para seguir profundizando y aprendiendo sobre este concepto y ver nuevas aplicaciones, como saltar entre máquinas, podéis leer el siguiente artículo de Pablo Gónzalez (@pablogonzalezpe): ¡Salta conmigo! Metasploit, Meterpreter, SSH, Port-Forwarding, Túneles & Exploits.

Hasta aquí llega el post. Un saludo.


Autor: Josué Encinar García (@JosueEncinar). Ingeniero de Software, estudiante del Máster Universitario en Seguridad de Tecnologías de la Información y de las Comunicaciones en la Universidad Europea de Madrid. Analista de Seguridad en Accenture. Co-Fundador de Ciberbyte.