LINUCA
LINUCA - Asociación de Usuarios GNU/Linux en Cantabria
CONTENIDOS
. La Asociación
. ¡ Apúntate a socio !
. Fotos
. Los más leídos
. Autores [Actividad]
. Últimos Comentarios
. ¡Todos los titulares!
. Guía de Estilo
. Cómo publicar en Linuca
. Links cortos
. Lista de Correo
   [Mensajes antiguos]
   [Etiqueta en la Lista]
. Todas las Listas
. ¿Sugerencias?
. ¡Sindícanos!
Gràcies Bulma!
Esta página usa el código fuente de Bulma :-)
Busquedas

Ultimos kernels
(23/04/2014 12:22:52)
Debian
Última actualización
stable: 08/02/2014
testing: 23/04/2014
unstable: 23/04/2014
Sistemas Port-Knocking (13045 lecturas)
Por Jose Luis E. G.
Prometeux (http://www.linuca.org)
Creado el 01/05/2004 00:08 modificado el 01/05/2004 00:08

La teoría de estos sistemas es bastante sencilla. Consiste en correr un servidor que esta a la escucha en un interfaz indicada, esperando secuencias de "llamadas" a una secuencia de puertos, con el fin de ejecutar un comando dependiendo de la secuencia.

Pagina1/1

La teoría de estos sistemas es bastante sencilla. Consiste en correr un servidor que esta a la escucha en un interfaz indicada, esperando secuencias de "llamadas" a una secuencia de puertos, con el fin de ejecutar un comando dependiendo de la secuencia. Aunque parezca algo sencillo a simple vista, puede ser muy útil como medidas para corres comandos especiales remotamente sin necesitar de abrir un ssh.

Estas escuchas se hacen a nivel de capa de enlace, por lo que no es necesario que los puertos estén abiertos, para tener información de que puertos han recibido un "knock". Es recomendable que utilicemos una secuencia de puertos no consecutiva, no incremental o decremental, etc es decir algo que no sea fácil de averiguar por otra gente ajena a nosotros.

He encontrado un sistemad de este tipo llamado Knockd, cuyo paquete nos lo podemos bajar de:

http://www.zeroflux.org/knock/knock-0.2.1.tar.gz.

Para instalarlo basta con el típico:

./configure && make && make install,

Eso si aseguraros de tener las libpcap-dev, ya que se basa en ellas. Una vez lo hayamos compilado correctamente, podemos distinguir 3 ficheros importantes.

El Knockd es el servidor, que se ejecutara en el ordenador que queremos que este ala escucha y ejecute los comandos en función de la secuencia que mandemos. Aquí os pongo sus opciones:

-i, --interface <int> La interfaz en la que escuchara, por defecto eth0

-d, --daemon Si lo queremos corres en modo demonio.

-c, --config <file> El fichero de configuración, por defecto /etc/knock/.etc

-D, --debug Mensajes de debugging..

-v, --verbose Una salida con mas información.

-V, --version Muestra la versión.

-h, --help Ayuda.

El Knock es, por decirlo de algún modo, el llamador. Su sintaxis es muy sencilla, ya que tenemos que indicarle, el host al que queremos llamar, y la secuencia de puertos.

-u, --udp Mandar paquetes UDP, por defecto TCP

-v, --verbose Una salida con mas información

-V, --version Muestra la versión

-h, --help Ayuda.

El /etc/knock.conf, aquí es donde indicamos toda la relación de comandos con la de secuencias de puertos, así como otro tipo de configuraciones. Estos son los parámetros que podemos poner.

UseSyslog
Esto hace que se introduzcan mensajes de información en el syslog.

LogFile = /path/to/file
Archivo de log.

PidFile = /path/to/file
Cuando corre en demonio podemos indicarle un archivo PID..

Sequence = port,port,port...
Secuencia de puertos.

Protocol = tcp|udp
Que protocolo utilizaran los paquetes que nos enviaran.

TCPFlags = fin|syn|rst|psh|ack|urg
Podemos especificar la bandera de los paquetes a los que haremos caso.

Command = command
El comando que ejecutaremos, con esa secuencia. Existe una variable llamada %IP%, que contiene la ip del que nos ha mandado la secuencia de puertos.

Ahora pasemos a la versión practica. Lo primero que tenemos que hacer es escribir nuestro knock.etc, para ello podemos indicar conjuntos como estos:

[Abrir el FTP para mi]
sequence = 7000,8000,9000
protocol = tcp
timeout = 5
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 21 -j ACCEPT

[Cerrarmos el FTP]
sequence = 9000,8000,7000
protocol = tcp
timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 21 -j ACCEPT

Ahora corremos el knockd en el host en el que queremos ejecutar comandos: knockd -i eth0 -v. Despues ya solo falta utilizar el knock, es decir el llamador cuando queramos ejecutar algo. Un ejemplo de salida seria el siguiente:

Cliente:
# /usr/local/bin/knock -v 192.168.1.1 7000 8000 9000
hitting tcp 192.168.1.1:7000
hitting tcp 192.168.1.1:8000
hitting tcp 192.168.1.1:9000
#
Servidor:
./knockd -v
listening on eth0...
192.168.1.3: Abrir el FTP para mi: Stage 1
192.168.1.3: Abrir el FTP para mi: Stage 2
192.168.1.3: Abrir el FTP para mi: Stage 3
192.168.1.3: Abrir el FTP para mi: OPEN SESAME
running command: /sbin/iptables -I INPUT -s 192.168.1.3 -p tcp --dport 21 -j ACCPET

Pues esto es todo, y espero que os sea tan útil como a mi me lo ha sido. Podeis encontrar mas información aquí:

http://www.zeroflux.org/knock/
http://www.linuxjournal.com/article.php?sid=6811
http://www.narcotize.com/blog/archives/000005.html

Imprimir
Version para
imprimir

Imprimir
Version
PDF
Comentarios
1.  Re: Sistemas Port-Knocking (06/05/2004 17:36, #1646)
  Por: Paladdin (http://www.linuca.org)
La idea básica de este servicio consiste en enviar información secreta de forma abierta para obtener acceso a un servicio inseguro... ¿dónde está la ventaja?

En mi humilde opinión, esta clase de servicios lo único que ofrecen es una falsa sensación de seguridad. Personalmente no soy partidario de alcanzar la seguridad a través del oscurantismo.

Si realmente quisiera seguridad, utilizaría retos criptográficos (sshd) u otros mecanismos para certificar el origen de los datos como, por ejemplo, paquetes TCP firmados con MD5 (RFC2385).

Estos mecanismos me parecen más útiles para esconder servicios maliciosos de los ojos de administradores despistados... :D

 
2.  Re: Sistemas Port-Knocking (06/05/2004 20:19, #1647)
  Por: El cobarde anónimo
> La idea básica de este servicio consiste en enviar información secreta de forma abierta para obtener acceso a un servicio inseguro... ¿dónde está la ventaja?

Erróneo.
La idea básica de este servicio consiste en enviar información secreta de forma abierta para obtener acceso a CUALQUIER servicio, seguro o inseguro.

La ventaja está en que, de primeras, eliminas un número (ya sea alto o bajo) de ataques, muchos de ellos automatizados (piensa en el último worm para windows, tipo blaster).

> En mi humilde opinión, esta clase de servicios lo único que ofrecen es una falsa sensación de seguridad.

No es falsa. Es verdadera. Piensa, por ejemplo, que tienes una shell disponible por completo escuchando en un puerto. No es más seguro tener que hacer una llamada primero para que se abra el puerto, y sólo a tu ip?

> Si realmente quisiera seguridad, utilizaría retos criptográficos (sshd) u otros mecanismos para certificar el origen de los datos como, por ejemplo, paquetes TCP firmados con MD5 (RFC2385).

Quién dice que por utilizar un sistema port-knocking tengas que dejar de utilizar cifrado de ningún tipo?

Nadie ha dicho, ni dirá si es medianamente inteligente, que el port-knocking deba sustituir a ninguna otra medida de seguridad. Sólo que es una medida de seguridad añadida.

La seguridad por la obscuridad es mala cuando es la única seguridad. Es buena cuando forma parte de un complejo de sistemas de seguridad.

 
3.  Re: Sistemas Port-Knocking (07/05/2004 09:44, #1649)
  Por: Paladdin
Añadir más capas de seguridad de forma gratuita aumenta la complejidad de los sistemas y, no cabe duda, también las posibilidades de que estas capas incurran en errores de implementación que, lejos de protegernos, expongan la seguridad del ordenador.

Por ejemplo, por su propia naturaleza secuencial, un sistema port-knocking está expuesto a ataques DoS muy sencillos. Imaginemos por un momento que se bombardean con paquetes puertos aleatorios del host comprometido. Con una cantidad relativamente muy pequeña de tráfico impediríamos el acceso a los servicios escondidos tras el port-knocking, confundiendo con ruido al dominio de escucha. Sigo considerando que para abrir un puerto es más indicado un simple paquete UDP encriptado que una serie de paquetes TCP a discreción.

Añadir una capa de seguridad pequeña sobre una capa de gran seguridad me sigue pareciendo una idea poco afortunada... ¡Claro, que sólo es mi humilde opinión! -Apoyada por argumentos técnicos-

 
4.  Re: Sistemas Port-Knocking (31/05/2004 01:55, #1746)
  Por: El cobarde anónimo
Ya se que no es lugar mas idóneo, pero bueno.

He hecho un programa que se queda escuchando un puerto y ejecuta el comando pasado con fork y execlp, para ello duplico los pipes de entrada/salida/error y capturo/envio lo que deseo realizar...

La pregunta es ¿como envío enter,ctrl-c, o tecla de función al pipe stdin?, para enviar una cadena lo hago con:

write (stdin_pipe[1], str, strlen (str) * sizeof (char));

write (stdin_pipe[1], "\n", sizeof (char));


 
Calificacion
***0
Votos: 19
SECCIONES
Artículo
Truco
Noticias
Breve
Enlace
Linuca
Libros
Tira ECOL
Tira Ecol
Modificado: 5/8/2007 17:13:50 | Tiempo Total: 0.005 segs | Kernel: Linux - x86_64 - 2.6.18-xen | Last Boot: 03/12/2010 01:21 CET
Powered By WEB-Bulma   Apache   Mysql   PHP   Gimp