El golpeo de puertos (del inglés port knocking) es un mecanismo para abrir puertos externamente en un firewall mediante una secuencia preestablecida de intentos de conexión a puertos que se encuentran cerrados. Una vez que el firewall recibe una secuencia de conexión correcta, sus reglas son modificadas para permitir al host que realizó los intentos conectarse a un puerto específico.
El propósito principal del golpeo de puertos es prevenir un escanéo de puertos por parte de un atacante que busca posibles servicios vulnerables. Como los mismos solo se abren ante un golpeo de puertos correcto. Normalmente los puertos donde se brindan los servicios se muestran aparentemente cerrados.
Una vez que sabemos qué es el Port knocking y sus utilidades, vamos a ver el modo de instalarlo y utilizarlo, tanto en modo servidor como cliente. Para ello podemos hacer uso de varias herramientas, una de ellas es knockd, que incluye tanto el demonio (Servidor) como el cliente así que será lo que instalemos en ambas partes.
Los paquetes precompilados y código fuente se pueden descargar desde el sitio de knockd, para Debian y derivados podemos instalarlo directamente desde los repositorios:
$ sudo apt-get install knockd
Una vez instalado, la configuración básica, requiere por un lado habilitar el servicio (que no arrancarlo), para ello debemos modificar la variable START_KNOCKD de 0 a 1 en el fichero /etc/default/knockd. Veréis que al instalar os ha indicado lo siguiente:
* knockd disabled: not starting. To enable it edit /etc/default/knockd
Ese fichero tiene dos variables, una la comentada y la otra en la que especificamos la interfaz de red en la que escuchará knockd y cualquier otro parámetro que queramos pasar al demonio:
################################################ # # knockd's default file, for generic sys config # ################################################ # control if we start knockd at init or not # 1 = start # anything else = don't start # # PLEASE EDIT /etc/knockd.conf BEFORE ENABLING START_KNOCKD=1 # command line options KNOCKD_OPTS="-i eth1"
Y el otro fichero de configuración es en el que especificamos las opciones de logging y las secuencias que queramos configurar para abrir y cerrar puertos, es el fichero /etc/knockd.conf. Vemos que por defecto estamos mandando los logs a syslog y que hay dos secuencias, una para abrir el puerto 22 (SSH) para una IP y otra para cerrarla. La primera con la secuencia de puertos TCP 7000,8000 y 9000 y la segunda a la inversa:
[options] UseSyslog [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
Esta es la configuración por defecto, si quisiéramos probarla podemos arrancar el demonio (/etc/init.d/knockd start) o ejecutarlo manualmente ampliando el debug y ver directamente en STDOUT el funcionamiento. Voy a probarlo en local contra la interfaz «lo» y añadiendole verbose:
# knockd -i lo -v listening on lo...
En el lado del cliente utilizaremos el comando «knock», es tan sencillo como pasarle la IP seguida de los puertos y el protocolo (si es tcp no hace falta ponerlo). Para nuestro caso anterior, si quisieramos abrir el puerto 22 para nuestra IP haríamos lo siguiente:
$ knock localhost 7000 8000 9000
Y una vez ejecutado veremos en el log o en STDOUT si lo hemos ejecutado a mano:
127.0.0.1: openSSH: Stage 1 127.0.0.1: openSSH: Stage 2 127.0.0.1: openSSH: Stage 3 127.0.0.1: openSSH: OPEN SESAME openSSH: running command: /sbin/iptables -A INPUT -s 127.0.0.1 -p tcp --dport 22 -j ACCEPT
Y para cerrarlo:
$ knock localhost 9000 8000 7000
Y el log:
127.0.0.1: closeSSH: Stage 1 127.0.0.1: closeSSH: Stage 2 127.0.0.1: closeSSH: Stage 3 127.0.0.1: closeSSH: OPEN SESAME closeSSH: running command: /sbin/iptables -D INPUT -s 127.0.0.1 -p tcp --dport 22 -j ACCEPT
A partir de aquí conviene investigar ya que las posibilidades son infinitas, jugando con las secuencias de puertos, flags tcp (syn, ack…), timeouts de secuencias, comandos a ejecutar, etc. Os recomiendo esta entrada de Kriptopolis donde profundizan más en sus posibilidades.
Un comentario en “Port knocking en Debian con knockd”
Comments are closed.