Snort-output xml plugin分析

类别:软件工程 点击:0 评论:0 推荐:

Snort-output xml plugin分析

Author: gnicky  URL http://blog.csdn.net/loconfuse

对snort1.8的版本进行初步的分析,因为发现snort在2.0之后发生了相对巨大的变化,对于软件内核分析,选择较低的版本是比较合适的,最好是从作者的原始思想出发,可惜也没有作者的灵感,下载了snort-1.8,就从这个版本分析。

首先打开了manual 阅读一遍,总体上把握软件的功能,在网络应用的模式上分为三类侦听、记录、入侵检测;对输出插件大致地阐述sys_log\Database\CSV\XML\SMB_alert等方式,在这个版本中包含较多的output plugin,对于想学习插件编写的爱好者比较有学习意义。

为了便于学习,同时下载snort2.0的版本,在这个版本中,文件的分类整理规范,不像1.8中大部分的文件直接存放在主目录下。由于学习linux是个新手,对下面的文件命名也不是很有理解(以前minux操作系统没有好好学)。Contrib作为可选可增加内容的文件存放地点,Doc作为相关文档,手册的存放地点,同时也包括一些make file等文件,下面的一段内容截取自ReadMe.Plugin:

Overview:

 

Snort version 1.5 introduces a major new concept, plugins.  There are two types of plugin currently available in Snort: detection plugins and preprocessors. Detection plugins check a single aspect of a packet for a value defined within a rule and determine if the packet data meets their acceptence criteria.  For example, the tcp flags detection plugin checks the flags section of TCP packets  for matches with flag combinations defined in a particular rule.  Detection plugins may be called multiple times per packet with different arguments. Preprocessors are only called a single time per packet and may perform highly complex functions like TCP stream reassembly, IP defragmentation, or HTTP request normalization.  They can directly manipulate packet data and even call the detection engine directly with their modified data.  They can perform less complex tasks like statistics gathering or threshold monitoring as well.

主要介绍了在对libpcap抓取的packet分析中使用到的插件,包括整体上与局部上使用的两类,这种基于插件的设计模式为snort的发展提供了非常广阔的空间。

"sp_something.c"/"sp_something.h" 主要用于detection plugins,而spp_something.c以及spp_something.h用于preprocessors plugins.假如有兴趣编写插件可以通过templates中的文件来学习,希望能够成为一个优秀的plugin developer!

    假如对输出插件非常有兴趣,可以学习下文件readme.database,该文件讲述的是database输出插件的相关内容,当然没有涉及具体的工作原理。相信readme.cvs文件应该是在说如何使用csv输出插件的。根据这些规则,应该能够猜到到snort1.8的版本中的readme.xml文件讲述的是如何使用xml插件,这个文件在2.2.0中并未出现。

Etc作为一个非常重要的文件夹,其中包含了classification的文件,snort.conf配置文件等基础文件。而rules文件夹想必知道,所有的后缀为.rules的判断规则文件存放于此,可以发现一点在这些文件夹中包含makefile的两个文件,基本上makefile.am是比较简单的,下面是简单的rules样例:

## $Id$

AUTOMAKE_OPTIONS=foreign no-dependencies

 

EXTRA_DIST = attack-responses.rules backdoor.rules bad-traffic.rules \

chat.rules ddos.rules deleted.rules dns.rules dos.rules experimental.rules \

exploit.rules finger.rules ftp.rules icmp-info.rules icmp.rules imap.rules \

info.rules local.rules misc.rules multimedia.rules mysql.rules netbios.rules \

nntp.rules oracle.rules other-ids.rules p2p.rules policy.rules pop3.rules \

porn.rules rpc.rules rservices.rules scan.rules shellcode.rules smtp.rules \

snmp.rules sql.rules telnet.rules tftp.rules virus.rules web-attacks.rules \

    在SRC中存放snort的大部分源码,其中对各类功能的文件进行了分类,其中output-plugin中包含输出插件的内容,至于win32应该是为windows准备的。

 

请看对Xml输出插件的描述在snort1.8.0中:

The XML plug-in enables snort to log in SNML - simple network markup language aka (snort markup language) to a file or over a network.  The DTD is available in the contrib directory of the snort distribution. You can use this plug-in with on one or more snort

