Enviar Respuesta  Enviar Tema 
[howto] Toc Toc, hay alguien? (Instalando un Port-Knock Server)
Autor Mensaje
Hermes
El Alquimista


Mensajes: 461
Grupo: Registrado
Registro en: May 2005
Estado: Sin Conexión
Reputación: 8
Mensaje: #1
myBB  [howto] Toc Toc, hay alguien? (Instalando un Port-Knock Server)

La idea de este tuto es evacuar una de las dudas que surgio en este post: No dar señales en la red

La solución a esta pregunta la da un pequeño programita llamado knockd.

NOTA: Antes que nada aclaro que vamos a realizar tareas que necesitan cierta experiencia en el mundo Linux pero que no son imposibles de llevar a cabo.


La teoria:

knockd es lo que se conoce como port-knock server. Su funcion es la de "escuchar" todo el trafico en una interface ethernet o PPP (trabaja a nivel de la capa de enlace) en busca de una secuencia de "golpes" en ciertos puertos (port-hits).

Estos "golpes" (port-hits) son generados por una aplicación cliente mediante el envio de paquetes TCP o UDP al servidor. Por supuesto que los mismos no deben estar abiertos (en uso por alguna aplicacion).

Cuando el servidor detecta que una secuencia especifica de puertos han sido "golpeados" ejecuta un proceso especificado en su archivo configuracion. Esto puede ser usado, por ej., para abrir un puerto en un firewall para acceso temporario o simplemente para ejecutar un comando o script.


Ahora si!, la practica:

Lo primero que vamos a hacer es bajar la ultima version de knockd de aca: http://www.invoca.ch/pub/packages/knock/

Como veran es un RPM que contiene los fuentes que vamos a compilar con las tipicas sentencias:

./configure
make
make install


(Ok debianeros!, para Udes. tambien hay: http://packages.debian.org/unstable/net/knockd)

NOTA: Debemos tener instalados previamente los siguientes paquetes para que todo funcione bien durante la compilacion:

libpcap: es una biblioteca que implementa funciones para la captura de paquetes en una red, para lo cual coloca la placa de red en modo promiscuo.
bison: Bison es un generador de analizadores sintácticos, un sustituto de YACC ("Yet Another Compiler Compiler", otro compilador de compiladores). Es decir que es un programa que genera un programa que analiza la estructura de un archivo de texto.
flex: Flex es una herramienta para generar programas que reconocen patrones léxicos en un texto.


Una vez compilado e instalado todo vamos  a modificar/agregar opciones en el archivo de configuracion /etc/knockd.conf; en él aparecen varios "tags" que vamos a enumerar:
  
el "tag" [options] es usuado para definir opciones globales, es decir que afecten a todas las directivas; dentro de el podemos usar:

UseSyslog
Los logs son manejados a traves del syslog(). Los mensajes son enviados al archivo /var/log/messages (o equivalente)

LogFile = /path/a/un/archivo

Especifica el archivo en el que se escribiran los logs que genere el programa

PidFile = /path/a/un/archivo

Esto se usa cuando el programa corre en modo daemon, por default seria /var/run/knockd.pid

Interface = <placa_de_red>

Nombre de la placa de red donde se "escuchara" el trafico (eth0, eth1, PPP, etc.)

Luego aparecen otro "tags" que son definidos por los usuarios para distinguir entre varias directivas (en el ejemplo [openSSH]). Dentro de estas directivas de usuario podemos utilizar:

Sequence = <puerto1>[:<tcp|udp>][,<puerto2>[:<tcp|udp>] ...]

Especifica la secuencia de puertos a encontrar. (por default son TCP).

One_Time_Sequences = /path/al/archivo/one_time_sequences

Es un archivo que contiene secuencias que se usuaran una por vez en lugar de secuencias "fijas". Knockd pone un # (numeral) delante de cada secuencia una vez usadas.

Nota: Te recomiendo que dejes un espacio en blanco delante de cada secuencia porque knockd reemplaza el primer caracter de la cadena y si no lo haces la deja trunka...

Seq_Timeout = <timeout>

El tiempo en segundos a esperar para que se complete una secuencia.

TCPFlags = fin|syn|rst|psh|ack|urg

Solo toma en cuenta los paquetes que tienen estos flags activos.

Usar TCPFlags = syn es principalmente util para conexiones SSH ya que esta suele interferir y en consecuencia invalidar la secuencia de golpes...
Si queres especificar mas flags TCP los podes separar con comas (TCPFlags = syn,ack,urg) y pueden ser explicitamente excluidos anteponiendo un "!" (TCPFlags = syn,!ack)
El tema de flags TCP lo voy a dejar para otro tuto 1-wink

Start_Command = <comando>

Esto especifica el comando a ejecutar cuando el cliente realiza un port-knock correcto.
Se puede usar la variable %IP% que sera reemplazada por la direccion IP del cliente.
La directiva Command es un alias de Start_Command.

Cmd_Timeout = <timeout>

Tiempo a esperar entre Start_Command y Stop_Command. Esta directiva es opcional y es requerida solo si Stop_Command es usada.

Stop_Command = <comando>

Especifica el comando a ejecutar cuando Cmd_Timeout segundos han pasado desde que Start_Command ha sido ejecutado.


Un ejemplo:
Supongamos que necesitamos habilitar una conexion SSH a nuestro equipo conectado a internet desde nuestro trabajo. Dentro del archivo /etc/knock.conf vamos a poner las siguientes directivas:

por default nos aparece:

[options]
        logfile = /var/log/knockd.log

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn


como ves, golpendo en secuencia los puertos TCP 7000, 8000 y 9000 hacemos que nuestro firewall nos abra el puerto 22 (puerto de escucha de ssh) solo a nuetra IP... y listo!!...
Para cerrar la conexion solo debemos golpear en secuencia los puertos TCP 9000, 8000 y 7000....


ok, llego el momento de hacer que nuestro knock server arranque; en la linea de comandos ejecutamos /usr/local/sbin/knockd -d para correrlo como "demonio" o servicio (hay mas opciones desde la linea de comando pero eso te lo dejo para que lo investigues vos, jeje!)...

ahora bien, como hacemos con el cliente?.. no te desesperes que ya llega la segunda parte... 1-wink



.


/****
Si entendemos todo lo que estamos haciendo,
no estamos aprendiendo nada...
****/

02-27-2007 06:39 PM
Visita el website del usuario Encuentra todos los mensajes de este usuario Cita este mensaje en tu respuesta
warp
Q


Mensajes: 2,009
Grupo: Registrado
Registro en: Jun 2005
Estado: Sin Conexión
Reputación: 10
Mensaje: #2
RE: [howto] Toc Toc, hay alguien? (Instalando un Port-Knock Server)

bueno les dejo la versión para instalar en gentoo:

1) ejecutamos:

