13.7.06

PortKnocking, abriendo puertos bajo demanda

Se conoce como portknocking a la técnica de abrir puertos utilizando una combinación de llamadas a un grupo de puertos en concreto en una concreta secuencia, es decir, girando la rueda de nuestra caja fuerte (atacando puertos) en una secuencia de números secretos (grupo de puertos) para poder abrirla (abrir un puerto).

Partiendo de un firewall que lo deniega todo, un script perl vigila el log del firewall en busca de una secuencia de llamadas a puertos concreta que actúa a modo de password, desbloqueando la ejecución de una aplicación o una línea de comandos. La secuencia de llamadas se realiza utilizando el software cliente de la propia aplicación, la cual debe estar instalada en los equipos remotos desde los que queremos accecer al servicio oculto (también puede estar en un lápiz usb).

Veamos una configuración simple partiendo del paquete knockd disponible para Debian.

1.- Instalamos el paquete

pequerrecho:~# apt-get install knockd
....
Configurando knockd (0.4-1) ...
Not starting knockd. To enable it edit /etc/default/knockd

2.- Modificamos /etc/default/knockd para permitir que knockd arranque en el inicio de sistema
START_KNOCKD=1
3.- Editamos /etc/knockd.conf y configuramos nuestros servicios

[options]
logfile = /var/log/knockd.log
[abrirCerrarSSH]
sequence = 874, 29, 173
seq_timeout = 5
tcpflags = syn
start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

4.- Reiniciar el servicio
pequerrecho:~# /etc/init.d/knockd restart

A partir de este momento, nuestro sistema será invisible a los portscanners pero utilizando el cliente knock y la secuencia de puertos que hemos establecido, podemos abrir el puerto bajo demanda:

pequerrecho:~# knock 194.224.52.4 874 29 173


Existe un cliente portknocking para Windows, cuyo funcionamiento no he verificado llamado It's Me.

1 comentario:

Anónimo dijo...

No es necesario tener el cliente "knock". Se puede hacer, por ejemplo con telnet o incluso rederigiendo el flujo con cat.

Con telnet la cosa seria
telnet IP_EQUIPO PUERTO; telnet IP_EQUIPO PUERTO2; etc

Un saludo y muy bueno el blog.