Port Knocking con iptables

Existe software desarrollado, como knockd, que nos permite utilizar una técnica de protección muy interesante: Port Knocking La idea es que, cuando se da una secuencia concreta de conexiones a determinados puertos, se habilita otro, que es nuestro objetivo final. Por ejemplo, tenemos deshabilitado el acceso al servidor SSH y, tras recibir una secuencia de conexión a los puertos 2000, 2002 y 50005, se activa la conexión, para esa IP de origen, al puerto 22 del SSH. Es una técnica más de las utilizadas para la fortificación de SSH (no es la panacea, ya que se puede descubrir la secuencia fácilmente, pero ya se sabe que cuanto más azúcar, más dulce).

Esta función se puede desarrollar  de manera muy sencilla con iptables y el módulo recent (que gestiona listas dinámicas de IPs  y que ya utilizamos para controlar el número de conexiones entrantes desde una misma IP en esta entrada). La siguiente lista de órdenes habilitaría el acceso al servicio SSH para la IP de origen desde la que se intente la conexión (en la secuencia correcta) a los puertos 2000 y 3000:

/sbin/iptables -N CADENA_PASO2
/sbin/iptables -A CADENA_PASO2 -m recent --name PASO1 --remove
/sbin/iptables -A CADENA_PASO2 -m recent --name PASO2 --set
/sbin/iptables -A CADENA_PASO2 -j LOG --log-prefix "ENTRANDO EN PASO 2: "
/sbin/iptables -I INPUT -m recent --update --name PASO1
/sbin/iptables -I INPUT -p tcp --dport 2000 -m recent --set --name PASO1
/sbin/iptables -I INPUT -p tcp --dport 3000 -m recent --rcheck --name PASO1 -j CADENA_PASO2
/sbin/iptables -I INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name PASO2 -j ACCEPT

Con estas reglas, debemos activar la política por defecto a DROP, para la cadena INPUT; también necesitamos una regla ACCEPT, para el puerto de origen 22 para cualquier destino en la cadena OUTPUT.

Para conectarnos, podemos ejecutar uno de los siguientes bloques de órdenes:

nmap -sn -PS2000 --host_timeout 200 --max-retries 0 servidor
nmap -sn -PS3000 --host_timeout 200 --max-retries 0 servidor
ssh [email protected] # Ahora está permitido 
telnet servidor 2000
telnet servidor 3000
ssh [email protected] # Ahora está permitido 

Con la segunda opción, los telnets estarán esperando a que salte el timeout y con 5″ de ventana de tiempo…

En cuanto a la primera:

  • “-sn”: No port scan
  • “-PS4000”: TCP SYN al puerto 4000
  • “–max-retries 0”: que no intente ningún reenvío
  • “–host-timeout 200”: que espere 200ms

Si queremos emular al conocido personaje Seldon Cooper,  y sus 3 “toques” cada vez que llama a una puerta, solo debemos añadir un puerto y su correspondiente fase más. Así, por ejemplo, para que la secuencia de activación de SSH sea: 4000, 2000, 3000, deberíamos configurar las iptables de la siguiente manera:

/sbin/iptables -N CADENA_PASO2
/sbin/iptables -A CADENA_PASO2 -m recent --name PASO1 --remove
/sbin/iptables -A CADENA_PASO2 -m recent --name PASO2 --set
/sbin/iptables -A CADENA_PASO2 -j LOG --log-prefix "ENTRANDO EN PASO 2: "
/sbin/iptables -N CADENA_PASO3
/sbin/iptables -A CADENA_PASO3 -m recent --name PASO2 --remove
/sbin/iptables -A CADENA_PASO3 -m recent --name PASO3 --set
/sbin/iptables -A CADENA_PASO3 -j LOG --log-prefix "ENTRANDO EN PASO 3: "
/sbin/iptables -I INPUT -m recent --update --name PASO1
/sbin/iptables -I INPUT -p tcp --dport 4000 -m recent --set --name PASO1
/sbin/iptables -I INPUT -p tcp --dport 2000 -m recent --rcheck --name PASO1 -j CADENA_PASO2
/sbin/iptables -I INPUT -p tcp --dport 3000 -m recent --rcheck --name PASO2 -j CADENA_PASO3
/sbin/iptables -I INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name PASO3 -j ACCEPT

Estas líneas que implementan la funcionalidad port knocking se deben añadir a los filtros que tengamos en nuestro servidor (o router, pero en este caso las reglas anteriores deben ir a la cadena FORWARD) y debemos tener en cuenta que:

  1. Las comunicaciones para SSH (o el servicio que sea) deben estar INHABILITADAS.  Con, por ejemplo, /sbin/iptables -P INPUT DROP lo logramos. La activación se hace con las órdenes del port knocking. Si no queremos ser tan drásticos: /sbin/iptables -A INPUT -p tcp –dport 22 -j DROP
  2. Debemos tener una regla que habilite las conexiones establecidas. Si no, nuestra sesión durará 5″ 🙁 Por ejemplo, una podría ser: /sbin/iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

¡Espero que os sea útil!

 Referencias

  1. man iptables
  2. Guía avanzada de nmap elaborada en conjunto por CSIRT-CV y el Centro Criptológico Nacional (CCN)