jueves, mayo 24, 2007

Libpcap y captura de paquetes

Cuando se está analizando tramas, y usando herramientas como Snort, hay que tener en cuenta cierto detalles de implementación para evitar meter la pata. He estado usando en un módulo de ossim que estoy desarrollando que no es lo mismo capturar de una interfaz física en Linux (i.e eth0), que capturar desde la interfaz cooked (i.e any). En el primer caso, la librería devuelve una estructura tal que así (de decode.h de Snort y de los ficheros includes de Linux:
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 */
};

Mientras que en el segundo caso es:
#define SLL_HDR_LEN     16              /* total header length */
#define SLL_ADDRLEN     8               /* length of address field */
typedef struct _SLLHdr {
        u_int16_t       sll_pkttype;    /* packet type */
        u_int16_t       sll_hatype;     /* link-layer address type */
        u_int16_t       sll_halen;      /* link-layer address length */
        u_int8_t        sll_addr[SLL_ADDRLEN];  /* link-layer address */
        u_int16_t       sll_protocol;   /* protocol */
} SLLHdr;

Cuando se están capturando paquetes, hay que tener cuidado con estos detalles :)

No hay comentarios: