Scapy教程:如何利用Scapy测试Snort规则

2010-3-17   
   | |

导读:基于规则驱动的Snort IDS有其官方规则集,用户也可自定义规则以检测应用程序的流量。本文介绍了如何利用Scapy生成触发Snort规则的测试数据包,来简化测试过程。

关键词:Scapy测试 Snort IDS规则 测试数据包 命令代码 TCP/IP

 
正在加载数据...

【TechTarget中国原创】目前流行的Snort入侵检测系统(IDS)是基于规则驱动的,用户可以检查或修改入侵检测规则,以便当网络流量中含有恶意内容时Snort能发出警报。

虽然Snort有自己的官方规则集,但用户也可以编写新的规则,以检测定制服务或是应用程序的网络流量。在这些检测规则制定后,应该对它进行测试,以确保能按照预期设想的进行工作。但是当网络中没有数据流量时,这种测试将变得异常棘手。

自己构建数据包来测试Snort是解决这个问题的一种方案。在本文中,我们将讨论如何使用Scapy,生成触发Snort规则的测试数据包。Scapy是一个基于Python语言开发的工具,它能够……

【TechTarget中国原创】众所周知,目前流行的Snort入侵检测系统(IDS)是基于规则驱动的,用户可以检查或修改入侵检测规则,以便当网络流量中含有恶意内容时Snort能发出警报。

  虽然Snort有自己的官方规则集,但用户也可以编写新的规则,以检测定制服务或是应用程序的网络流量。在这些检测规则制定后,应该对它进行测试,以确保能按照预期设想的进行工作。但是当网络中没有数据流量时,这种测试将变得异常棘手。

  自己构建数据包来测试Snort是解决这个问题的一种方案。在本文中,我们将讨论如何使用Scapy,生成触发Snort规则的测试数据包。Scapy是一个基于Python语言开发的工具,能够简化网络数据包的构造。

  如何制定一个简单的Snort规则

  在阐述如何使用Scapy之前,我们先复习一下如何创建Snort规则。假设你有一个应用程序正在侦听端口1234上的UDP数据包,当对此应用程序发送的负载内容含有“evil”时,你希望Snort能够发出警报。您可以像下面这样创建Snort规则:

alert udp any any -> $HOME_NET 1234 (msg: "EVIL payload"; flow:to_server; content:"evil"; nocase; sid:1234567;)

  这个规则使得Snort会去检查任何从受保护的网络主机或端口发送到目的端口为1234的UDP数据包,检测数据包中是否含有不区分大小写的"evil"字段。上面命令中字段 $HOME_NET是Snort配置文件中定义的一个变量,该变量应该代表受保护的网络中的IP地址,或一个无类别域间路由(Classless Inter-Domain Routing ,CIDR)块。

  虽然有些Snort规则可以设计得非常复杂,但这只是一个相当简单的数据包构造规则。对于任意数据包,如果其IP头的目的地址IP与$ HOME_NET所定义的主机相匹配,UDP头的目标端口为1234,并且实际数据内容含有"evil"字段,该Snort规则都将被触发。

  如何应用Scapy测试Snort规则

  一旦Snort规则建立,下一步需要做的就是生成测试数据包。你可以使用命令行或者使用Python程序,通过调用Scapy生成数据包来测试Snort规则。在生成较为简单的数据包时,命令行接口更实用,例如针对上面我们所制定的规则。然而,对于更复杂的规则,我们需要采用Python语言,因为它具备许多传统编程语言的优点,如条件执行(conditional execution)和循环机制,这使得用户能够创建一个更复杂和可复用的程序。

  Scapy数据包的生成模拟了TCP / IP模型的分层机制,它能对数据链路层、网络层、传输层和应用层进行很标准的定义和区分。因此,如果用户具备TCP / IP协议的知识会非常有用。用于测试这条Snort规则的数据包实际上有三层:IP报头、UDP报头和实际数据。下面是一段简单的Scapy代码,可用于生成和发送数据包:

