¿Port Knocking… ofuscación o capa de seguridad?
Port Knocking no es un ingenio nuevo, lleva con nosotros desde 2003, pero es un tema recurrente en listas de correo y discusiones sobre seguridad.
¿Qué es Port Knocking?
Todos hemos visto películas en las que alguien golpea cierta secuencia en la puerta de una taberna y si la secuencia era correcta el tabernero abre una rendija para solicitar una clave verbal. Si la secuencia de llamada no era correcta, ninguna medida se toma y el interesado cree que la taberna se halla cerrada. El concepto de “Port Knocking” es exactamente análogo.
En informática, este concepto consiste en enviar paquetes a ciertos puertos en un orden específico con el fin de abrir un puerto en concreto. Este último puerto se halla cerrado por un cortafuegos siempre y cuando no se realice el barrido de puertos siguiendo la secuencia particular. De esta forma, si un atacante efectúa un escaneo del sistema, el puerto aparecerá cerrado aun estando el servicio asociado a él en funcionamiento, el cortafuegos hace un simple DROP si no se ha efectuado la secuencia de barrido previa.
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.
Si la secuencia correcta de inicializaciones ha sido efectuada, el puerto 22 se abrirá durante un lapso de tiempo determinado y únicamente para la IP que completó la secuencia previa. Una vez el puerto 22 se halle abierto, se pueden llevar a cabo medidas adicionales de autenticación.
Polémica
Muchos son los que defienden que “Port Knocking” no es una capa de seguridad sino una medida de ofuscación (“security by obscurity”). Lo cierto es que hay argumentos a favor y en contra de ambas afirmaciones.
Acudiendo a las definiciones clásicas de los tipos de autenticación (algo que sabes, algo que eres y algo que tienes), este mecanismo se encuadraría en el primer conjunto. Ahora bien, si un atacante conociera la existencia de esta medida y fuera capaz de escuchar el tráfico (en lado cliente o servidor), esta medida de seguridad sería tan débil como las contraseñas que viajan en claro.
Por tanto, como muchas otras técnicas, se trata de una línea de defensa que de manera aislada puede resultar muy débil, pero que junto con medidas adicionales puede proporcionar un nivel de robustez aceptable.
Existen una serie de consideraciones de seguridad, por ejemplo, un atacante siempre podría intentar un ataque por fuerza bruta con el fin de descubrir la secuencia de puertos correcta, no obstante este ataque sería fácilmente detectado teniendo en cuenta su naturaleza ruidosa. Para una secuencia de 3 puertos, si el ataque recorre el rango de puertos 1 a 65535, esto implica que el ataque sería del orden de 655.353 tentativas, teniendo una esperanza de la mitad de este valor. Por tanto, como media, serían necesarios unos 140 billones de paquetes hasta conseguir la apertura del puerto deseado. Obviamente, esto se puede complicar mucho más incrementando el número de puertos de la secuencia.
Si un atacante ha conseguido la secuencia de puertos, nada le impide hacer un “replay” de la secuencia capturada contra el servidor para así abrir el puerto. Sería por tanto interesante que la secuencia mutara con el tiempo, que se hiciera algún tipo de Hash con información adicional (temporal, etc.) o alguna otra medida para impedir los ataques por “replay”. No obstante ello implicaría sincronización cliente-servidor y/o involucrar otros campos de los paquetes que no fueran tan sólo los 16bits del puerto destino en la cabecera TCP. Como consecuencia de estas modificaciones, la medida se hace difícilmente escalable en situaciones donde hay un gran número de clientes.
Mucho más sencillo es hacer una denegación de servicio. Debido al lapso existente entre cada inicialización de conexión en la secuencia, un atacante puede simular y enviar paquetes para interrumpir la secuencia que está construyendo un usuario legítimo. Así, nada impide a un atacante el emplear herramientas como hping para forjar paquetes con la dirección IP de un usuario legítimo y enviar un flujo continuo hacia puertos aleatorios de la máquina servidor para que dicho usuario legítimo jamás sea capaz de completar una secuencia válida.
Por último en esta lista no exhaustiva de reflexiones, para un observador del tráfico de red, un “Port Knocking” es indistinguible de un escaneo de puertos. Muchos IDS detectan los escaneos de puertos y algunos no tienen forma de diferenciar lo que es un “Port Knocking” de lo que es un escaneo. Si el umbral de paquetes para alertar de un escaneo de puertos es lo suficientemente bajo, el “port knocking” podría introducir ruido no deseado en los logs del IDS.
Aplicaciones
Imaginemos que deseamos correr un servidor SSH para compartir archivos con nuestros amigos. No deseamos que gusanos, automatismos y usuarios maliciosos encuentren el puerto del servidor SSH abierto en sus escaneos de reconocimiento para posteriormente lanzar un ataque por fuerza bruta que consume recursos y podría dar lugar a una intrusión. En este caso podríamos emplear “port knocking” para evitar “automatismos tontos”. Obviamente, tras el “Port Knocking” deberíamos tener como mínimo una autenticación por usuario/contraseña, y además, deseablemente, autenticación basada en algún algoritmo de clave pública.
Una aplicación más oscura, y probablemente más popular, del “Port Knocking” es como método de ocultación de puertas traseras (ejemplo: cd00r.c). Muchos atacantes, tras haber instalado una puerta trasera en una víctima, la camuflan mediante “Port Knocking”, de esta forma cualquiera que intente detectar anomalías basadas en la apertura de nuevos puertos difícilmente detectará la intrusión. Así, los servicios basados en herramientas como Nesus para detectar alteraciones en ciertas redes presentan una gran punto débil ante dichos ingenios y los profesionales de la seguridad no deberían tomar sus resultados como verdades absolutas.
Po lo tanto podemos concluir que Port knocking se basa en la comunicación de información en las cabeceras de los paquetes, lo cual limita severamente la cantidad de información que puede ser transmitida, y por tanto, su fortaleza como capa de seguridad. En una futura reflexión analizaremos otras técnicas como “Single Packet Authorization” (SPA), que presenta grandes ventajas sobre el mecanismo aquí estudiado.
Emiliano Martínez Contreras (Hispasec)