snort源码分析
㈠ linux下按装snort遇到了包依赖关系.
要么yum install snort;
要么yum install rpmlib libdnet.1 libpcap.so.1 libsfbpf.so.0,然s后rpm -ivh snort-2.9.2.3-1.RHEL6.I386.RPM
要不rpm -ivh snort-2.9.2.3-1.RHEL6.I386.RPM --nodeps装上,但不一定能用
㈡ type 8E是什么文件系统
Snort分析报告
1.--snort的简介
snort 是一个基于libpcap的数据包嗅探器并可以作为一个轻量级的网络入侵检测系统(
NIDS)。所谓的轻量级是指在检测时尽可能低地影响网络的正常操作,一个优秀的轻量
级的NIDS应该具备跨系统平台操作,对系统影响最小等特征并且管理员能够在短时间内
通过修改配置进行实时的安全响应,更为重要的是能够成为整体安全结构的重要成员。
Snort作为其典型范例,首先可以运行在多种操作系统平台,例如UNIX系列和Windows 9
X.(需要libpcap for Win32的支持),与很多商业产品相比,它对操作系统的依赖性比
较低。其次用户可以根据自己的需要及时在短时间内调整检测策略。就检测攻击的种类
来说,据最新数据表明(2000/12/4)snort共有21类(???)1271条检测规则,其中包括
对缓冲区溢出,端口扫描和CGI攻击等等。SNORT集成了多种告警机制来提供实时告警功
能,包括:syslog、用户指定文件、UNIXSocket、通过SMBClient使用WinPopup对Windo
ws客户端告警。 Snort的现实意义维作为开源软件填补了只有商业入侵检测系统的空白
,可以帮助中小网络的系统管理员有效地监视网络流量和检测入侵行为。
2.snort与其他工具的比较。
Snort的主要用途就是网络监视、数据包的记录和检测入侵行为,下面是与分别具有上述
两种功能的典型工具的比较。
1)--snort与tcpmp的比较
Tcpmp是最为经典的嗅探工具,主要是用于记录网络数据,网络故障的探测诊断工具。
Snort与它的最大的共同之处在于都是基于libpcap的并且支持BPF过滤机制,所以本质上
都是调用的捕获数据包的库函数,但是snort的目的不仅仅是在于记录这个数据包而是从
安全的角度考虑出发区解析它,并且tcpmp主要是分析第二层或者第三层的报文来进行
网络故障诊断,而snort则主要针对于应用层的数据进行分析从而实现检测入侵行为。除
此之外,由于tcpmp旨在快速完整地记录流量,所以它制定了特殊的输出格式,速度快
但是不易看懂,而snort就提供了更为友好的输出格式,有利于系统管理员的直接分析。
--Figure 1 - Typical Snort telnet packet display:
--------------------------------------------------------------------------
20:59:49.153313 0:10:4B:A9:66 -> 0:60:97:7:C2:8E type:0x800 len:0x7D
192.168.1.3:23 -> 192.168.1.4:1031 TCP TTL:64 TOS:0x10 DF
***PA* Seq: 0xDF4A6536 Ack: 0xB3A6FD01 Win: 0x446A
FF FA 22 03 03 E2 03 04 82 0F 07 E2 1C 08 82 04 ..".............
09 C2 1A 0A 82 7F 0B 82 15 0F 82 11 10 82 13 FF ................
F0 0D 0A 46 72 65 65 42 53 44 20 28 65 6C 72 69 ...FreeBSD (elri
63 2E 68 6F 6D 65 2E 6E 65 74 29 20 28 74 74 79 c.home.net) (tty
70 30 29 0D 0A 0D 0A p0)....
---------------------------------------------------------------------------
--Figure 2 - The same telnet packet as displayed by tcpmp:
---------------------------------------------------------------------------
20:59:49.153313 0:10:4b:d:a9:66 0:60:97:7:c2:8e 0800 125: 192.168.1.3.23 >
192.168.1.4.1031: P 76:147(71) ack 194 win 17514 (DF) [tos 0x10] (ttl 64,
id 660)
4510 006f 0294 4000 4006 b48d c0a8 0103
c0a8 0104 0017 0407 df4a 6536 b3a6 fd01
5018 446a d2ad 0000 fffa 2203 03e2 0304
820f 07e2 1c08 8204 09c2 1a0a 827f 0b82
150f 8211 1082 13ff f00d 0a46 7265 6542
5344 2028 656c 7269 632e 686f 6d65 2e6e
6574 2920 2874 7479 7030 290d 0a0d 0a
---------------------------------------------------------------------------
2)--snort与NFR的比较
根据Denmac System公司1999年11月的现有商用网络入侵检测工具的调查结果表明,NFR
的综合性能指数高于ISS公司的RealSecure和CA公司的SessionWall,所以其代表了目前
国际上的IDS的最高水准,是一个比较成熟的商业产品。Snort的许多设计思想类似于NF
R,但是在很多方面都显出不足之处,例如无法实现IP Defragmentation等功能,在探测
规则语言的格式上来说,NFR采用的是一种深层次的脚本语言,SNORT与其相比就略显单
薄。但是snort的优势就在于它是开源软件,全世界的爱好者都可以加入它的开发升级工
作中来,其前景是无法限量的。
2.--原理
snort作为一个NIDS[注:基于网络的入侵检测系统(NIDS),其工作原理为在基于共享
网络上检测原始的网络传输数据,通过分析捕获的数据包,主要工作为匹配入侵行为的
特征或者从网络活动的角度检测异常行为,进而采取入侵的预警或记录。从检测模式而
言,snort属于是误用检测(misuse detection)。[注:该方法对已知攻击的特征模式
进行匹配,包括利用工作在网卡混杂模式下的嗅探器被动地进行协议分析,以及对一系
列数据包解释分析特征。]从本质上上来说,snort是基于规则检测的入侵检测工具,即
针对每一种入侵行为,都提炼出它的特征值并按照规范写成检验规则,从而形成一个规
则数据库。其次将捕获得数据包按照规则库逐一匹配,若匹配成功,则认为该入侵行为
成立。目前,snort的检测规则库主要包括了以下几类的入侵行为:
snort的结构主要分为三个部分如图n-1:
l--数据包捕获和解析子系统(Capture Packet Mechanism from link layer and the
packet decoder ):
该子系统的功能为捕获网络得传输数据并按照TCP/IP协议的不同层次将数据包进行解析
。Snort利用libpcap库函数进行采集数据, 该库函数可以为应用程序提供直接从链路层
捕获数据包的接口函数并可以设置数据包的过滤器以来捕获指定的数据。(的详细介绍
请参阅附录N)。网络数据采集和解析机制是整个NIDS实现的基础,其中最关键的是要保
证高速和低的丢包率,这不仅仅取决于软件的效率还同硬件的处理能力相关。对于解析
机制来说,能够处理数据包的类型的多样性也同样非常重要,目前,snort可以处理以太
网,令牌环以及SLIP等多种链路类型的包。
l--检测引擎(the detect engine)
检测引擎是一个NIDS实现的核心,准确性和快速性是衡量其性能的重要指标,前者主要
取决于对入侵行为特征码的提炼的精确性和规则撰写的简洁实用性,由于网络入侵检测
系统自身角色的被动性——只能被动的检测流经本网络的数据,而不能主动发送数据包
去探测,所以只有将入侵行为的特征码归结为协议的不同字段的特征值,通过检测该特
征值来决定入侵行为是否发生。后者主要取决于引擎的组织结构,是否能够快速地进行
规则匹配。
Snort采用了灵活的插件形式来组织规则库,即按照入侵行为的种类划分为相应的插件,
用户可以根据需要选取对应的插件进行检测。目前包括的插件分别如下:
每一类插件中包括了数十条的检测规则,分别代表同一类型的不同入侵行为。对于规则
的定义,snort使用了一种简单的,轻量级的规则描述语言,上述已经提及到检测的最终
行为就是检测数据包中协议的不同字段,例如端口号就是重要的入侵线索。为了更为清
楚地阐述这个问题,我们举一例说明:
攻击名称--NT IIS Showcode ASP
攻击种类--获取非法访问权限。
攻击描述--通过构造特定的URL请求可以非法阅读服务器上的其他文件http://attack
host/msadc/Samples/SELECTOR/showcode.asp?source=/msadc/Samples/../../../../.
./boot.ini
入侵特征码 --IP地址:保护网段以外的IP地址。
--协议类型:TCP
--端口:80
--TCP标志位:PUS, ACK
--数据段内容:/selector/showcode.asp
CVE ID--CAN-1999-0736
Bugtraq ID --167
分析以上的这个入侵实例,我们可以看出其实检测该入侵行为的关键是判断端口号和数
据段内容,IP地址、协议类型和TCP标志位只是辅助的特征码。但是当开始分析原始数据
包时,是否应该就直接匹配端口和数据段的内容?无疑针对该入侵行为上述做法的匹配
效率是最高的。但是实际上这样做会降低整体检测的效率,因为入侵系统要对庞大的网
络数据逐一进行检测,应该遵循先检测所有入侵行为的共同特征其次才是个体特征的原
则,例如如果首先检测IP地址,一旦发现并不属于检测范围之内,就立即检测下一个数
据包而并非继续检测该包的其他字段。这样既保证了检测的快速性,又提高了报警的实
时性。
Snort正是按照上述原则定义规则的,将检测规则划分成两个部分:规则头和规则选项。
前者是所有规则共有的包括IP地址、协议类型、端口号,后者根据不同规则包括相应的
字段关键字,例如TCP的标志位或者窗口大小等。检测规则除了包括上述的关于“要检测
什么”还应该定义“检测到了该做什么”,snort定义了三种处理方式——alert(发送报
警信息),log(记录该数据包)和pass(忽略该数据包)并定义为规则的第一个匹配关键
字,这样设计的目的非常简单,旨在在程序中组织整个的规则库,即将所有的规则按照
处理方式组织成三个链表以用于更快速准确地进行匹配,体现了设计者的巧妙之处。
下面我们来举一实例来具体说明规则的定义:
alert tcp !$HOME_NET any -> $HOME_NET 80 (msg:"CAN-1999-0736 - IIS-showcode"
;flagsA; content:"/selector/showcode.asp"; nocase
该实例正式针对表(N)中所示的入侵行为所定义的检测规则,通过该例可以看出snort
的规则语言简明实用,基本格式为:
规则动作 协议类型 IP地址 端口号 -> 协议类型 IP地址 端口号 (规则选项)
源发送方 目的接受方
关于规则的具体书写规范不再赘述,下面就其关键和特别之处加以说明:
1.-- 变量和操作符
snort作为一个NIDS,主要的目的就是能够保护本网段即及时发现外部网对内部网的攻击
,所以规则中的IP地址的定义主要是针对外部网和内部网地址两种。由此snort引入了变
量的机制,即可以在规则中用变量表示IP地址字段,用户在运行前可根据实际的子网地
址来定义该变量,这样在解析检测规则时snort会自动替换变量值,增加了规则的灵活性
,不过只适应于像IP地址这种基本所有规则都具有同一值。
为了更为准确地表达规则和精确地表示检测范围,snort还定义了三类操作符:
l--否定操作符——“ ! ”
用于表示snort还增加了否定符“!”来区分内部网和外部网。例如例n的!$HOME_NET。
l--方向操作符——“->”和”<>”
用于表示传输的方向,分别表示单向和双向传输。
l--端口描述符——“ : ”
用于表示端口的范围。例如: “600:“表示大于600的端口号。
2. 规则选项
规则选项作为检测时的重要标准组成了snort入侵检测引擎的核心,既易用又非常灵活强
大。首先其灵活性是指可以根据不同的不同行为制定相应的检测选项内容,其次其强大
性是指不仅检测具有一定的广度和深度并且定义了检测到时该做什么 。snort中有15个
规则选项关键字,其中有三个关键字是做为检测到后的回应:
msg - 在报警和包日志中打印一个消息
logto - 把包记录到用户指定的文件中而不是记录到标准输出
resp - 主动反应(切断连接等)
Resp关键字可以对匹配一条Snort规则的流量进行灵活的反应(flexible reponse
-FlexResp)。FlexResp代码允许Snort主动地关闭恶意的连接。该模块合法的参数如下
:
rst_snd - 向发送方发送TCP-RST数据包
rst_rcv - 向接受方发送TCP-RST数据包
rst_all - 向收发双方发送TCP_RST数据包
icmp_net - 向发送方发送ICMP_NET_UNREACH
icmp_host - 向发送方发送ICMP_HOST_UNREACH
icmp_port - 向发送方发送ICMP_PORT_UNREACH
icmp_all - 向发送方发送上述所有的ICMP数据包。
作为入侵检测系统,理论上只需要检测入侵,并不需要去回应入侵行为的。所以该功能
应该是作为SNORT的附加功能,但是值得一提的是,发送RST和ICMP UNREACH数据包向攻
击方可以暂缓其对目标主机的攻击,我们所研究的一个工具叫做dsniff中的tcpkill就是
利用这个原理进行切断非法连接,但是对于一般的拒绝服务攻击,该方法的作用就不甚
明显了。对于SNORT来说,实现该功能必然会降低检测的的效率尤其是在网络流量特别大
的时候。
另外12中关键字都是针对协议中的不同字段设置的:
关键字--检测内容--主要针对的攻击行为
ttl--检测ip头的ttl的值 --用于对traceroute探测的检测
id--检测ip头的分片id值--黑客的固定攻击,例如设置为31337
dsize--检测包的净荷尺寸的值--缓冲区溢出攻击。
content--在包的净荷中搜索指定的样式--最为重要的一个选项,用于在数据包的数据段
中搜索指定的内容并根据数据触发响应,可以搜索包含混合的文本和二进制数据。并设
置了三个辅助关键字:offset,dsize,nocase
Flags--检测tcp flags的值--非法端口扫描或者其他非法探测主机操作系统类型等。
Seq--检测tcp顺序号的值--检测主机发送的序列号集是否是固定的集合。入侵者可以利
用该值冒充合法用户向被入侵者发送数据,伪装正常的通信以窃取信息或者其他非法活
动。
Ack--检测tcp应答(acknowledgement)的值--Nmap的TCP PING会设置该项的值为0,从而
判断可能正在用Nmap进行非法扫描。
Itype--检测icmp type的值--拒绝服务攻击。注:只作为其中的一种特征。
Icode--检测icmp code的值--可疑的流量。
Session--记录指定会话的应用层信息的内容--记录在TCP会话中的会话数据。
Icmp_id--检测ICMP ECHO ID的值--
Icmp_seq--检测ICMP ECHO 顺序号的值--
Ipoption--监视IP option的特定代码--
Rpc--监视特定应用/进程调用的RPC服务--检测非法的RPC请求,查看RPC请求,并自动将
应用(Application),过程(procere)和程序版本(program version)译码,如果
所有三个值都匹配的话,该规则就显示成功。
3.预处理程序
预处理程序从Snort版本1.5开始引入,其代码在检测引擎被调用之前先被运行,为检测
做铺垫,从而提高检测的准确性和速度。而且预处理机制采用插件形式,用户和程序员
能够将模块化的插件方便地融入Snort之中。目前snort现有的预处理程序模块有以下三
种:
l--Minfrag
Minfrag预处理程序检查给定尺寸限制的分片数据包。数据包被分片通常是由源和目的主
机之间的路由器引起的。一般说来,商业网络设备不会产生小于512字节的分片包。可以
利用这个事实,来监控含有小分片的流量。
l--HTTP Decode
HTTP Decode用于处理HTTP URI字符串,将串中的数据转化为可读的ASCII字串,用于检
测HTTP的数据信息对付隐蔽的WebURL扫描器和恶意的入侵者。
l--Portscan Detector
Snort Portscan预处理程序的用处:
向标准记录设备中记录从一个源IP地址来的端口扫描的开始和结束。
如果指定了一个记录文件,在记录扫描类型的同时也记录目的IP地址和端口。端口扫描
定义为在时间T(秒)之内向超过P个端口进行TCP连接尝试,或者在时间T(秒)之内向
超过P个端口发送UDP数据包。端口扫描可以是对任一IP地址的多个端口,也可以是对多
个IP地址的同一端口进行。现在这个版本可以处理一对一和一对多方式的端口扫描,下
一个完全版本将可以处理分布式的端口扫描(多对一或多对多)。端口扫描也包括单一
的秘密扫描(stealthscan)数据包,比如NULL,FIN,SYNFIN,XMAS等。如果包括秘密
扫描的话,端口扫描模块会对每一个扫描数据包告警。
network to monitor - 监视端口扫描的目标网络以network/CIDR表示
number of ports - 在探测期间访问的端口数目
detection period - 以秒计数的端口访问时间限制
logdir/filename - 告警信息存放的目录/文件名,告警也可以写入标准的告警文件中。
l--日志及报警子系统(logging/alerting subsystem)
入侵检测系统的输出结果系统的必要特征是实时性和多样性,前者指能够在检测到入侵
行为的同时及时记录和报警,后者是指能够根据需求选择多种方式进行记录和报警。一
个好的NIDS,更应该提供友好的输出界面或发声报警等等。
Snort是一个轻量级的NIDS,它的另外一个重要功能就是数据包记录器,所以该子系统主
要提供了方式:
1.--fast model :采取TCPDUMP的格式记录信息
2. readable model :按照协议格式记录,易于用户查看。
3.alert to syslog: 向syslog发送报警信息。
4.alert to text file :以明文形式记录报警信息。
值得提出的是,snort考虑到用户需要高性能的时候,即网络数据流量非常大,可以将数
据包信息进行压缩从而实习快速的报警。
3.-- 程序结构
1)--snort的整体结构
snort作为优秀的公开源代码的入侵检测系统范例,其整个程序结构清晰,构思巧妙,我
们对于其版本1.6.3的源码进行了深入的分析。Snort共有64个c文件和h文件,首先介绍
程序的整体结构,其流程图如下:
其中最为关键的函数就是ProcessPacket(),--其流程图如下:
2)--数据结构--
snort的主要数据结构就是几个链表,上述已经提及,snort组织规则库的巧妙之处就是
按照规则的处理动作来划分成三个链表,其中每个链表又按照协议类型:TCP,IP和ICMP
分成三个链表,所以所有的规则都会被分配到这个三个链表中。链表中的成员就是描述
每条规则的结构——RuleTreeNode,该结构中的一个重要成员就是记录该规则的处理函
数链表——RuleFpList,一条规则有时候需要调用多个处理函数来进行分析。该结构中
的另外一个重要成员就是规则选项的结构,该结构同样包括该规则的选项信息以及其处
理函数链表。
值得提出的是,并不是每一条规则都分配一个RuleTreeNode结构,因为很多规则的选项
前的头部分是相同的,只需要根据不同的规则选项链取不同的选项函数处理链表。基本
整体的结构如图n所示,所有链表的初始化都是在捕获数据包前进行的。
除以上链表外,snort还定义了预处理、输出的关键字和处理函数链表,设计链表的主要
意图是为了实现插件的思想,即用户何以根据需求添加删除预处理的功能模块。其只要
的数据结构如下:
typedef struct _PreprocessKeywordNode
{
char *keyword;
void (*func)(char *);
} PreprocessKeywordNode;
// 预处理关键字信息结构。
typedef struct _PreprocessKeywordList
{
PreprocessKeywordNode entry;
struct _PreprocessKeywordList *next;
} PreprocessKeywordList;
//预处理关键字链表。
typedef struct _PreprocessFuncNode
{
void (*func)(Packet *);
struct _PreprocessFuncNode *next;
} PreprocessFuncNode;
//预处理函数链表。
所有链表的初始化都是在捕获数据包前进行初始化的,一旦链表都已建立完毕,开始捕
获数据包,每收到一个数据包都会现首先调用预处理程序链表中的函数进行处理后,其
次按照默认地顺序遍历AlertList,PassList和LogList三个链表。遍历时首先根据数据包
的协议类型定位规则链表,其次调用递归函数进行规则的逐一匹配,即首先匹配规则头
,若匹配则继续递归匹配规则选项,若不匹配,直接匹配下一条规则。为了加快遍历的
速度,snort在规则选项中的”content”内容匹配时调用了Boyer-Moore算法。
4.--改进
1.--背景
我们认为snort已经具备了NIDS的基本功能,由于它本身定位在一个轻量级的入侵检测工
具,尽管与商业的入侵检测工具比起来,它的规则语言略显简陋,在报警方式和图形化
使用界面上也显露出不足之处,但是程序的整体结构清晰,规则语言简单实用并提供插
件的功能支持,用户可以添加自己的检测规则和处理函数,这对于规则库的及时更新有
着极为现实的意义。
通过分析,与商业的NIDS相比,SNORT 1.6.3没有设置对IP 分片包的处理功能,即对于
例如“Teardrop”和“Ping of Death”两类利用非法IP分片包进行的攻击无法检测:
?--teadrop——该攻击是针对很多操作系统的TCP/IP协议栈没有正确处理已分段的IP包
的重组。其特征是发送2个或更多特别的分段IP数据报。第一个包是偏移量为0的段,数
据段(分段长度)字节是N,并设置了MF位,第二个包是最后一个分段(MF==0),但它的偏移
量小于N,所有造成两个分段重叠了。为了重组这些包,有弱点的系统就会在TCP/IP栈中
分配非常大的空间,因此导致目标系统因为内存耗尽而停止响应或者重启。
?--Ping of Death——该攻击的特正是向攻击目标发送大量的ICMP分片数据包,当这些
数据包重组时其数据段已经大于65535个字节,系统会因为无法处理这种数据包而造成拒
绝服务或者重启。
?--
2.--方案
3.--实现
㈢ 一个较新的snort规则,讲明其对抗何种黑客攻击这种黑客攻击的特征是什么并说明snort规则对抗
怎么不用sinnfer,这个比较简单!比较好用,图形化的界面。功能也比较强大!
Snort是一个网络入侵检测系统,它可以分析网络上的数据包,用以决定一个系统是否被远程攻击了。多数Linux发行版本都有Snort程序,因此通过urpmi、apt-get、yum等安装Snort是一件很轻松的事情。Snort可以将其收集的信息写到多种不同的存储位置以便于日后的分析。此外,Snort可被用作一个简单的数据包记录器、嗅探器,当然它主要是一个成熟的IDIS(网络入侵检测系统)。
在Snort安装之后,就可以立即使用了。我们只需执行:
#snort –v
这就将Snort设置也了嗅探模式,数据通信会在屏幕上滚动,显示Snort所看到的数据。要退出此程序,按下ctrl-c键就可以了,然后我们就会看到它所检测到的内容的一个简短分析。要看到如tcpmp那样更为详细的信息,就需要使用-vd选项。
要使用Snort记录数据,可以告诉此程序将信息记录到什么地方。在下面的例子中,Snort会将信息记录到/usr/local/log/snort目录中,因此就确保此目录真的存在:
# snort -l /usr/local/log/snort -d
Snort将以二进制方式记录数据包,如:/usr/local/log/snort/snort.log.1199665001,要查看此记录,可以使用-r选项来重新显示所捕获的数据。
# snort -r /usr/local/log/snort/snort.log.1199665001
要将Snort用作一个网络入侵检测系统还需要花点儿工夫。我们必须正确配置Snort,并要使用配置文件/etc/snort/snort.conf。注意,这个配置文件非同一般。Snort网站上的一些规则可能与Snort一起打包了,这依赖于你所使用的Linux版本。
开源社团的Snort的规则对任何人都是可用的,并极有可能与供应商所提供的Snort的版本捆绑发布。你还可以从Sourcefire预订、接收其更新,这样就可以使规则保持不断更新。
一旦下载了一个规则包,如Community-Rules-CURRENT.tar.gz,就要在系统中解开它,将其解到Snort配置所在的目录中:
# cd /etc/snort
# tar xvzf Community-Rules-CURRENT.tar.gz
新的规则将出现在rules/ directory中。
要启用之,需要编辑snort.conf文件并添加以下内容:
var RULE_PATH rules
include $RULE_PATH/sql.rules
include $RULE_PATH/icmp.rules
...
不管你喜欢哪些规则,现在就可以启动Snort并装载配置文件/etc/snort/snort.conf,这会依次装载下载的规则:
# snort -c /etc/snort/snort.conf
此时,Snort将会打印其初始化的信息,将其显示在屏幕上,然后开始记录与规则匹配的数据包。这些规则将决定Snort可以记录什么,它将忽略哪些内容,因此这里不像将Snort作为一个嗅探器来运行那样,它所生成的记录要小得多,因为它只记录所谓的“重要的”数据包。默认情况下,这些记录将会被存储到/var/log/snort/中,Snort将会用我们前面所说-r选项来分析之。
㈣ 配制snort的时候这个报错怎么解决
您好,是这样的:
1、安装一下libdnet试试看
2、编译snort的时候man看看是否有类似--with-libdnet之类的参数,这个报错就是找不到libdnet,
如果是64位系统的话find找一下,注意/lib和/lib64这两个lib库是否都有libdnet。
3、Snort 是一个开源的轻量级入侵监测系统,可以监测网络上的异常情况,给出报告;
安装新版本的iptables软件
可以到
http://www.netfilter.org
的网站下载最新版本的iptables源代码,目前最新的版本是1.2.9。
从网站上下载的源代码是“tar.bz2”格式的,编译源代码的第一步工作是解压缩,命令如下:
#/bin/tar xjvf iptables-1.2.9.tar.bz2
解压缩后,进入源代码的安装目录,开始编译:
# make install-devel KERNEL_DIR=/usr/include/linux/
如果一切正常,那么iptables应该编译好了,接下来可以进行安装了,安装命令非常简单:
#make install KERNEL_DIR=/usr/include/linux/
#setup->firewall configure->enable
#vi /etc/sysconfig/iptables ;add ssh (tcp port 22).etc...
service iptables start
chkconfig --level 35 iptables start
㈤ 我的电脑不能用microsoft word 打开.doc文件怎么办
SNORT源码分析(转自SMTH)
Snort作为一个轻量级的网络入侵检测系统,在实际中应用可能会有些力不从心,但如果想了解研究IDS的工作原理,仔细研究一下它的源码到是非常不错.
首先对snort做一个概括的评论。
从工作原理而言,snort是一个NIDS。[注:基于网络的入侵检测系统(NIDS)在网络的一点被动地检查原始的网络传输数据。通过分析检查的数据包,NIDS匹配入侵行为的特征或者从网络活动的角度检测异常行为。] 网络传输数据的采集利用了工具包libpcap。snort对libpcap采集来的数据进行分析,从而判断是否存在可疑的网络活动。
从检测模式而言,snort基本上是误用检测(misuse detection)。[注:该方法对已知攻击的特征模式进行匹配,包括利用工作在网卡混杂模式下的嗅探器被动地进行协议分析,以及对一系列数据包解释分析特征。顺便说一句,另一种检测是异常检测(anomaly detection)。]具体实现上,仅仅是对数据进行最直接最简单的搜索匹配,并没有涉及更复杂的入侵检测办法。
尽管snort在实现上没有什么高深的检测策略,但是它给我们提供了一个非常
优秀的公开源代码的入侵检测系统范例。我们可以通过对其代码的分析,搞清IDS 究竟是如何工作的,并在此基础上添加自己的想法。
snort的编程风格非常优秀,代码阅读起来并不困难,整个程序结构清晰,函
数调用关系也不算复杂。但是,snort的源文件不少,函数总数也很多,所以不太
容易讲清楚。因此,最好把代码完整看一两遍,能更清楚点。
*****************************************************
*****************************************************
下面看看snort的整体结构。展开snort压缩包,有约50个c程序和头文件,另有约30个其它文件(工程、数据或者说明文件)。[注:这里用的是snort-1.6-beta7。snort-1.6.3不在手边,就用老一点的版本了,差别不大。]下面对源代码文件分组说明。
snort.c(.h)是主程序所在的文件,实现了main函数和一系列辅助函数。
decode.c(.h)把数据包层层剥开,确定该包属于何种协议,有什么特征。并
标记到全局结构变量pv中。
log.c(.h)实现日志和报警功能。snort有多种日志格式,一种是按tcpmp二进制的格式存储,另一种按snort编码的ascii格式存储在日志目录下,日志目录的名字根据"外"主机的ip地址命名。报警有不同的级别和方式,可以记录到syslog中,或者记录到用户指定的文件,另外还可以通过unix socket发送报警消息,以及利用SMB向Windows系统发送winpopup消息。
mstring.c(.h)实现字符串匹配算法。在snort中,采用的是Boyer-Moore算法。算法书上一般都有。
plugbase.c(.h)实现了初始化检测以及登记检测规则的一组函数。snort中的检测规则以链表的形式存储,每条规则通过登记(Register)过程添加到链表中。
response.c(.h)进行响应,即向攻击方主动发送数据包。这里实现了两种响应。一种是发送ICMP的主机不可到达的假信息,另一种针对TCP,发送RST包,断开连接。
rule.c(.h)实现了规则设置和入侵检测所需要的函数。规则设置主要的作用是
把一个规则文件转化为实际运作中的规则链表。检测函数根据规则实施攻击特征的检测。
sp_*_check.c(.h)是不同类型的检测规则的具体实现。很容易就可以从文件名得知所实现的规则。例如,sp_dsize_check针对的是包的数据大小,sp_icmp_type_check针对icmp包的类型,sp_tcp_flag_check针对tcp包的标志位。不再详述。
spo_*.c(.h)实现输出(output)规则。spo_alert_syslog把事件记录到syslog中;spo_log_tcpmp利用libpcap中的日志函数,进行日志记录。
spp_*.c(.h)实现预处理(preprocess)规则。包括http解码(即把http请求中的%XX这样的字符用对应的ascii字符代替,避免忽略了恶意的请求)、最小片断检查(避免恶意利用tcp协议中重组的功能)和端口扫描检测。
********************************************************************************************************** 下面描述main函数的工作流程。先来说明两个结构的定义。
在snort.h中,定义了两个结构:PV和PacketCount。PV用来记录命令行参数,snort根据这些命令行参数来确定其工作方式。PV类型的全局变量pv用来实际记录具体工作方式。结构定义可以参看snort.h,在下边的main函数中,会多次遇到pv中各个域的设定,到时再一个一个解释。
结构PacketCount用来统计流量,每处理一个数据包,该结构类型的全局变量pc把对应的域加1。相当于一个计数器。
接下来解释main函数。
初始化设定一些缺省值;然后解析命令行参数,根据命令行参数,填充结构变量pv;根据pv的值(也就是解析命令行的结果)确定工作方式,需要注意:
如果是运行在Daemon方式,通过GoDaemon函数,创建守护进程,重定向标准输入输出,实现daamon状态,并结束父进程。
snort可以实时采集网络数据,也可以从文件读取数据进行分析。这两种情况并没有本质区别。如果是读取文件进行分析(并非直接从网卡实时采集来的),以该文件名作为libpcap的函数OpenPcap的参数,打开采集过程;如果是从网卡实时采集,就把网卡接口作为OpenPcap的参数,利用libpcap的函数打开该网卡接口。在unix中,设备也被看作是文件,所以这和读取文件分析没有多大的差别。
接着,指定数据包的拆包函数。不同的数据链路网络,拆包的函数也不同。利用函数SetPktProcessor,根据全局变量datalink的值,来设定不同的拆包函数。例如,以太网,拆包函数为DecodeEthPkt;令牌环网,拆包函数为DecodeTRPkt,等等。这些Decode*函数,在decode.c中实现。
如果使用了检测规则,那么下面就要初始化这些检测规则,并解析规则文件,转化成规则链表。规则有三大类:预处理(preprocessor),插件(plugin),输出插件(outputplugin)。这里plugin就是具体的检测规则,而outputplugin是定义日志和报警方式的规则。
然后根据报警模式,设定报警函数;根据日志模式,设定日志函数;如果指定了能够进行响应,就打开raw socket,准备用于响应。
最后进入读取数据包的循环,pcap_loop对每个采集来的数据包都用ProcessPacket函数进行处理,如果出现错误或者到达指定的处理包数(pv.pkt_cnt定义),就退出该函数。这里ProcessPacket是关键程序,
最后,关闭采集过程。
*****************************************************
现在看看snort如何实现对数据包的分析和检测入侵的。
在main函数的最后部分有如下语句,比较重要:
/* Read all packets on the device. Continue until cnt packets read */
if(pcap_loop(pd, pv.pkt_cnt, (pcap_handler)ProcessPacket, NULL) < 0)
{
......
}
这里pcap_loop函数有4个参数,分别解释:
pd是一个全局变量,表示文件描述符,在前面OpenPcap的调用中已经被正确地赋值。前面说过,snort可以实时采集网络数据,也可以从文件读取数据进行分析。在不同情况打开文件(或设备)时,pd分别用来处理文件,或者网卡设备接口。
pd是struct pcap类型的指针,该结构包括实际的文件描述符,缓冲区,等等域,用来处理从相应的文件获取信息。
OpenPcap函数中对pd赋值的语句分别为:
/* get the device file descriptor,打开网卡接口 */
pd = pcap_open_live(pv.interface, snaplen,
pv.promisc_flag ? PROMISC : 0, READ_TIMEOUT, errorbuf);
或者
/* open the file,打开文件 */
pd = pcap_open_offline(intf, errorbuf);
于是,这个参数表明从哪里取得待分析的数据。
第2个参数是pv.pkt_cnt,表示总共要捕捉的包的数量。在main函数初始化时,缺省设置为-1,成为永真循环,一直捕捉直到程序退出:
/* initialize the packet counter to loop forever */
pv.pkt_cnt = -1;
或者在命令行中设置要捕捉的包的数量。前面ParseCmdLine(解析命令行)函数的调用中,遇到参数n,重新设定pv.pkt_cnt的值。ParseCmdLine中相关语句如下:
case 'n': /* grab x packets and exit */
pv.pkt_cnt = atoi(optarg);
第3个参数是回调函数,该回调函数处理捕捉到的数据包。这里为函数
ProcessPacket,下面将详细解释该函数。
第4个参数是字符串指针,表示用户,这里设置为空。
在说明处理包的函数ProcessPacket之前,有必要解释一下pcap_loop的实现。我们看到main函数只在if条件判断中调用了一次pacp_loop,那么循环一定是在pcap_loop中做的了。察看pcap.c文件中pcap_loop的实现部分,我们发现的确如此:
int
pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
{
register int n;
for (; { //for循环
if (p->sf.rfile != NULL)
n = pcap_offline_read(p, cnt, callback, user);
else {
/*
* XXX keep reading until we get something
* (or an error occurs)
*/
do { //do循环
n = pcap_read(p, cnt, callback, user);
} while (n == 0);
}
if (n <= 0)
return (n); //遇到错误,返回
if (cnt > 0) {
cnt -= n;
if (cnt <= 0)
return (0); //到达指定数量,返回
}
//只有以上两种返回情况
}
}
现在看看ProcessPacket的实现了,这个回调函数用来处理数据包。该函数是是pcap_handler类型的,pcap.h中类型的定义如下:
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);
第1个参数这里没有什么用;
第2个参数为pcap_pkthdr结构指针,记录时间戳、包长、捕捉的长度;
第3个参数字符串指针为数据包。
函数如下:
void ProcessPacket(char *user, struct pcap_pkthdr *pkthdr, u_char *pkt)
{
Packet p; //Packet结构在decode.h中定义,用来记录数据包的各种信息
/* call the packet decoder,调用拆包函数,这里grinder是一个全局
函数指针,已经在main的SetPktProcessor调用中设置为正确的拆包函数 */
(*grinder)(&p, pkthdr, pkt);
/* print the packet to the screen,如果选择了详细显示方式,
那么把包的数据,显示到标准输出 */
if(pv.verbose_flag)
{
...... //省略
}
/* check or log the packet as necessary
如果工作在使用检测规则的方式,就调用Preprocess进行检测,
否则,仅仅进行日志,记录该包的信息*/
if(!pv.use_rules)
{
... //进行日志,省略
}
else
{
Preprocess(&p);
}
//清除缓冲区
ClearDumpBuf();
}
这里Preprocess函数进行实际检测。
****************************************************************************
Proprocess函数很短,首先调用预处理规则处理数据包p,然后调用检测
函数Detect进行规则匹配实现检测,如果实现匹配,那么调用函数CallOutput
Plugins根据输出规则进行报警或日志。函数如下:
void Preprocess(Packet *p)
{
PreprocessFuncNode *idx;
do_detect = 1;
idx = PreprocessList; //指向预处理规则链表头
while(idx != NULL) //调用预处理函数处理包p
{
idx->func(p);
idx = idx->next;
}
if(!p->frag_flag && do_detect)
{
if(Detect(p)) //调用检测函数
{
CallOutputPlugins(p); //如果匹配,根据规则输出
}
}
}
尽管这个函数很简洁,但是在第1行我们看到定义了ProprocessFuncNode
结构类型的指针,所以下面,我们不得不开始涉及到snort的各种复杂
的数据结构。前面的分析,我一直按照程序运行的调用顺序,忽略了许多函
数(其实有不少非常重要),以期描述出snort执行的主线,避免因为程序中
大量的调用关系而产生混乱。到现在,我们还没有接触到snort核心的数据结构
和算法。有不少关键的问题需要解决:规则是如何静态描述的?运行时这些
规则按照什么结构动态存储?每条规则的处理函数如何被调用?snort给了
我们提供了非常好的方法。
snort一个非常成功的思想是利用了plugin机制,规则处理函数并非固定在
源程序中,而是根据每次运行时的参数设定,从规则文件中读入规则,再把每个
规则所需要的处理函数挂接到链表上。实际检测时,遍历这些链表,调用链表上
相应的函数来分析。
snort主要的数据结构是链表,几乎都是链表来链表去。我们下面做个总的
介绍。
我们有必要先回过头来,看一看main函数中对规则初始化时涉及到的一些
数据结构。
在main函数初始化规则的时候,先建立了几个链表,全局变量定义如下
(plugbase.c中):
KeywordXlateList *KeywordList;
PreprocessKeywordList *PreprocessKeywords;
PreprocessFuncNode *PreprocessList;
OutputKeywordList *OutputKeywords;
OutputFuncNode *OutputList;
这几种结构的具体定义省略。这一初始化的过程把snort中预定义的关键
字和处理函数按类别连接在不同的链表上。然后,在解析规则文件的时候,
如果一条规则的选项中包含了某个关键字,就会从上边初始化好的对应的链表
中查找,把必要的信息和处理函数添加到表示这条规则的节点(用RuleTreeNode
类型来表示,下面详述)的特定域(OptTreeNode类型)中。
同时,main函数中初始化规则的最后,对指定的规则文件进行解析。在最
高的层次上,有3个全局变量保存规则(rules.c):
ListHead Alert; /* Alert Block Header */
ListHead Log; /* Log Block Header */
ListHead Pass; /* Pass Block Header */
这几个变量是ListHead类型的,正如名称所说,指示链表头。Alert中登记
了需要报警的规则,Log中登记了需要进行日志的规则,Pass中登记的规则在处
理过程忽略(不进行任何处理)。ListHead定义如下:
typedef struct _ListHead
{
RuleTreeNode *TcpList;
RuleTreeNode *UdpList;
RuleTreeNode *IcmpList;
} ListHead;
可以看到,每个ListHead结构中有三个指针,分别指向处理Tcp/Udp/Icmp包规则的链表头。这里又出现了新的结构RuleTreeNode,为了说明链表的层次关系,下面列出RuleTreeNode的定义,但是忽略了大部分域:
typedef struct _RuleTreeNode
{
RuleFpList *rule_func;
...... //忽略
struct _RuleTreeNode *right;
OptTreeNode *down; /* list of rule options to associate with this
rule node */
} RuleTreeNode;
RuleTreeNode中包含上述3个指针域,分别又能形成3个链表。RuleTreeNode*类型的right指向下一个RuleTreeNode,相当于普通链表中的next域,只不过这里用right来命名。这样就形成了规则链表。
RuleFpList类的指针rule_func记录的是该规则的处理函数的链表。一条规则有时候需要调用多个处理函数来分析。所以,有必要做成链表。我们看看下面的定义,除了next域,还有一个函数指针:
typedef struct _RuleFpList
{
/* rule check function pointer */
int (*RuleHeadFunc)(Packet *, struct _RuleTreeNode *, struct _RuleFpList *);
/* pointer to the next rule function node */
struct _RuleFpList *next;
} RuleFpList;
第3个指针域是OptTreeNode类的指针down,该行后面的注释说的很清楚,这是与这个规则节点相联系的规则选项的链表。很不幸,OptTreeNode的结构也相当复杂,而且又引出了几个新的链表。忽略一些域,OptTreeNode定义如下:
typedef struct _OptTreeNode
{
/* plugin/detection functions go here */
OptFpList *opt_func;
/* the ds_list is absolutely essential for the plugin system to work,
it allows the plugin authors to associate "dynamic" data structures
with the rule system, letting them link anything they can come up
with to the rules list */
void *ds_list[512]; /* list of plugin data struct pointers */
.......//省略了一些域
struct _OptTreeNode *next;
} OptTreeNode;
next指向链表的下一个节点,无需多说。OptFpList类型的指针opt_func指向
选项函数链表,同前面说的RuleFpList没什么大差别。值得注意的是指针数组
ds_list,用来记录该条规则中涉及到的预定义处理过程。每个元素的类型是void*.在实际表示规则的时候,ds_list被强制转换成不同的预定义类型。
--------------------------------------------------------------------------------------
Proprocess函数很短,首先调用预处理规则处理数据包p,然后调用检测
函数Detect进行规则匹配实现检测,如果实现匹配,那么调用函数CallOutput
Plugins根据输出规则进行报警或日志。函数如下:
void Preprocess(Packet *p)
{
PreprocessFuncNode *idx;
do_detect = 1;
idx = PreprocessList; //指向预处理规则链表头
while(idx != NULL) //调用预处理函数处理包p
{
idx->func(p);
idx = idx->next;
}
if(!p->frag_flag && do_detect)
{
if(Detect(p)) //调用检测函数
{
CallOutputPlugins(p); //如果匹配,根据规则输出
}
}
}
尽管这个函数很简洁,但是在第1行我们看到定义了ProprocessFuncNode
结构类型的指针,所以下面,我们不得不开始涉及到snort的各种复杂
的数据结构。前面的分析,我一直按照程序运行的调用顺序,忽略了许多函
数(其实有不少非常重要),以期描述出snort执行的主线,避免因为程序中
大量的调用关系而产生混乱。到现在,我们还没有接触到snort核心的数据结构
和算法。有不少关键的问题需要解决:规则是如何静态描述的?运行时这些
规则按照什么结构动态存储?每条规则的处理函数如何被调用?snort给了
我们提供了非常好的方法。
snort一个非常成功的思想是利用了plugin机制,规则处理函数并非固定在
源程序中,而是根据每次运行时的参数设定,从规则文件中读入规则,再把每个
规则所需要的处理函数挂接到链表上。实际检测时,遍历这些链表,调用链表上
相应的函数来分析。
snort主要的数据结构是链表,几乎都是链表来链表去。我们下面做个总的
介绍。
我们有必要先回过头来,看一看main函数中对规则初始化时涉及到的一些
数据结构。
在main函数初始化规则的时候,先建立了几个链表,全局变量定义如下
(plugbase.c中):
KeywordXlateList *KeywordList;
PreprocessKeywordList *PreprocessKeywords;
PreprocessFuncNode *PreprocessList;
OutputKeywordList *OutputKeywords;
OutputFuncNode *OutputList;
这几种结构的具体定义省略。这一初始化的过程把snort中预定义的关键
字和处理函数按类别连接在不同的链表上。然后,在解析规则文件的时候,
如果一条规则的选项中包含了某个关键字,就会从上边初始化好的对应的链表
中查找,把必要的信息和处理函数添加到表示这条规则的节点(用RuleTreeNode
类型来表示,下面详述)的特定域(OptTreeNode类型)中。
同时,main函数中初始化规则的最后,对指定的规则文件进行解析。在最
高的层次上,有3个全局变量保存规则(rules.c):
ListHead Alert; /* Alert Block Header */
ListHead Log; /* Log Block Header */
ListHead Pass; /* Pass Block Header */
这几个变量是ListHead类型的,正如名称所说,指示链表头。Alert中登记
了需要报警的规则,Log中登记了需要进行日志的规则,Pass中登记的规则在处
理过程忽略(不进行任何处理)。ListHead定义如下:
typedef struct _ListHead
{
RuleTreeNode *TcpList;
RuleTreeNode *UdpList;
RuleTreeNode *IcmpList;
} ListHead;
可以看到,每个ListHead结构中有三个指针,分别指向处理Tcp/Udp/Icmp包规则的链表头。这里又出现了新的结构RuleTreeNode,为了说明链表的层次关系,下面列出RuleTreeNode的定义,但是忽略了大部分域:
typedef struct _RuleTreeNode
{
RuleFpList *rule_func;
...... //忽略
struct _RuleTreeNode *right;
OptTreeNode *down; /* list of rule options to associate with this
rule node */
} RuleTreeNode;
RuleTreeNode中包含上述3个指针域,分别又能形成3个链表。RuleTreeNode*
类型的right指向下一个RuleTreeNode,相当于普通链表中的next域,只不过这里用right来命名。这样就形成了规则链表。
RuleFpList类的指针rule_func记录的是该规则的处理函数的链表。一条规则有时候需要调用多个处理函数来分析。所以,有必要做成链表。我们看看下面的
定义,除了next域,还有一个函数指针:
typedef struct _RuleFpList
{
/* rule check function pointer */
int (*RuleHeadFunc)(Packet *, struct _RuleTreeNode *, struct _RuleFpList *);
/* pointer to the next rule function node */
struct _RuleFpList *next;
} RuleFpList;
第3个指针域是OptTreeNode类的指针down,该行后面的注释说的很清楚,这是与这个规则节点相联系的规则选项的链表。很不幸,OptTreeNode的结构也相当复杂,而且又引出了几个新的链表。忽略一些域,OptTreeNode定义如下:
typedef struct _OptTreeNode
{
/* plugin/detection functions go here */
OptFpList *opt_func;
/* the ds_list is absolutely essential for the plugin system to work,
it allows the plugin authors to associate "dynamic" data structures
with the rule system, letting them link anything they can come up
with to the rules list */
void *ds_list[512]; /* list of plugin data struct pointers */
.......//省略了一些域
struct _OptTreeNode *next;
} OptTreeNode;
next指向链表的下一个节点,无需多说。OptFpList类型的指针opt_func指向选项函数链表,同前面说的RuleFpList没什么大差别。值得注意的是指针数组
ds_list,用来记录该条规则中涉及到的预定义处理过程。每个元素的类型是void*。在实际表示规则的时候,ds_list被强制转换成不同的预定义类型。
㈥ snort 的具体使用
Snort不是很难使用,但是也存在着很多的命令行选项需要掌握,并且它们中许多很多时候并不能一起使用。这个文件的目的就是使新人能够更简单的使用snort。
在我们进行下一步之前,有一些关于snort的基本概念需要了解。snort能够配置成三种模式运行:嗅探器(sniffer),包记录器(packet logger)和网络入侵检测系统(NIDS)。嗅探模式(sniffer mode)简单的读取网络中的数据包,并以连续的数据流显示在控制台上。包记录模式(packet logger mode)把捕获的数据包记录在磁盘上。网络入侵检测模式(NIDS mode)是最复杂的、有机的配置,在这个模式下,snort分析网络中的数据,并通过使用用户自定义的规则集进行模式匹配,并根据匹配的结果执行多种操作。
2.0 嗅探模式(sniffer mode)
首先,让我们从基础开始。如果你只是想要在屏幕上打印出TCP/IP的包头信息(嗅探模式),使用下面的命令:
./snort –v
使用这个命令运行snort,将只显示IP和TCP/UDP/ICMP头信息,而不显示任何其它信息。如果你想要查看传输的有效负载信息,可以使用如下命令:
./snort –vd
这条命令在打印协议头信息的同时也打印相应的包数据。如果你想要一个更详细的现实,可以使用下面的命令来打印出数据链路层头信息:
./snort –vde
(注:这些选项参数能够分开或者拆散成任和结合的方式。比如上一个命令也可以写做这种方式:
./snort -d -v –e
来达到同样的效果)
3.0 包记录模式(PACKET LOGGER MODE)
好的,上面的命令运行的都相当的好。但是如果你想要记录包到磁盘上,你需要指定一个记录目录,然后snort将自动的进入包记录模式:
./snort -dev -l ./log
当然,这里假设你在当前目录下有一个叫做“log”的目录。如果没有这个目录,snort将退出并返回错误信息。当snort以这种模式运行,它收集所有捕获的数据包,并根据数据包中一个主机的IP地址放入对应的目录中。
如果你只是简单的指定“-l”选项,你可能会发现snort有时使用远程计算机的地址作为存放数据包的目录,有时使用本地主机的地址。为了比较本地的网络,你需要告诉snort本地网络的信息:
./snort -dev -l ./log -h 192.168.1.0/24
这条指令让snort能够记录数据链路信息和TCP/IP头和应用数据到目录./log,并且记录和192.168.1.0段C类网络相关的包信息。所有进来的包将记录到记录文件夹中对应的子文件夹中,子文件夹以远程主机(非192.168.1主机)的地址命名。注意,如果两个主机都是在本地网络内,然后他们将根据两个中高的端口号来记录,在端口号相等的情况下,将使用源地址来记录。
如果你在一个高速网络中,又或你想要使用一个更紧凑的格式来记录数据包为以后的分析所用,你可以考虑使用“二进制模式”来记录。二进制模式采用“tcpmp 格式”来记录数据包到指定目录下的单一二进制文件中。
./snort -l ./log –b
注意这里命令行的改变。我们不再需要指定一个本地网络,因为二进制模式记录所有的数据到一个单一的文件中,而不再需要定义输出的目录结构。另外,你不再需要使用详细(verbose)模式和指定-d/-e开关参数,因为在二进制模式下所有的包都会被记录而不是其中的某些部分。进入二进制包记录模式只需要做两点,一是在命令行中使用-l开关来指定一个日志目录,二是使用-b开关选择二进制模式代替ASCII文档模式记录包数据。
如果数据包以二进制文件的形式记录,你可以使用任何支持tcpmp二进制格式的嗅探器从文件中读取数据包信息,比如使用tcpmp或ethereal。snort也可以通过使用-r开关进入回放模式来读取记录的数据包信息。snort在任何运行模式下都能够接受tcpmp格式的文件并进行处理。比如,如果你想要以嗅探器模式来分析处理一个二进制文件并把数据包信息打印在屏幕,你可以使用类似下面的命令:
./snort -dv -r packet.log
你还可以以多种方式操作二进制文件中的数据,比如包记录模式和入侵检测模式,你也同样可以在命令行中使用BPF接口。比如,如果你只是想查看记录文件中的ICMP数据包信息,可以在命令行中简单的指定一个BPF过滤器:
./snort -dvr packet.log icmp
更多的BPF使用信息请参阅相应的man信息。
4.0 网络入侵检测模式(NETWORK INTRUSION DETECTION MODE)
可以使用如下命令来启用snort的网络入侵检测模式(这个模式下,你不用记录所有的数据包):
./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf
在这里snort.conf是你的规则文件名。这将对每一个数据包使用snort.conf文件中定义的规则集进行检测,并根据文件中定义的行为进行处理。如果你没有为程序指定输出目录,将使用默认的目录“/var/log/snort”。
有一点需要注意的是,使用上一命令行形式进入NIDS模式运行速度稍慢,可以去掉“-v”开关来提高效率。往屏幕输出数据速度很慢,在数据显示的过程中可能会造成数据包的丢失。
同样,对于大多数的应用而言,都不比要记录数据链路层包头信息,因此“-e”开关也是可以去掉的。最后命令如下:
./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf
这个命令能够配置snort以最基础的NIDS模式运行。它将以ASCII格式记录规则指定的包信息到对应的目录结构中(和包记录模式中目录结构一致)。
4.1 NIDS MODE输出选项
在snort的NIDS模式中有几种输出方式可以配置。默认的记录和报警以ASCII形式记录,并使用“完全”报警。完全报警方式(full alert mechanism)输出所有的包头信息并在其后附上对应的报警信息。当然,在命令行中可以设置多种报警输出模式和两种日志记录格式。包信息可以以默认的ASCII格式记录,也可以通过使用命令行开关“-b”来用二进制文件记录。如果你想要完全禁用包记录信息,可以使用命令行开关“-N”。
报警模式相对要复杂一些。在命令行中可以设置多种报警模式:full、fast、socket、syslog、console、cmg、和none模式。这六种模式可以使用命令行开关“-A”来设置。详细如下:
u -A fast 快速报警模式,以一种简单的格式记录报警信息(时间、报警信息、源和目的主机的IP和端口)
u -A full 这是默认的报警模式,如果没有指定报警模式,将自动使用这种报警模式
u -A unsock 发送报警信息到一个其它程序监听UNIX套接口
u -A none 关闭报警
u -A console 打印快速报警信息到控制台(屏幕)
u -A cmg 触发“cmg样式”报警
还可以使用“-s”开关来设置syslog报警。默认的两种syslog报警级别是LOG_AUTHPRIV和LOG_ALERT。如果你想要配置其它syslog日志级别的话,可以在规则文件中使用输出插件来设置(详细信息参见snort.conf文件)。
下面是几个输出配置实例:
1、使用默认格式(ASCII)向syslog发送报警信息:
snort -c snort.conf -l ./log -s -h 192.168.1.0/24
2、使用默认格式和默认目录(/var/log/snort)来向syslog发送报警信息:
snort -c snort.conf -s -h 192.168.1.0/24
3、使用二进制文件格式、快速报警模式、目录/var/snort来记录信息:
snort -c snort.conf -b -A fast -l /var/snort
4.2 性能配置
如果你想要提高snort运行效率(比如保持100Mbps网络环境下快速运行),可以使用“-b”和“-A fast”或者“-s”(syslog)选项。它将以tcpmp格式来记录包,并产生较少的报警信息。比如:
./snort -b -A fast -c snort-lib
在这个配置下,snort能够在100Mbps局域网内在80Mbps正常流量下检测同时进行的多重扫描和工具在这个配置下,记录将以二进制格式写入tcpmp格式文件snort.log中。然后可以重新使用“-r”选项和其它常用的选项运行snort,来从数据文件中解析为正常的snort格式的数据信息。比如:
./snort -d -c snort-lib -l ./log -h 192.168.1.0/24 -r snort.log
一旦这条指令执行,所有的数据将以正常的格式记录在日志文件夹中。很酷,不是吗?
4.3 其它信息
有很多人不喜欢snort默认的对包应用规则方式。在snort默认应用方式中,先使用报警(alert)规则,然后使用通过(pass)规则,最后使用记录(log)规则。这个顺序是违反直觉的,但是相对于允许用户定义了很多报警规则却因为使用了一条错误的通过规则而全部被禁止要简单有效。对于一些用户的需要,这里提供了“-o”开关来改变默认的规则应用顺序为:先使用pass规则,然后是alert规则,最后是log规则。命令如下:
./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf -o
5.0 杂项信息
如果你想要以守护进程(daemon)模式运行snort,可以和其它选项一起加上“-D”开关设置。请注意,如果你想要向守护进程发送信号SIGHUP来重启snort的话,你需要在命令行中使用snort二进制文件的完全路径,比如你可以使用如下命令:
/usr/local/bin/snort -d -h 192.168.1.0/24 -l /var/log/snortlogs -c /usr/local/etc/snort-lib -s –D
由于安全关系,这里不提供对相对路径的支持。
如果你想要发送包记录信息到公共邮件列表,需要使用“-O”开关。这个开关将对包中输出的IP信息进行混淆处理。这使得你能够很容易的避免邮件列表中的用户获知相关的IP信息。你也可以把“-O”开关和“-h”开关联合使用,这样将只混淆本地网络中的主机地址。如果你不在意让人看见攻击主机的IP地址,这样设置是很有效的。命令如下:
./snort -d -v -r snort.log -O -h 192.168.1.0/24
这将从记录文件中读取数据包信息,并在屏幕上显示出来,在显示的过程中仅仅混淆了C类网络192.168.1.0/24中的地址信息。
如果你想要在不停止进程去查看snort包统计信息,可以向snort进程ID发送SIGUSR1信号,然后snort将在屏幕上显示统计信息,如果snort以守护进程模式运行,统计信息将发送到syslog中。你可以查看到snort检测的协议信息、报警数目、记录的包数、接收和丢弃的包数。这使得你能够很方便的提高snort的性能。
㈦ 如何编写snort的检测规则
snort是一个强大的轻量级的网络入侵检测系统。它具有实时数据流量分析和日志IP网络数据包的能力,能够进行协议分析,对内容进行搜索/匹配。它能够检测各种不同的攻击方式,对攻击进行实时报警。此外,snort具有很好的扩展性和可移植性。本文将讲述如何开发snort规则。
1.基础
snort使用一种简单的规则描述语言,这种描述语言易于扩展,功能也比较强大。下面是一些最基本的东西:
snort的每条规则必须在一行中,它的规则解释器无法对跨行的规则进行解析。注意:由于排版的原因本文的例子有的分为两行。
snort的每条规则都可以分成逻辑上的两个部分:规则头和规则选项。规则头包括:规则行为(rule's action)、协议(protocol)、源/目的IP地址、子网掩码以及源/目的端口。规则选项包含报警信息和异常包的信息(特征码,signature),使用这些特征码来决定是否采取规则规定的行动。
这是一个例子:
alert tcp any any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"mountd access";)
表1.一条简单的snort规则
从开头到最左边的括号属于规则头部分,括号内的部分属于规则选项。规则选项中冒号前面的词叫做选项关键词(option keywords)。注意对于每条规则来说规则选项不是必需的,它们是为了更加详细地定义应该收集或者报警的数据包。只有匹配所有选项的数据包,snort才会执行其规则行为。如果许多选项组合在一起,它们之间是逻辑与的关系。让我们从规则头开始。
1.1 include
snort使用的规则文件在命令行中指定,include关键词使这个规则文件可以包含其它规则文件中的规则,非常类似与C语言中的#include。snort会从被包含的文件读出其内容,取代include关键词。
格式:
include <文件路径/文件名>
注意:行尾没有分号。
1.2 varriables
在snort规则文件中可以定义变量。
格式:
var
例子:
var MY_NET 192.168.1.0/24,10.1.1.0/24] $MY_NET any (flags:S;msg:'SYNMETA packet";)
表2.变量的定义和使用
规则变量名可以使用多种方式来修改,你可以使用$操作符来定义元变量(meta-variables)。这些修改方式可以结合变量修改操作符:?和-来使用。
$var:定义元变量
$(var):以变量var的内容作为变量名
$(var:-default):以变量var的内容作为变量名,如果var没有定义就使用default作为变量名
$(var:?message):使用变量var的内容作为变量名,如果不成功就打印错误信息message并退出。
例如:
var MY_NET $(MYU_NET:-192.168.1.0/24) tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
表3.高级变量应用
2.规则头(Rule Headers)
2.1 Rule Action
规则头包含一些信息,这些信息包括:哪些数据包、数据包的来源、什么类型的数据包,以及对匹配的数据包如何处理。每条规则的第一项就是规则行为(rule action)。规则行为告诉snort当发现匹配的数据包时,应该如何处理。在snort中,有五种默认的处理方式:alert、log、pass、activate和dynamic。
alert:使用选定的报警方法产生报警信息,并且记录数据包
log:记录数据包
pass:忽略数据包
activate:报警,接着打开其它的dynamic规则
dynamic:保持空闲状态,直到被activete规则激活,作为一条log规则
你也可以定义自己的规则类型,把它们和一个或者几个输出插件联系在一起。然后你就可以在snort规则中使用这些规则类型了。
这个例子将建立一个类型,它将只以tcpmp格式输出日志:
ruletype suspicious
{
type log
output log_tcpmp: suspocious.log
}
下面这个例子将建立一个类型,把日志发送到syslog和MySql数据库:
ruletype redalert
{
type alert
output alert_syslog:LOG_AUTH LOG_ALERT
output database:log,user=snort dbname=snort host=localhost
}
2.2 协议
每条规则的第二项就是协议项。当前,snort能够分析的协议是:TCP、UDP和ICMP。将来,可能提供对ARP、ICRP、GRE、OSPF、RIP、IPX等协议的支持。
2.3 IP地址
规则头下面的部分就是IP地址和端口信息。关键词any可以用来定义任意的IP地址。snort不支持对主机名的解析。所以地址只能使用数字/CIDR的形式。/24表示一个C类网络;/16表示一个B类网络;而/32表示一台特定的主机地址。例如:192.168.1.0/24表示从192.168.1.1到192.168.1.255的地址。
在规则中,可以使用使用否定操作符(negation operator)对IP地址进行操作。它告诉snort除了列出的IP地址外,匹配所有的IP地址。否定操作符使用!表示。例如,使用否定操作符可以很轻松地对表1的规则进行改写,使其对从外部网络向内的数据报警。
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"external mountd access";)
表4.使用IP地址否定操作符的规则
上面这条规则中的IP地址表示:所有IP源地址不是内部网络的地址,而目的地址是内部网络地址。
你也可以定义一个IP地址列表(IP list)。IP地址列表的格式如下:
[IP地址1/CIDR,IP地址/CIDR,....]
注意每个IP地址之间不能有空格。例如:
alert tcp ![192.168.1.0/24,10.1.1.1.0/24] any ->[192.168.1.0/24,10.1.1.0/24] 111 (content:"|00 01 86 a5|";msg:"external mountd access";)
2.4 端口号
在规则中,可以有几种方式来指定端口号,包括:any、静态端口号(static port)定义、端口范围,以及使用非操作定义。any表示任意合法的端口号;静态端口号表示单个的端口号,例如:111(portmapper)、23(telnet)、80(http)等。使用范围操作符:可以指定端口号范围。有几种方式来使用范围操作符:达到不同的目的,例如:
log udp any any -> 192.168.1.0/24 1:1024
记录来自任何端口,其目的端口号在1到1024之间的UDP数据包
log tcp any any -> 192.168.1.0/24 :600
记录来自任何端口,其目的端口号小于或者等于6000的TCP数据包
log tcp any :1024 -> 192.168.1.0/24 500:
记录源端口号小于等于1024,目的端口号大于等于500的TCP数据包
表5.端口范围示例
你还可以使用逻辑非操作符!对端口进行非逻辑操作(port negation)。逻辑非操作符可以用于其它的规则类型(除了any类型,道理很简单)。例如,你如果要日志除了X-window系统端口之外的所有端口,可以使用下面的规则:
log tcp any any -> 192.168.1.0/24 !6000:60 10
表6.对端口进行逻辑非操作
2.5 方向操作符(direction operator)
方向操作符->表示数据包的流向。它左边是数据包的源地址和源端口,右边是目的地址和端口。此外,还有一个双向操作符<>,它使snort对这条规则中,两个IP地址/端口之间双向的数据传输进行记录/分析,例如telnet或者POP3对话。下面的规则表示对一个telnet对话的双向数据传输进行记录:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
表7.使用双向操作符的snort规则
activate/dynamic规则
activate/dynamic规则对扩展了snort功能。使用activate/dynamic规则对,你能够使用一条规则激活另一条规则。当一条特定的规则启动,如果你想要snort接着对符合条件的数据包进行记录时,使用activate/dynamic规则对非常方便。除了一个必需的选项activates外,激活规则(activate rule)非常类似于报警规则(alert rule)。动态规则(dynamic rule)和日志规则(log rule)也很相似,不过它需要一个选项:activated_by。动态规则还需要另一个选项:count。当一个激活规则启动,它就打开由activate/activated_by选项之后的数字指示的动态规则,记录count个数据包。
下面是一条activate/dynamic规则对的规则:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags:PA;content:"|E8C0FFFFFF|in|;activates:1;
表8.activate/dynamic规则对
这个规则使snort在检测到IMAP缓冲区溢出时发出报警,并且记录后续的50个从$HOME_NET之外,发往$HOME_NET的143号端口的数据包。如果缓冲区溢出成功,那么接下来50个发送到这个网络同一个服务端口(这个例子中是143号端口)的数据包中,会有很重要的数据,这些数据对以后的分析很有用处。
3.规则选项
规则选项构成了snort入侵检测引擎的核心,它们非常容易使用,同时又很强大和容易扩展。在每条snort规则中,选项之间使用分号进行分割。规则选项关键词和其参数之间使用冒号分割。截止到写本文为止(snort 1.7版),snort有23个规则选项关键词:
msg:在报警和日志中打印的消息
logto:把日志记录到一个用户指定的文件,而不是输出到标准的输出文件
ttl:测试IP包头的TTL域的值
tos:测试IP包头的TOS域的值
id:测试IP分组标志符(fragment ID)域是否是一个特定的值
ipoption:查看IP选项(IP option)域
fragbits:测试IP包头的分片位(fragmentation bit)
dsize:测试数据包包数据段的大小
flags:测试TCP标志(flag)是否是某个值
seq:测试TCP包的序列号是否是某个值
ack:测试TCP包的确认(acknowledgement)域是否为某个值
itype:测试ICMP数据包的类型(type)域
icode:测试ICMP数据包的编码(code)域
icmp_id:测试ICMP回送包的标志符(ICMP ECHO ID)是否为某个值
content:在数据包的数据段中搜索模式(pattern)
content-list:在数据包的数据段中搜索模式清单
offset:设置开始搜索的偏移量
depth:设置搜索最大深度
nocase:大小写不敏感匹配内容字符串
session:剥离一个对话的应用层信息
rpc:观察RPC服务对特定应用程序的调用
resp:激活反应措施(断开连接等)
react:激活反应措施(阻塞WEB站点)
3.1 msg
msg规则选项告诉日志引擎在复制包时同时打印的信息,以及让报警引擎输出的警告消息。它只是一个简单的文本字符串,使用作为转义符。
格式:
msg:"";
3.2 logto
logto选项告诉snort把触发某条规则所有的数据包都记录到指定的文件。使用这个选项,对处理来自nmap扫描、HTTP CGI扫描的数据非常方便。注意如果使用二进制日志模式,这个选项会失效。
格式:
logto:"<文件名>";
3.3 ttl
这个选项设置要测试的生命周期(time-to-live)值。只有数据包的TTL和这个选项设置的值精确匹配,测试才会成功。这个选项主要用来检测路由企图。
格式:
ttl:"";
3.4 tos
你可以使用tos关键词检查IP包头的TOS(type of service)域是否是一个特定的值。也是只有在被检测包TOS域的值和给定的值精确匹配时,这个测试才会成功。
格式:
tos:"";
3.5 ID
这个选项关键词用来测试IP分片包头的ID域。一些黑客工具为了不同的目的把这个域设置为特殊的值,例如:31337是在一些黑客中比较流行的值。使用这个选项就可以阻止这种攻击。
格式:
id: "";
3.6 lpoption
如果IP包中有选项域,可以使用这个规则选项搜索IP包头的特定选项,例如源路由。这个规则选项可以使用的参数如下:
rr:路由记录
eof:End of list
nop:无操作
ts:时间戳
sec:IP安全选项
lsrr:宽松源路由(loose source routing)
ssrr:严格源路由(strict source roution)
satid:流标识符
最常被注意的IP选项是loose&strict source routing,不过在Internet上广泛使用的任何应用程序中都没使用这两个选项。每条规则中只能设定一个IP规则。
格式:
ipopts: ;
3.7 fragbits
㈧ 入侵检测软件snort有哪些功能
Snort最重要的用途还是作为网络入侵检测系统(NIDS)。
使用简介
Snort并非复杂难以操作的软体。 Snort可以三个模式进行运作:
侦测模式(Sniffer Mode):此模式下,Snort将在现有的网域内撷取封包,并显示在荧幕上。
封包纪录模式(packet logger mode):此模式下,Snort将已撷取的封包存入储存媒体中(如硬盘)。
上线模式(inline mode):此模式下,Snort可对撷取到的封包做分析的动作,并根据一定的规则来判断是否有网路攻击行为的出现。
基本指令:侦测模式
若你想要在萤幕上显示网路封包的标头档(header)内容,请使用
./snort -v
如果想要在萤幕上显示正在传输的封包标头档内容,请使用
./snort -vd
如果除了以上显示的内容之外,欲另外显示数据链路层(Data link layer)的资料的话,请使用
./snort -vde
㈨ Snort入侵检测实用解决方案的内容简介
《网站入侵与脚本攻防修炼》从“攻”、“防”两个角度,通过现实中的入侵实例,并结合原理性的分析,图文并茂地展现网站入侵与防御的全过程。全书共分8章,系统地介绍网站入侵的全部过程,以及相应的防御措施和方法。其中包括网站入侵的常见手法、流行网站脚本入侵手法揭密与防范、远程攻击入侵网站与防范、网站源代码安全分析与测试等。《网站入侵与脚本攻防修炼》尤其对网站脚本漏洞原理进行细致的分析,帮助网站管理员、安全人员、程序编写者分析、了解和测试网站程序的安全性漏洞。《网站入侵与脚本攻防修炼》用图解的方式对网站入侵步骤及安全防范设置都进行详细的分析,并且对一些需要特别注意的安全事项进行重点提示,过程中还加入一些安全技巧。
随书所配光盘内容包括书中涉及的源代码、视频教程和演示动画,方便读者学习和参考。
《网站入侵与脚本攻防修炼》适合于网络安全技术爱好者、网络管理员、网站程序编写人员阅读,也可作为相关专业学生的学习及参考资料。
㈩ 用winpcap来做入侵检测,下载了好几个入侵系统,但是对于规则的设定不理解,而且也找不到方法去理解,求帮忙.
你的主要目的是什么?如果觉得winpcap不好操作可以换其它的,如果只是用来渗透踩点,完全可以用其它更好的。