root@myhost:~#sudo scapy
Welcome to Scapy (2.0.1)
>>>i=IP(dst="192.168.1.103")
>>>u=UDP(dport=1234)
>>>pay="evil payload"
>>>packet=i/u/pay
>>>send(pay)

  开始进行测试时,你需要有超级用户或root权限来运行Scapy,因为Scapy需要向网卡驱动程序发送数据包,而普通用户是不允许执行这样的操作。当输入scapy命令后,会弹出欢迎消息,之后是Scapy的提示符。接下来,代码创建了我们IP头的实例,以字母’i’表示。 Scapy 使用IP()创建了IP头,并在括号中赋予了IP头字段的值。在上面的例子中,目的IP地址是唯一进行了赋值的字段,而其他任何未定义的值会被赋予一个默认值。

  同样,上面代码段的第二行我们定义了UDP头的实例,其目的端口为1234,以字母‘u’表示。在第三行,我们对数据内容进行了规定,保存在字段pay中。Scapy使用斜线将各个层次区别开来又合并放在一起。因此,第四行的含义是我们发送的数据包由我们定义的IP头“i”,UDP层实例“u”和我们在pay中保存的数据内容三者组成。最后一行表示,数据包通过Scapy的第三层(即网络层)"send"命令被发送出去。

  在发送生成的数据包之前,你需要启动Snort并且确保它的设置中含有新的规则,命令如下:

sudo snort -A console -q -c snort.conf -K none

  此命令意思是:启动Snort,并且把输出定向到终端,不显示启动消息,从配置文件snort.conf中进行读取,并禁用日志记录。如果数据包已按要求生成,则新Snort规则会被触发。下面是使用Scapy生成的数据包导致Snort发出的警报信息:

02/18-09:41:42.310128 [**] [1:12345:0] EVIL payload [**] [Priority: 0] {UDP} 192.168.1.104:53 -> 192.168.1.105:1234

  警报中包括如下信息:警报发生日期及时间戳,Snort的ID为“12345”,其次是Snort的消息“EVIL payload,”以及Snort的优先级,数据包使用的是UDP通信协议,源IP地址为192.168.1.104,源端口为53,目的IP地址192.168.1.105,目的端口为1234。

  总结

  以上内容只是一个最基本的介绍,介绍了在测试Snort规则时Scapy的用途。Scapy特别适用于测试某些Snort规则,例如对已建立连接中TCP数据内容进行审查的规则。当然,Scapy还有更多的用途,它甚至可以读取、写入和改变从网上抓取的数据包文件。无可否认,Scapy是一款非常强大的工具,对于那些整日与网路流量及网路数据包打交道的人来说更是这样,因为它的用途还包括入侵分析、渗透测试和网络工程。

 
查看全文
 
 
 
 
 

入侵检测系统

 
入侵检测系统(IDS)的选择、部署和维护工作是基于需求和公司现有的基础设施。一个产品可能会很好的为一家公司工作却不适合另一家,选择通常是最难做的决定。
 
许多企业并没有把检测看成是一种战略上的安全能力,但对企业来说,基本的网络入侵检测系统真的够吗?
 
基于规则驱动的Snort IDS有其官方规则集,用户也可自定义规则以检测应用程序的流量。然而当网络中没有相应的数据流量时该如何测试?这时就可利用Scapy工具……
 
蜜罐技术能提供针对企业环境攻击行为的大量细节信息,但一定要小心,蜜罐技术也会带来很大的风险。企业在采用这项技术之前,有很多重要的问题需要认真考虑……
 
我的FreeBSD路由器有两个网络接口卡,我可以安装一个类似Snort的工具吗?如果可以,那么需要进行哪些配置?Techtarget专家Mike Chapple给出的答案是……
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
登录Email
请输入您的登录Email
密码
下次自动登录