Código:
emerge -av net-misc/knock

2) Editamos el archivo de configuración de knock... traten de seguir las indicaciones de hermes

Código:
nano /etc/knock.conf

3) agregamos el demonio al inicio del sistema:

Código:
rc-update add knock default

4) iniciamos el demonio:

Código:
/etc/init.d/knockd start


TIP: en el caso de gentoo, para que knock trabaje con distintas interfaces, hay que editar el archivo /etc/conf.d/knock, y agregar las que deseemos de la siguiente manera:

Código:
OPTS="-d -i eth0 eth1 eth2"


bueno eso es todo, cuando hermes saque la segunda parte de su tutorial (cliente), agrego la versión gentoo.....

les dejo otro ejemplo para abrir ssh:

Código:
[options]
        logfile = /var/log/knockd.log

[openCloseSSH]
       sequence    = 9876:tcp,5432:tcp,9999:tcp
       seq_timeout = 5
       tcpflags    = syn
       cmd_timeout   = 10
       start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
       stop_command  = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT


02-27-2007 07:49 PM
Visita el website del usuario Encuentra todos los mensajes de este usuario Cita este mensaje en tu respuesta
Hermes
El Alquimista


Mensajes: 461
Grupo: Registrado
Registro en: May 2005
Estado: Sin Conexión
Reputación: 8
Mensaje: #3
RE: [howto] Toc Toc, hay alguien? (Instalando un Port-Knock Server)

Antes de seguir con el cliente de knockd voy a agregar algunas cosillas que me quedaon en el tintero...

como dije podemos levantar knockd como demonio desde la linea de comandos con el modificador -d. Ademas de esto podemos decirle cual o cuales son las interfaces desde donde queremos que escuche, podemos tambien correrlo en modo "debug" haciendo que muestre toda la info por pantalla lo cual es util para determinar si el servicio esta corriendo correctamente, etc. Aca estan todos lo parametros que podemos pasarle al iniciarlo...

