Bienvenid@ invitado Entrar o Registrarse Beneficios Revistas digitales Podcast BriefingCenters Analytics Newsletter Boletín diario RSS

Knock, Knock knocking on heavens door…

En varios grupos de personas, p.e. pandillas o familias existe una forma de poder identificarse como miembro de este grupo sin la necesidad de utilizar palabras. Puede ser en forma de un particular tono o tonos de chiflido. Para poder acceder a ciertos lugares uno debe tocar la puerta golpeándola con una secuencia predeterminada por la gente que vigila el acceso al lugar. Pero este concepto también se puede aplicar para controlar el acceso remoto a ciertas aplicaciones dentro de un servidor. De hecho la idea ya tiene bastante tiempo y fue presentada por primera vez en una revista, SysAdmin en un artículo de Martin Krzywinski, denominado Port Knocking: Network Authentication Across Closed Ports.
La idea es la siguiente: se cierran todos los puertos, ya sea en el servidor mismo o en el firewall de frontera. Una vez cerrado se lanza un proceso tipo daemon que estará verificando los eventos generados por un firewall y almacenados en una bitácora. El cliente que desee acceder a un determinado puerto debe intentar conectarse a un conjunto predeterminado de puertos. Cuando el proceso daemon analice la bitácora podrá percatarse que hubo una serie de intentos de conexión de una misma dirección IP a un conjunto de puertos. Si la secuencia de los intentos de conexión corresponde a un acuerdo preestablecido, el puerto deseado se abrirá, en caso contrario permanecerá cerrado.
A nivel de ejemplo consideremos que un usuario desea conectarse, desde la computadora 17.56.38.2, al puerto 49 de un servidor. El que se encuentre detrás del servidor no es importante. El usuario llevara a cabo intentos de conexión a los puertos 78, 118, 67 y 5621. Esto, se vera reflejado en la bitácora del firewall de la siguiente forma:

Nov  10 15:36:26 … input DENY … 17.56.38.2:64137 FIREWALL:78 …
Nov  10 15:36:27 … input DENY … 17.56.38.2:64138 FIREWALL:118 …
Nov  10 15:36:27 … input DENY … 17.56.38.2:64139 FIREWALL:67 …
Nov  10 15:36:28 … input DENY … 17.56.38.2:64139 FIREWALL:5621 …

Cunando el proceso se de cuenta del intento de conexión a la secuencia de puertos, 78, 118, 67 y 5621 de la dirección 17.56.38.2 generará una regla para permitir la conexión a esta dirección.
Resumiendo, se abrió el puerto 49 a un usuario remoto que hizo conexiones a los puertos 78, 118, 67 y 5621. El usuario puede cerrar el puerto llevando a cabo intentos de conexión a otra secuencia de puertos, por ejemplo 5621, 67, 118 y 78. El orden de la secuencia es importante, y no recibe ningún mensaje de error de los intentos de conexión a los primeros puertos.
El esquema anterior funciona. Sin embargo, es posible que un atacante con un sniffer pueda ver la secuencia y reproducirla para tener acceso al puerto deseado. Con el objetivo de prevenir lo anterior se recomienda cifrar la secuencia e incluir dentro de ésta la dirección IP del cliente, el número de puerto, el tiempo que durará abierto el puerto y  un checksum. Por ejemplo, si se desea acceder al puerto 57 desde la máquina 83.67.12.32 durante diez minutos, los puertos a “tocar” serían los siguientes: 83, 67, 12, 32, 57, 10 y 6.
El checksum es una validación de la secuencia y está definido como la suma de los números, modulo 255. En el ejemplo, esto sería:
(83 + 67 + 12 + 32+ 57 + 10) mod 255 = 261 mod 255 = 6

La secuencia estará compuesta por siete dígitos con un valor entre 0 y 255, que pueden ser representados como bytes o caracteres. Estos, se pueden cifrar con el algoritmo que se desee (AES, Blowfish, 3DES, etc). El resultado del cifrado se codifica a números en un rango de puertos (por ejemplo en el rango de 745 a 1000). Si la secuencia sólo se compone de valores entre 0-255 y la codificación se hace con enteros sin signo (0-255) la longitud de la secuencia siempre será la misma.
Del lado del servidor, el demonio que monitorea el archivo de bitácora debe decodificar la secuencia, descifrarla y verificar el checksum. Si la secuencia esta mal formada el paso de descifrado fallará. Por otro lado, si  la secuencia fue descifrada exitosamente, el checksum tendrá que corresponder para que la secuencia sea tomada en cuenta.
El número de puertos que componen la secuencia depende de la cantidad de información codificada en el “toquido”, si la secuencia es cifrada y  la forma en que se cifró, así como el número de puertos usados para codificar la secuencia.
En la página que Martin Krzywinski mantiene sobre este esquema se cuenta con una sección sobre las diferentes implementaciones que se han hecho sobre el mismo. Existen implementaciones para todas las plataformas, siendo Unix donde más se ha implementado. También existen implementaciones para Windows, Linux, Ubuntu, Suse, Java VM, Palm OS y para el iPhone/iPod. Las implementaciones se han hecho en Perl, lenguaje C, Java, Bash, Python, PHP, VB.NET y C++.
Port Knocking es una técnica de autenticación en la que se usa al proceso que monitorea la bitácora como un agente de autenticación. Hay que notar que los datos de autenticación viajan en forma de puertos y, que en los payloads de los paquetes no contienen información alguna. Ya que no hay respuesta por parte del servidor a los “toquidos” del cliente, el uso de un sniffer del lado del cliente no servirá de nada.
Una de las ventajas que proporciona este esquema es el hecho de que un atacante no puede utilizar métodos de escaneo de puertos para determinar los que se encuentran abiertos en el servidor. Se podría pensar que el esquema es susceptible a ataques de repetición. Alguien que este escuchando el canal puede capturar la secuencia y repetirla, después correr un escaneo de puertos y ver que puerto se abrió con dicha secuencia. Sin embargo, el atacante no tendría forma de conocer la dirección IP a la que se abrió dicho puerto, por lo que no podría utilizar la secuencia para vulnerar el sistema.
Port knocking no debe considerarse como la única defensa de un servidor contra ataques externos. Es tan solo una capa más dentro de lo que es la cebolla de la seguridad IT. Es necesario que la aplicación detrás del puerto lleve a cabo su propia autenticación de la persona que está accediendo al servicio para que este seguro. También se pueden reforzar la seguridad usando listas blancas o negras.

No hay artículos relacionados.

Deja un comentario ›