sensors to log to a central database and create highly configurable intrusion detection infrastructures within your network. The plugin will also enable you to automatically report alerts to a third party such as an incident response team or managed security service provider.

This plugin was originally developed at the CERT Coordination Center as part of the AIRCERT project. Be aware that the SNML DTD is in its early phases of development and is likely to be modified as it undergoes public scrutiny.

事实表明伴随着发展,在发布的snort2.2.0中就没有包括xml的输出插件,在网站上应该可以下载到DTD的格式,问题是对应的开发的分析XML log的软件是否能够适应,在这个问题上,程序对DTD的依赖程度非常关键。

初始目标,让snort2.2.0支持xml输出插件,分析与输出插件相关的.c以及.h文件。以下是一些尝试性的工作:

step 1、在最接近output plugin的内容中,copy 文件spo_xml.c spo_xml.h到output-plugins中,同时修改makefile的两个文件。# Makefile.in generated by automake 1.6.3 from Makefile.am.通过这个,观察“Edit the Makefile.am and add the names of the two files to the list of    names on the "snort_SOURCES" line.  Save and exit the file.  Run  "automake".这样对应的makefile.in就对发生变化,应该会在文件中的至少两个地方发生改变。比较两个版本会发现其中由于模块化的影响,对于1.8.0中的混合型编译输出结果、或者中间结果使用变量snort_XX,而在snort-2.2.0中libspo-XX被使用在spo即ouput plugin模块中。

Step 2、回到上级目录src下,分析其中可能与plugins相关的文件,plugbase.c观察中,请看其中的注释/* built-in detection plugins *//* built-in output plugins */,可见在有些地方,这些模块的分离还没有彻底完成!

对比两个版本的plugbase.c文件,发现往后的snort对switch开关量的使用相当普篇,使得可定制性很强也增加了安装部署的难度,修改的当前目标是强制使用xml输出插件(不设置开关)

OutputKeywordList是我们需要关注的一个变量类型,其中定义了能够启用的outputKeyword。下列头文件中最有可能出现的几个:

#include "plugbase.h"

#include "snort.h"

#include "debug.h"

#include "util.h"

#include "log.h"

#include "detect.h"

请看typedef struct _OutputKeywordList

{

    OutputKeywordNode entry;

    struct _OutputKeywordList *next;

 

} OutputKeywordList;基本上使用结构体_XXXX然后自定义变量类型XXXXX。关键的问题何时赋予初始值,因为这个在编译时候决定,基本上作为常量在snort中使用效率最高。

这一步留下一个问题,初始化的一堆关键词在什么时候赋给了列表?关注系统的GLOBAL变量

Step 3、在src文件夹中的makefile文件中挖掘信息,发现snort_LDADD = output-plugins/libspo.a \也就是等于间接地促使spo-xml.o\spo_csv.o等文件的生成

 回顾发生的修改,确信问题与解决方法,RegisterOutputPlugin("xml", NT_OUTPUT_LOG, XmlInit);在setupXML的函数的第一个语句中发现,而惯例的话,全部大写的变量为GLOBAL,调用了PlugBase中实现的方法void RegisterOutputPlugin(char *keyword, int type, void (*func) (u_char *))可以发现该方法是void的,没有参数返回,因此变量就保存在列表中。

 

Step 4、考虑可能发生的问题,在整个调用过程中应该不会发生问题,但是对于函数库的调用得不到保证,

#include <openssl/crypto.h>

    #include <openssl/x509.h>   openssl-0.9.7e\crypto\x509

    #include <openssl/x509_vfy.h>

    #include <openssl/pem.h>    openssl-0.9.7e\crypto\pem

    #include <openssl/ssl.h>

#include <openssl/err.h>    openssl-0.9.7e\crypto\err

这些openssl下的头文件可能导致问题,同时对于版本的问题也不得不恐惧。这也让我想起在上次的blog中所写的,在snort的install中强调with-openssl是对xml输出插件的必要支持,可见所言非虚。正好目录下有Openssl的文件夹,结果解压缩的时候发现出错了,有点遗憾!~!openssl-0.9.7e\include\openssl目录下包含了所有的文件,没有问题。

此外snml的dtd文件需要放置在合适的目录下。

按照snort2.0的过程开始工作,同时./configure的时候加上with-openssl=DIR

 

本文地址:http://com.8s8s.com/it/it32758.htm