domingo, diciembre 21, 2008

Ficheros de registro de Snort Unified 2, primera parte

Hace algún tiempo estuve implicado con ossim añadiendo soporte para poder leer los ficheros de registro unified que genera Snort en los agentes para mandar la información al server de correlación. Ahora me gustaría modificar lo que hice para que sea capaz también de leer ficheros unified2, el nuevo formato que han implementado los autores de Snort para almacenar tanto alarmas como los flujos de datos de los paquetes que lo causan. Lo primero que he tenido que hacer es documentarme el formato, puesto que sólo hay información en el código fuente.

El nuevo formato no tiene cabeceras que identifiquen el fichero (como si ocurre en el formato unified), y que cada fichero no es más que un conjunto de eventos y los paquetes de datos asociados a lo mismos. Todos los DWORD (unit32_t) y WORD (uint16_t) son enteros de 4 y 2 bytes respectivamente big endian ("network byte order"). La estructura de un evento almacenado en el fichero es la siguiente:

  1. Una cabecera de dos palabras de 32 bits. El primer DWORD indica el tipo de registro y el segundo la longitud total del evento almacenado.
  2. Una estructura que dependerá del valor de campo tipo, y en su caso, de los datos del paquete. Tal como se recoge en la siguiente tabla:

#defineValorEstructura
UNIFIED2_PACKET2Unified2Packet
UNIFIED2_IDS_EVENT7Unified2Event
UNIFIED2_IDS_EVENT_IPV672Unified2Event6
UNIFIED2_IDS_EVENT_MPLS99Unified2Event_MPLS
UNIFIED2_IDS_EVENT_IPV6_MPLS100Unified2Event6_MPLS

En caso de estar grabando un paquete de datos (representado por la structura Unified2Packet),tras esta va los datos del paquete.

Estructuras C

Las estructuras C que representan los eventos están a continuación. Todos los campos tienen los bytes en network byte order (big endian). Las estructuras que representan eventos especial tienen varios campos comunes que se repiten en las estructuras que están en la siguiente tabla:

CampoTipoDescripción
sensor_idDWORDIdentifica el sensor que ha generado el evento.
event_idDWORDIdentificador del evento.
event_secondDWORDPara almacenar una marca temporal de la generación del evento.
event_microsecondDWORD
signature_idDWORDIdentifica a la regla de Snort que ha generado ele vento.
generador_idDWORDIdentifica el módulo de Snort que generado el eventos.
signature_revisionDWORDRevisión de la regla
classification_idDWORDIdentifica la clase a la que pertenece la alerta generada. Esto se configura en Snort a través de la sentencia config classification
priority_idDWORDIdentifica la prioridad de la regla que ha generado la alerta.

El resto de los campos de cada estructura son específicos de cada uno de los eventos.

Unified2RecordHeader
Esta estructura de datos está presente al principio de todos los eventos que se almacenan en el fichero. Su longitud es de 8 bytes.
typedef struct _Unified2RecordHeader
{
    uint32_t type;
    uint32_t length;
} Unified2RecordHeader;
Unified2Event
typedef struct _Unified2Event
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    uint32_t ip_source;
    uint32_t ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
} Unified2Event
Unified2Packet
Esta estructura de datos tiene una particularida:Los últimos 4 bytes, representados po el campo packet_data se sobreescriben con los primeros del paquete de datos.
typedef struct _Unified2Packet
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t packet_second;
    uint32_t packet_microsecond;
    uint32_t linktype;
    uint32_t packet_length;
    uint8_t packet_data[4];
} Unified2Packet
Unified2Event6
typedef struct _Unified2Event6
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    struct in6_addr ip_source;
    struct in6_addr ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
} Unified2Event6
Unified2Event6
typedef struct _Unified2Event6
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    struct in6_addr ip_source;
    struct in6_addr ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
} Unified2Event6
Unified2Event_MPLS
typedef struct _Unified2Event_MPLS {     uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    uint32_t ip_source;
    uint32_t ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
    uint32_t mpls_label;
} Unified2Event_MPLS;
Unified2Event6_MPLS
typedef struct _Unified2Event6_MPLS
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    struct in6_addr ip_source;
    struct in6_addr ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
    uint32_t mpls_label;
} Unified2Event6_MPLS

Referencias

  1. Snort
  2. Understanding Snort's Unified2 output

Technorati Tags:

No hay comentarios: