viernes, 4 de diciembre de 2009

Introducción a un sniffer

Un sniffer en términos de informática se puede definir como un programa que nos permite capturar los paquetes que son transmitidos por una red de computadoras con la finalidad principal de estudiar nuestra red. Actualmente se pueden conseguir muchas aplicaciones de este tipo como por ejemplo: Ethereal o Wireshark.

Ahora, si prefieres construir tu propio sniffer, existe una librería para el lenguaje de programación C llamada Libpcap la cual cuenta con toda una interfaz para dicho propósito, es decir, un conjunto de funciones que te permiten configurar interfaces de red de tu maquina con la finalidad de que puedas iniciar la captura de paquetes.

Los aspectos básicos que debes de tener para que puedas iniciar la creación de tu propia aplicación de este tipo son:

->Conocimientos generales de redes de computadoras.

->Que conozcas a grandes rasgos el funcionamiento del modelo TCP/IP para que entiendas el encapsulamiento que sufren los paquetes que se transmiten por la red, esto te servira a la hora de que desees interpretar un paquete que captures.

->Lógico, que sepas programar en C.

->Que tengas a la mano los RFC’s de diferentes protocolos, como: IP, TCP, UDP, ARP, etc. Te serviran para que comprendas el funcionamiento de cada uno de estos.

->Que conozcas la estructura de las cabeceras de los paquetes que manejan los diferentes protocolos que utiliza tu red. Por ejemplo: la cabecera ethernet se encuentra especificada en el archivo ethernet.h y tiene una estructura como la que sigue:

struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; /* destination eth addr */
u_int8_t ether_shost[ETH_ALEN]; /* source ether addr */
u_int16_t ether_type; /* packet type ID field */
}

En base a esta estructura podemos identificar que tiene una longitud de 14 bytes. 6 bytes por cada dirección ethernet (MAC) y 2 bytes para el campo de ether_type (protocolo).

Cuando se interpreta un paquete, la primer cabecera que hay que extraer es la ethernet, despues en base al valor que contega ether_type identificamos que protocolo esta encapsulando, investigamos la configuración de su cabecera para que sea la proxima en extraer y despues podremos estar obteniendo el payload o carga útil, por lo que es importante conocer el tamaño de las cabeceras para irnos posicionando en el paquete.

Investigando un rato en internet puedes dar con páginas muy interesantes que contienen ejemplos y mucha información para que puedas iniciar el desarrollo de tu sniffer. En la siguiente publicación pienso poner algo de código funcional para que sirva como introducción.

No hay comentarios: