El poder de SSH: Como bypassear un firewall de manera facil

Para los que no lo sepan SSH (openSSH para ser mas específicos) es una utilidad que nos permite gestionar una maquina *nix de manera remota, la gestión se realiza vía linea de comandos, pero como sabrán la mayoría de los entendidos en este tema, con un acceso a consola es mas que suficiente.

En ocasiones dependiendo de la funcionalidad que deseemos implementar es necesario que tengamos abierto puertos para algún servicio ya sea un servidor web, DNS, impresión ,etc. Pero en ocasiones esas posibilidades no se encuentran a nuestro alcance ya que simplemente o nuestro ISP nos tiene dentro de un NAT gigante (muchas cableras) o nuestros Modem/Router vienen capado de fabrica para que los mismos no se puedan tocar a nuestro antojo, y por ende poder abrir los puertos que requerimos.

SSH en un túnel Reverso

Como bien sabremos SSH tiene diversas funcionalidades entre las cuales destacan :forwardeo de puertos, ejecución de programas por medio del gestor X11, etc. Pero una de las mas interesantes a mi parecer y que en un sinfín de ocasiones me ha sacado de apuros es el túnel reverso. Esta funcionalidad nos da la posibilidad de redireccionar puertos hacia nosotros pudiendo así hacer bypass de cualquier firewall, haciendo una analogía es como hace muchos a~nos se realizaban infecciones con troyanos reversos.

A continuación ampliaremos mas el tema:

Regularmente una conexión SSH se realiza de la siguiente manera:

Cliente SSH ———> Servidor SSH

Como podremos observar en una conexión SSH tradicional el cliente SSH es el que realiza la conexión hacia el servidor y es así como se establece la conexión. Ahora bien, es importante considerar que para que esta conexión exista es necesario que en el servidor se tenga abierto el puerto de SSH.

En el esquema de conexión de túnel SSH reverso la conexión es hacia nosotros, para ello se ejemplificara mejor con la siguiente imagen:

Servidor A —–> Servidor C (pasarela) <——-> Servidor B

Donde imaginemos que A es el servidor donde tenemos una aplicación corriendo (un servidor web por ejemplo), C es un servidor que ocuparemos como pasarela y B sera el servidor donde requerimos ver el servidor web del servidor A.

En un esquema de funcionamiento tradicional tan solo bastaría con abrir el puerto web en el firewall del Servidor A para que el servidor B pudiera acceder de forma ordinaria al web server, pero imaginemos que por restricciones del Sysadmin, simplemente esto no es posible. Aquí es donde entra el SSH reverso. El servidor A se conectara por medio de un túnel reverso SSH al servidor C y de ahí con un cliente SSH nos conectaremos del servidor B al servidor C, para poder acceder al webserver de A.

A continuación algunos ejemplos didácticos para hacer mas comprensible esta metodología de funcionamiento.

Ver el WebService escuchando en el puerto 80 del Servidor A en el navegador del Servidor B

Servidor A < ————-> Servidor B

Sintaxis:

ssh usuario@servdorA -L 80:localhost:80

Esto lo que hará es redireccionar el puerto 80 del servidor A hacia el puerto 80 del servidor B

Túnel Reverso del servidor A al servidor C, para que el servidor B pueda acceder a la consola SSH del servidor A.

Sintaxis:

Consola servidor A:

ssh usuario@servidorC -N -R 2222:localhost:22

Donde:
-N Es una opción para que el servidor A NO PUEDA ejecutar comandos en la consola del servidor C
-R indica que es un túnel reverso.
22 Es el puerto donde esta escuchando el demonio SSH del servidor A
2222 Es el puerto donde se mandara el puerto SSH del servidor A en el servidor C

Consola Servidor B:

ssh usuario@servidorC

Después de esto una vez dentro del servidor C, tan solo nos restara hacer una conexión SSH a nuestro localhost en el puerto antes forwardeadado:

Consola servidor B:

ssh usuario@localhost -p 2222

Donde:
-p indica el puerto al cual deseamos conectarnos
2222 Es el puerto donde se forwardeo el puerto del servidor A

Lo mas interesante de esto es que al ser el túnel SSH una conexión saliente la misma no es bloqueda por el firewall, esto es algo que he probado en diversas instituciones tanto publicas como privadas y en ninguna me han bloqueado la salida de mi tunel SSH. Esto en teoría podría prevenirse con un IDS bien configurado, pero siendo honestos, es algo que nadie se toma muy en cuenta.

NOTA: a día de hoy esta funcionalidad solo la he probado en puertos TCP