-i, --interface <nombre_int> La interface en la que escuchara, por defecto eth0
-d, --daemon Para que corra en modo "demonio" o servicio.
-c, --config <archivo> El archivo de configuración, por default /etc/knockd.conf
-D, --debug Los mensaje se envian a la consola.
-v, --verbose Muestra mas informacion en la salida.
-V, --version Muestra la versión del programa.
-h, --help Ayuda
-l, --lookup Chequea nombres DNS

Notas sobre la seguridad: si bien esta ultima opcion puede ser util no te recomiendo que la uses ya que un atacante podria encontrar el primer puerto de una secuencia si monitorea el trafico DNS que sale del equipo que corre knockd (por ej, tirando una serie de pings sobre puertos TCP cerrados en lugar de contestar con un paquete ACK+RST).

por ej, si queremos levantar la aplicacion como el servicio para que escuche en la placa eth1 cargando un archivo de configuracion alternativo y que la salida la muestre por pantalla hacemos lo siguiente:

knockd -d  -v -D -i eth1 -c /etc/knockd.alternativo.conf &

El & simplemente lo pongo para que el comando corra en background y no nos "ocupe" la consola....


Ahora si, el cliente

Con la compilacion de knockd tambien se nos crea un programita llamado knock que seria el cliente...

Su uso es muy sencillo:

knock [opciones] <equipo> <puerto[1-razzrotocolo]> [puerto[1-razzrotocolo]]


las opciones:

-u, --udp Enviar paquetes UDP (por defecto envia TCP)
-v, --verbose Una salida con mas información
-V, --version Muestra la versión
-h, --help Ayuda.

Asi se ejecutaria knock desde la linea de comandos...

knock -v 192.168.0.1 7000 8000 9000

la respuesta seria:

hitting tcp 192.168.0.1:7000
hitting tcp 192.168.0.1:8000
hitting tcp 192.168.0.1:9000



Muchas veces ncesitamos acceder a equipos de nuestra red desde un cyber (nooo!!!.. Biggrinjester ) o desde un equipo que no es el nuestro y que ademas tiene instalado un Window$... como hacemos?.. por suerte existe una version cliente Cygwin/Win32 que podemos llevar encima (yo la llevo en mi pendrive 1-wink ) y usar cuando la necesitemos: http://www.zeroflux.org/proj/knock/files...cygwin.zip


CONCLUSION

Como he dicho en otras ocasiones no es posible "esconderse" del mundo si pretendes poner en linea un servicio a traves de la red, y si bien el "ocultamiento" como medida de seguridad NO representa seguridad en si misma con esto vas lograr poner un obstaculo mas a quienes pretendan acceder a tus recursos a traves de la red...


Espero que les sea util!.. 023


.


/****
Si entendemos todo lo que estamos haciendo,
no estamos aprendiendo nada...
****/

03-02-2007 11:23 AM
Visita el website del usuario Encuentra todos los mensajes de este usuario Cita este mensaje en tu respuesta
p_eter
Chaos Manager
*******
Administrador

Mensajes: 4,364
Grupo: Administrador
Registro en: Jun 2005
Estado: Sin Conexión
Reputación: 13
Mensaje: #4
RE: [howto] Toc Toc, hay alguien? (Instalando un Port-Knock Server)

03-10-2007 12:03 AM
Visita el website del usuario Encuentra todos los mensajes de este usuario Cita este mensaje en tu respuesta
Enviar Respuesta  Enviar Tema 

Posibles Temas Similares...
Tema: Autor Respuestas: Vistas: Ultimo Mensaje
  [howto]VSFTPD en Ubuntu dragonauta 0 331 08-29-2008 06:55 PM
Ultimo Mensaje: dragonauta
  [howto]Diseño Web en Linux OpenSUSE p_eter 0 126 08-19-2008 05:01 PM
Ultimo Mensaje: p_eter
  [howto] TrueCrypt p_eter 0 106 07-30-2008 01:44 AM
Ultimo Mensaje: p_eter
  [howto] Metin2 Bajo Linux Abejo 0 1,084 06-28-2008 01:46 PM
Ultimo Mensaje: Abejo

Ver la Versión para Impresión
Mandar este Tema a algún Amigo
Subscríbete a este Tema | Agrega este Tema a Tus Favoritos

Salto de Foro: