miércoles, 19 de septiembre de 2007

Interceptar trafico en una red es una tarea fundamental para un administrador de red, debido a que no solo sirve para hacer un analisis de los datagramas que circulan por nuestra red, si no tambien para prevenir diversos ataques que tengan patrones de intrusion, con respecto a esto es posible tomar las medidas necesarias en tiempo real y asegurar nuestra posicion.

El analisis de trafico consiste en hacer un estudio detallado de los datagramas que circulan por nuestra red, si estos datagramas aun no han sido enrutados, es posible su alteracion y gestion en su acceso a la red.

El analisis local de los datagramas esta limitado solo a su investigacion, en ningun momento es posible su manipulacion, debido a que los datagramas locales entrantes solo son una replica de los que circulan por la red.

Entre los diferentes tipos de sistemas de seguridad que existen para la intercepcion de trafico, la principal diferencia entre IPS e IDS, es que este ultimo tiene pocas posibilidades de dar una respuesta a un ataque en tiempo real debido a que como ya se me menciono antes los datagramas son solo copias del trafico real.

Actualmente una de las herramientas de codigo abierto con la mayor reputacion en cuanto al estudio y analisis de los datagramas en red es Snort, esta herramienta puede ser gestionada de 2 formas, como IDS y como Sniffer, la forma en que Snort pueda responder a posibles patrones de intrusion en nuestra red es mediante la implementacion de un plugin llamado SnortSam, el cual se encarga especificamente de realizar respuestas activas como IDS al detectar un ataque.

Existen diferentes librerias que proporcionan ayudan para la intercepcion de trafico:

-libpcap
-libipq
-ipfw

Una caracteristica esencial que poseen los sistemas UNIX y Unix-like es su directa especializacion en redes y su implementacion para la gestion de protocolos, esta caracterista hace que la gestion adecuada del trafico de red sea una tarea imprescindible para el kernel. La parte del kernel que se encarga de la seguridad de el trafico de red atravez de los protocolos, es NETFILTER.

Las ip tables es un sistema de selección de paquetes sobre el sistema Netfilter. Se trata de un sistema totalmente extensible, cualquier modulo del kernel puede darle a iptables una tabla nueva y decir que los paquetes pasen por la misma.

La intercepcion de trafico a nivel de kernel, es implementada cuando el flujo de datagramas a estudiar es considerablemente alto, dado que hoy en dia la intercepcion de trafico se puede realizar en modo usuario.

El siguiente modulo utiliza la interfaz de netfilter que provee a nivel de kernel para utilizar los hooks que tiene la pila de protocolos:

#define __KERNEL__
#define MODULE
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/netfilter.h>
#include <linux/ip.h>
#include <asm/checksum.h> //De aqui utilizamos la ip_fast_csum
static struct list_head lista = {NULL,NULL};
//La lista es solo para funcionamiento interno de la función
static struct nf_hook_ops operations;
static unsigned int operation_hook(unsigned int hook,
struct sk_buff **skb,
const struct net_device *indev, const
struct net_device outdev, int (*okfn)
(struct sk_buff *))
{
(*skb)>
nfcache=NFC_UNKNOWN;
printk("Paquete! %d \n",(*skb)>
len);
if ((*skb)>
nh.iph>
protocol == 0x01){ //Si estamos en el icmph
(*skb)>
nh.iph>
protocol = 0x02; //Lo cambiamos
(*skb)>
nh.iph>
check=0; //Lo ponemos a 0 para calcular
(*skb)>
nh.iph>
check = ip_fast_csum((unsigned char *)(*skb)>
nh.iph, (*skb)>
nh.iph>
ihl);
(*skb)>
nfcache = NFC_ALTERED; /* Marcamos como modificado */
return NF_ACCEPT;
}
}
4
static int __init init(){
operations.list = lista;
operations.hook = (nf_hookfn *)operation_hook;
operations.pf = PF_INET;
operations.hooknum = NF_IP_LOCAL_OUT;
operations.priority = NF_IP_PRI_FILTER1;
return nf_register_hook(&operations);
}
static void __exit exit(){
nf_unregister_hook(&operations);
}
module_init(init);
module_exit(exit);
MODULE_LICENSE("GPL");
El ejemplo modifica el IP Header de los datagramas ICMP que salen de nuestro sistema atravez del kernel.

Registro del hook de netfilter
Cada paquete que salga de nuestro sistema sera analisado atravez de la funcion que sea registrada por:
int nf_register_hook(struct nf_hook_ops *reg)
Que se encuentra en la libreria linux/netfilter.h, por lo tanto el codigo con el que gestionaremos nuestra funcion es el siguiente:

operations.list = lista;
operations.hook = (nf_hookfn *)operation_hook;
operations.pf = PF_INET; //Le decimos que familia de protocolos queremos (En este caso familia TCP/IP)
operations.hooknum = NF_IP_LOCAL_OUT; //Queremos interceptar el tráfico que sale de nuestro sistema.
operations.priority = NF_IP_PRI_FILTER1;
//Le damos una prioridad
return nf_register_hook(&operations);
Se utiliza la funcion operation_hook() para que sea llamada desde el hook, en el codigo se aprecian diversas estructuras, sus objetivos son los siguientes:

struct sk_buf **skb = gestion de paquetes atravez del kernel
const struct net_device *indev = por que interfaz ha llegado
const struct net_device outdev = por que interfaz sale

La funcion operation_hook() nos retornara varios valores, dependiendo del retorno son las opciones que tendra el kernel para el uso del datagrama.

NF ACCEPT: Da acceso al datagrama.
NF DROP: Elimina el datagrama.
NF STOLEN: Gestionado por el kernel.
NF QUEUE: pon el paquete en una cola (normalmente para tratar con el
NF REPEAT: Proceso ciclico del hook

Como se puede apreciar el trafico de nuestra red puede ser facilmente capturado, manipulado o analisado de forma totalmente eficiente, y optimizado para permitir solo el trafico de datagramas legitimos para nuestros nodos, esta demas decir que los codigos estan hechos para un kernel 2.6.15, y quizas en un proximo post seguimas hablando sobre modulos del kernel para nuestra gestion de una red local e internet.

Autor: jonbaine
Mas informacion y fuente: http://www.e-ghost.deusto.es/docs/2006/conferencias/CharlaIntercepcionTrafico.pdf

2 comentarios :

  1. Anónimo dijo...

    Gracias y si necesitas algo:
    jonbaine[at]gmail[dot]com

    jonbaine

  2. Miguel dijo...

    Hombre, gracias a ti por tan excelente charla.

    honor a quien honor merece. :D