Que tal si querés asegurar tu router/firewall para evitar los accesos de administración externos pero no para vos. Que digas: Abrete sésamo y asi como si nada tuvieras una SSH lista para administrarlo sin preocuparte por dejar ese puerto expuesto cuando lo dejés de usar?. Bueno, hoy te voy a explicar una técnica bastante olvidada que es el Port Knoking. (knock Knock, who is?)

El Port Knocking es una técnica que se basa en detectar intentos de acceso a una lista de puertos y si el orden es correcto (Como si fuera un código secreto) ejecutar determinada acción, que casi siempre es abrir todos los puertos hacia la ip de la que provienen los intentos de acceso.

Estos puertos no puede ser secuenciales ya que la idea es que no se ejecuten de casualidad.

Ejemplo: Estoy desde mi casa y necesito acceder a la administración de un router/servidor en la oficina y este tiene todos los puertos bloqueados en su firewall. Necesito una regla que me de acceso al mismo. Para esto ya dejé previamente configurado una app que si hago «telnet» a los puertos: 1001, 3001 y 2001 secuencialmente en menos de 1 minuto abran todos los puertos a la IP de donde estoy intentando conectarme. Esta técnica se llama: Port Knocking

Para probar esta técnica hice laboratorios en Linux (Debian 12) y Mikrotik RouterOS 7. Es un feature bastante moderno, aunque la técnica es vieja, y relacionado con servidores principalmente linux de ahí que no tenga análogos similares en muchas marcas. En Windows Server por ejemplo se puede lograr pero emulando Knockd, la app que usaremos en Linux, con Cygwin.

Cómo vamos a probar solo el acceso al router/server debian, solo nos hace falta la interfaz NAT y el dispositivo. Ya que probaremos el acceso a ssh en Debian y en el router solo la cadena INPUT para el puerto 8291(Winbox).

Debian 12

En Linux primero configuraremos la interfaz NAT/Internet en dhcp y anotaremos la ip para hacer las pruebas. Instalaremos el paquete UFW que es un firewall muy sencillo de implementar para poder cerrar todos los puertos y realizar nuestras pruebas. En GNS3 ya está instalado el paquete de OpenSSH-Server, sino lo instalaremos también.

debian@debian:~$ sudo apt install ufw openssh-server
#Habilitamos el firewall
debian@debian:~$ sudo ufw enable
#Vemos que puertas tiene abiertos.
debian@debian:~$ sudo ufw status numbered 
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443                        ALLOW IN    Anywhere
#Como vemos están los puertos 22,80 y 443 abiertos así que eliminamos las reglas para cerrar todos.(Asegurate de estar sentado frente al equipo o que tenes acceso al emulador para hacerlo, sino te vas a quedar afuera)
debian@debian:~$ sudo ufw delete 3
debian@debian:~$ sudo ufw delete 2
debian@debian:~$ sudo ufw delete 1

Ahora probaremos desde nuestra terminal los puertos que tiene abiertos para asegurarnos que el firewall hace su trabajo.

Todo cerrado.

Port Knocking

En este momento nos queda instalar la app que usaremos.

#Instalamos
debian@debian:~$ sudo apt install knockd
#Abrimos la config
debian@debian:~$ sudo nano /etc/knockd.conf
#Modificamos por nuestra propia secuencia y luego restart: systemctl restart knockd

Como se ve en la imagen al ejecutarse nuestra secuencia abriremos los puertos usando un comando de iptables. También podemos reemplazar esta secuencia por ufw allow ssh o simplemente podemos usarla para reiniciar algún servicio, por ejemplo: /etc/init.d/apache2 restart . Las posibilidades son infinitas y podemos generar nuestros propios comandos remotos sin siquiera conectarnos al equipo.

Usando este servicio igualmente el comando abre el puerto/los puertos a todas las ips que pregunten.

RouterOS

Yo te lo explico clarito pero si querés visitar la documentación técnica es por acá: https://help.mikrotik.com/docs/display/ROS/Port+knocking

Port Knocking en RouterOS se basa en la detección de hits en determinados puertos previamente configurados, en un orden específico y en una ventana de tiempo, como ya explique antes. La diferencia es que en Mikrotik se hace el «if» como si estuvieramos programando.

Ejemplo de ACLs de filtrado:
Una ip hace un hit en el puerto 1001, agendo en «lista1» durante 30 segundos.
Si una ip de la «lista1» hace hit en el puerto 3001, agendo en «lista2» por 30 segundos.
Si una ip de la «lista2» hace hit en el puerto 2001, agendo esa ip en la lista: «Habilitada» por 1hora.
La siguiente regla de Firewall dirá:
Habilitar el «INPUT» a todas las ips que están en la lista: «Habilitada»

De esa forma hacemos el diagrama lógico que seguiremos para detectar la ip de origen que está ejecutando el Port Knocking.

/ip/firewall/filter add action=add-src-to-address-list address-list="Lista1" address-list-timeout=30s chain=input dst-port=1001 in-interface-list=WAN protocol=tcp

/ip/firewall/filter add action=add-src-to-address-list address-list="Lista2" address-list-timeout=30s chain=input dst-port=3001 in-interface-list=WAN protocol=tcp src-address-list="Lista1"

/ip/firewall/filter add action=add-src-to-address-list address-list="Habilitada" address-list-timeout=30m chain=input dst-port=2001 in-interface-list=WAN protocol=tcp src-address-list="Lista2"

/ip/firewall/filter add action=accept chain=input in-interface-list=WAN src-address-list="Habilitada"

Que un router traiga una funcionalidad como esta es increible.

Cómo ejecutamos esta técnica desde el exterior?

Bastante sencillo con Nmap:

#En linux si la ip Wan de tu router es: xx.xx.xx.xx
for x in 1001,3001,2001; do nmap -p $x -Pn xx.xx.xx.xx; done

Con telnet:
telnet xx.xx.xx.xx 1001
telnet xx.xx.xx.xx 3001
telnet xx.xx.xx.xx 2001

con Netcat:
nc xx.xx.xx.xx 1001
nc xx.xx.xx.xx 3001
nc xx.xx.xx.xx 2001

Casos de Uso

En el caso de un router los casos son bastante sencillos:

Administración remota del dispositivo
Abrir puerto para una VPN
Abrir puerto para una conexión RDP, Tunel SSH, etc
Del lado interno, permisos de internet, permisos de paso a una vlan de servidores

En el caso de un servidor Linux las opciones son infinitas como comandos queramos ejecutar:
Un backup
reinicio de un servicio
habilitar un usuario
Bloquear un servicio, usuario
Agregar una ACL al firewall y un gigantesco Etc.

El Port Knocking es una navaja suiza en manos de un Arquitecto de redes, usé con precaución.

Por Jeremías Palazzesi

Solucionador de Problemas Senior!. No podés con algo?, probá conmigo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


Verificado por MonsterInsights