Script realizado en bash para la automatización de la configuración de la técnica "Port knocking" haciendo uso de iptables.
La técnica conocida como "port knocking" permite la conexión a ciertos puertos SIEMPRE que el usuario haya realizado una serie de conexiones previas. La idea es similar a la de las cajas fuertes donde, a pesar de tener la llave de apertura, sin la combinación necesaria es IMPOSIBLE su apertura.
toctocfw.sh es un script realizado en bash para la automatización de Port-Knocking con iptables, permitiendo una fácil determinación de combinación, puerto secreto y persistencia, a través del fichero de configuración toctoc.cfg.
A pesar de que dichas conexiones previas pueden realizarse con cualquier cliente, he incluido 2 clientes uno para Windows (bat) y otro para Linux/Mac (bash) para facilitar aun más su uso.
Para el correcto funcionamiento del script deberemos disponer de credenciales de administrador y tener correctamente configurado el fichero toctoc.cfg
-
Clonar el repositorio de GitHub.
git clone https://github.com/wllop/toctocfw.git
-
Configurar el fichero toctoc.cfg (que estará ubicado en la misma ruta que el script toctocfw.sh).
-
Aplicar los permisos de ejecución al fichero del script.
chmod a+x toctocfw.sh
-
Ejecutar el script.
./toctocfw.sh
El fichero toctoc.cfg se utiliza para configurar tanto la secuencia mágica de apertura del puerto a proteger, el propio puerto o puertos a proteger con la secuencia indicada y su persistencia.
La estructura del fichero es la siguiente:
passcode=combinacion1,combinacion2,combinacionN:puertoaproteger1,puertoaproteger2:(0|1) persistencia
Ejemplo:
passcode=3000,5000,8000:22:0
- Combinacion1,combinacionN --> Aquí indicarmos tanto el orden como los puertos a los que el cliente deberá conectarse antes de que pueda conectarse al puerto "protegido".
Ejemplo:- 3000,5000,8000 --> La combinación necesaria para conectarse al puerto protegido será una conexión a los puertos 3000, 5000 y 8000 en ese orden.
- PuertoaProteger, PuertoaProtegerN --> Aquí indicarmos el puerto o puertos que sólo permitirán su conexión si previamente se ha realizado la secuencia indicada en el anterior parámetro.
Ejemplo:- 22 --> Un cliente sólo podrá conectarse al puerto 22 (SSH) sí y sólo sí, previamente ha realizado las conexiones a los puertos indicados en el campo "combinación".
- 22 --> Un cliente sólo podrá conectarse al puerto 22 (SSH) sí y sólo sí, previamente ha realizado las conexiones a los puertos indicados en el campo "combinación".
- Persistencia --> Este parámetro nos permite indicar al programa la posibilidad de que una vez establecida la conexión, cualquier nuevo intento de conexión desde esa misma IP origen será aceptada sin necesidad de conexiones previas (este modo será el persistente=1). En el caso de que queramos que cualquier nueva conexión deba repetir las conexiones previas, deberemos utilizar el modo NO Persistente (modo=0).
Ejemplo:- 0 --> Teniendo en cuenta el ejemplo del puerto protegido 22, al indicar que el modo es NO PERSISTENTE, si estamos conectados al servidor por SSH y cerramos la conexión, debermos VOLVER a repetir la secuencia de puertos previos a la conexión. Este sería el modo recomendado para las conexiones SSH. Por el contrario para conexiones HTTP/HTTPS recomiendo el modo PERSISTENTE.
- 0 --> Teniendo en cuenta el ejemplo del puerto protegido 22, al indicar que el modo es NO PERSISTENTE, si estamos conectados al servidor por SSH y cerramos la conexión, debermos VOLVER a repetir la secuencia de puertos previos a la conexión. Este sería el modo recomendado para las conexiones SSH. Por el contrario para conexiones HTTP/HTTPS recomiendo el modo PERSISTENTE.
Más Ejemplos:
passcode=6666,7777,8888:21,20:1 #Permite conexiones FTP previa combinación de conexiones a los puertos 6666,7777 y 8888. Además se ha habilitado la persistencia, por lo que una vez realizada la combinación "mágica" toda nueva conexión será aceptada.
El script lo he probado en sistemas Debian y Fedora, por lo que no debería dar problemas en otros sistemas Linux. Lo único que hay que tener en cuenta es que hace cambios en las reglas IPTABLES, por lo quederías hacer una copia de las reglas actuales para evitar "sustos" ;)
A pesar de lo dicho en el párrafo anterior, esta es una primera versión de un script que todavía se le puede dar más vueltas (lo haré) y que hay que probar más puesto que tiene alguna cosita más por "refinar".... todo llegará :)
Ni que decir tiene que aquí hemos venido a compartir y mejorar, por lo que cualquier comentario que queráis indicarme, cualquier mejora que se podría implementar es más que bienvenido.
Podéis enviarme un mail a mi correo: wllop@esat.es.
Muchas gracias!
Distributed under the Apache 2 License. See LICENSE.txt
for more information.
Walter Llop - @wllop - wllop@esat.es
Enlace Proyecto: https://github.com/wlop/toctocfw