sábado, 8 de mayo de 2010

Creacion de un plugin para OSSIM.

Creacion de un plugin para OSSIM.


En esta entrega revisaremos de forma rápida el método para agregar un nuevo plugin de detección a OSSIM. Básicamente, un plugin de OSSIM es un archivo en el cual se define una regla de selección con expresiones regulares en Python, para determinar el análisis de un log o registro que aún no exista para la plataforma. Siendo estrictos, cualquier registro de tipo estándar (syslog y similares) podría ser agregado como un nuevo evento a OSSIM, programando correctamente el plugin.

Antes que nada, debe explicarse un poco la estructura de identificación única de eventos en OSSIM con miras a la creación de un nuevo plugin. Cada plugin en OSSIM posee un identificador único llamado plugin_id (textualmente, es el nombre del campo en la base de datos) y a su vez los distintos eventos para cada plugin tienen su identificador llamado SID o plugin_sid (nombre del campo en la BD).
Así, y poniendo como ejemplo el plugin de SSH, podemos separar las características como:

Plugin ID (SSH) = 4003
Plugin SID para "SSH - Login Accepted" = 1 (y su plugin ID sera 4003)

Y así sucesivamente para todas las diferentes eventualidades que pudiera registrar SSH.
Entonces, a la hora de programar un plugin para OSSIM deben tenerse en cuenta dos archivos a editar; el primero será el plugin como tal (config. y expresión regular). El segundo será la información de la base de datos para la inserción del plugin en la plataforma OSSIM.
En cuanto a las expresiones regulares, tomaremos principalmente en cuenta los siguientes campos:

+ Repetición de una o más veces en un caracter
? Repetición única de un caracter o tipo
* Concuerda con cualquier caracter.
{x,y} Delimitador de repetición, mín. x, máx. y
\d Concuerda con dígitos numéricos
\s Concuerda con caracteres de espaciado.
\w Concuerda con caracteres de tipo word.
| Delimitador lógico de operación OR
. Concuerda con cualquier caracter por una vez.
\S Delimitador de negación de \s
$ Concuerda con caracter de final de línea
^ Concuerda con caracter de inicio de línea
() Delimitador de referencia a identificador.

NOTA: OSSIM posee algunos tipos predefinidos para las expresiones regulares, los cuales no usaremos en este corto tutorial.

Como ejemplo, revisaremos y programaremos un plugin para SSH.

Primero que todo, poseemos el siguiente registro que define un acceso fallido por SSH.

Nov 5 12:29:39 sshserver sshd[18186]: Failed password for admin from 172.16.15.18 port 24375 ssh2

Debemos programar una expresión que concuerde con el anterior registro. Una expresión regular para el anterior log sería

\S+\s+\d+\s+\d+:\d+:\d+\s+\S+\s+\S+\s+Failed\s+password\s+for\s+\S+\s+from\s+\d+\.\d+\.\d+\.\d+\s+port\d+\s+ssh2

Sin embargo, no es suficiente que la expresión simplemente concuerde, también debemos definir cual
es la información que se quiere obtener del evento presentado. Así, quizá nos interese saber la fecha y hora del evento, el equipo generador de la eventualidad y el nombre o dirección del servidor "atacado". Nuestra expresión regular no ha de cambiar, solamente se deberán agregar referenciadores con () en los campos que se desean rescatar.

(\S+\s+\d+\s+\d+:\d+:\d+)\s+(\S+)\s+\S+\s+Failed\s+password\s+for\s+(\S+)\s+from\s+(\d+\.\d+\.\d+\.\d+)\s+port(\d+)\s+ssh2

Estos referenciadores se leen de izquierda a derecha, por tanto la fecha sería el 1, el servidor el 2, el usuario el 3 y la IP de origen el 4.
En este momento debemos establecer el archivo .cfg para el plugin, que contiene la información de la expresión regular. En este caso se llamará SSH-proof.cfg El archivo deberá quedar de la siguiente forma:

;; ssh
;; plugin_id: 4003
;; type: detector
;; description: Ssh (Secure Shell) is a program for logging into a remote machine
;; and for executing commands on a remote machine.
;; URL: http://www.openssh.com
;;
;; $Id: ssh.cfg,v 1.12 2010/03/23 16:42:18 juanmals Exp $
#La parte de arriba es la información de autoría, en este caso textualmente copiada del plugin #SSH para OSSIM.

[DEFAULT]
plugin_id=4003 #ID asignado al plugin.

# default values for dst_ip and dst_port
# they can be overwritten in each rule
dst_ip=\_CFG(plugin-defaults,sensor)
dst_port=22

[config]
type=detector
enable=yes

source=log #Tipo de fuente, para SSH es log.
location=/var/log/auth.log

# create log file if it does not exists,
# otherwise stop processing this plugin
create_file=false

process=sshd
start=no
stop=no
startup=/etc/init.d/ssh start
shutdown=/etc/init.d/ssh stop


## rules

##
## Failed login attempts
##

[ssh - Failed password]
# Feb 8 10:09:06 golgotha sshd[24472]: Failed password for dgil from 192.168.6.69 port 33992 ssh2
event_type=event
regexp="
(\S+\s+\d+\s+\d+:\d+:\d+)\s+(\S+)\s+\S+\s+Failed\s+password\s+for\s+(\S+)\s+from\s+(\d+\.\d+\.\d+\.\d+)\s+port(\d+)\s+ssh2
"
plugin_sid=1
sensor={resolv($2)}
date={normalize_date($1)}
src_ip={$4}
dst_ip={resolv($2)}
username={$3}

Y este archivo deberá ser guardado en un directorio apropiado (en general /etc/ossim/agent/plugins) y ser referenciado en los statements de configuración en /etc/ossim/agent/config.cfg
De otra parte es necesario que los eventos capturados por el agente OSSIM con nuestro nuevo plugin sean reportados correctamente en la consola. Con este propósito debe programarse el fichero SQL para insertar el nuevo evento en la base de datos de OSSIM. Este tipo de ficheros se encuentran típicamente en /usr/share/ossim-mysql/contrib/plugins/. El fichero de nuestro flamante Uni-plugin de SSH se vería entonces de la siguiente forma:

-- SSHd
-- plugin_id: 4003

DELETE FROM plugin WHERE id = "4003";
DELETE FROM plugin_sid where plugin_id = "4003";


INSERT INTO plugin (id, type, name, description) VALUES (4003, 1, 'sshd', 'SSHd: Secure Shell daemon proof here!');

INSERT INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (4003, 1, NULL, NULL, 'SSHd: Failed password proof here!', 3, 2);

Una vez con estos dos archivos preparados, se inserta el SQL en la base de datos y se reinician los servicios de OSSIM (agente y servidor). Tendremos entonces un nuevo plugin en nuestra plataforma OSSIM.
Próximamente analizaremos el método para programar un plugin indirecto a través de OSSEC.

2 comentarios:

Unknown dijo...

Buenas tardes crislato, estuve revisando tu información sobre la creación del plugin en ossim y tengo algunas dudas puesto que deseo hacer algo parecido. Necesito hacer el plugin para un switch 3com para leer los logs del mismo. Soy muy nuevo en esto y me gustaría mucho recibir asesoría de su grupo.

Muchas gracias por su atención.

crislato dijo...

Hola Rodrigo.

Disculpa la tardanza. Por supuesto, te puedes comunicar conmigo en crislato (at) gmail.com y con gusto te colaborare en lo que requieras.

Saludos,

Crislato