Hace ya unas semanas que hice una primera introducción a esta téctica, y en este post, pretendo ampliarla, empezando con algunos ejemplos, y viendo algunas cositas mas…

Para empezar, en el anterior post, comente una primera teoria, pero veamos un primer ejemplo ilustrativo:

Tomemos como ejemplo un demonio sshd escuchando en el puerto 22/TCP.
Elegimos como secuencia de barrido la sucesión 43, 6540 y 82. El puerto
22 se abrirá si, y solo si, un usuario inicializa conexiones TCP hacia
los puertos 43, 6540 y 82 en ese orden exacto. En caso contrario el
usuario recibirá como respuesta un RST/ACK cuando intenta comenzar una
conexión hacia el puerto 22.

Como podeis ver en el ejemplo ( que es tal cual el que recibi), hablan de un demonio (o servicio) que «escucha» un puerto en concreto, pero que si antes no se ha iniciado una conexión con los puertos adecuados, este puerto original permanece «ofuscado», y el cliente recibira RST/ACK (para los que no conozcan, es un cierre de conexión), ya que segun el protocolo tcp/ip, se requiere, antes de iniciar ninguna transmisión de datos, la negociación de una conexión entre el cliente y servidor.

Bien, una vez que se ha realizado la conexión a los puertos adecuados, se podrá iniciar la conexión con el servicio ofrecido, pero que problemas existen?

Desde el punto de vista de la seguridad (algo que sabes, algo que eres, algo que tienes), esta técnica, se podría encuadrar en el primer grupo, algo que sabes, ya que sabes una cierta combinación para hacer algo. Pero un atacante con experiencia, que intentase acceder a un sistema que ha ocultado el acceso usando port knocking? si dicho atacante, fuese capaz de escuchar tráfico, bien en el lado cliente o bien en el lado servidor, sería capaz de encontrar la secuencia de conexión sin mucho problema, por eso insistire en que esta técnica de manera aislada no sirve de nada, pero en conjunto con otras técnicas de autentificación puede resultar muy últil.

Y para terminar con esta entrega, veremos un par de consideraciones de seguridad:

Si un atacante pensara resolver el problema por fuerza bruta, intentando conectarse a todo el rango de puertos, mediante combinaciones de tres en tres (suponiendo tres el numero de puertos de la combinación) la cantidad de paquetes necesarios sería tan elevada que sería muy facilmente detectable, pero si elevamos la cantidad de puertos, la complejidad del problema se dispara exponencialmente.

Otro problema viene dado por los ataques de denegación de servicio, ya que entre que un cliente (de los de verdad) se conecta a cada uno de los puertos, hay un lapso de tiempo que puede ser aprovechado por un atacante para que construyendo un paquete adecuado, tire por tierra el intento de conexión del cliente de verdad, y os dejo la pregunta en el aire, como haria esto?

Y antes de acabar, dos preguntitas para que reflexioneis sobre el tema:

¿Qué ocurre si un atacante consigue la secuencia de puertos (y suponemos que no hay más medidas de seguridad por detras)? ¿Cómo se puede resolver este problema? ¿Qué tienen que ver aquí los mutantes?

Desde el punto de vista de un sistema para detectar intentos de intrusión por scaneo de puertos, el port knocking le es indistinguible de un scaneo de puertos normal y corriente. ¿Que pasaría con los ficheros de logs del sistema de detección?

Reflexionar sobre ello y en la 3º y última entrega veremos aplicaciones de esta técnica y una conclusión final de este tema.

Enlaces: Port Knocking (I)

Este post está mas enfocado a aquellos que tienen un cierto conocimiento de redes, ya que de lo que hoy voy a hablar se trata de ocultación o más bien ofuscación de puertos en redes tcp/ip.

El otro día recibí en un mail de un boletín de seguridad de Hispasec, esta interesante técnica de «seguridad» que sin ser muy buena por si sola, combinada con otras medidas, puede ser muy efectiva.

Y puesto que es algo un poco largo, lo iré haciendo en varios artículos.

Bien, empezamos.

Para hacer una analogía os preguntare, alguno/a cuando erais pequeños no habéis tenido una cabaña, una casa club (no de alterne) o no habéis querido que entren a vuestro cuarto sin que antes hagan una combinación de golpes en la puerta, o una melodía?

En la antigüedad, cuando se reunían ciertos grupos perseguidos, habitualmente ponían una cierta combinación de golpes en la puerta para que se le pidiera una identificación, ya que si el que llamaba no empleaba dicha combinación, nadie respondía y parecería que el lugar estaba vacío, si por el contrario se conocía la combinación, alguien se asomaba y le requería una contraseña.

Bien, la técnica de port knocking se basa en esto mismo, pero trasladado a los puertos empleados por los servidores en internet.

Vamos a suponer que estamos diseñando una aplicación para un cliente, en la cual queremos que solo ese cliente pueda acceder, pero que si alguien intenta hacer un ataque contra ese servidor, y hace un scaneo de puertos, no le aparezca como activo (cerrado).

Aplicar port knocking a esta situación es sencilla, basta con que la aplicación cliente abra conexión con una secuencia de puertos establecida (combinación de golpes a la puerta), si la secuencia es válida, el servidor pasará a abrir el puerto de trabajo, mientras que sino lo es, no hará nada.

Una vez se ha establecido la conexión con el puerto de trabajo, lo normal es que se pida una identificación al cliente para comprobar su autenticidad, ya sea vía usuario-password, tarjeta u otros métodos.

Pero es esta técnica infalible? como ya dije antes, no! pero como saltarse esta barrera lo veremos en la próxima entrega (quizá la semana que viene, o la siguiente, según me de y me lo permitan mis examenes).

Mientras os animo a que penséis y no busquéis la solución en la red, ya que sino no desarrollareis vuestro pensamiento.