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

日期: 2010-03-16 作者:Judy Novak翻译:Sean 来源:TechTarget中国 英文

众所周知,目前流行的Snort入侵检测系统(IDS)是基于规则驱动的,用户可以检查或修改入侵检测规则,以便当网络流量中含有恶意内容时Snort能发出警报。   虽然Snort有自己的官方规则集,但用户也可以编写新的规则,以检测定制服务或是应用程序的网络流量。在这些检测规则制定后,应该对它进行测试,以确保能按照预期设想的进行工作。但是当网络中没有数据流量时,这种测试将变得异常棘手。

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

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

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是一款非常强大的工具,对于那些整日与网路流量及网路数据包打交道的人来说更是这样,因为它的用途还包括入侵分析、渗透测试和网络工程。

翻译

Sean
Sean

相关推荐

  • 详解DDoS攻击技术

    通常情况下,人们对DDOS的认识是知道它可以利用无用流量占据网络中的所有带宽,导致出现数据拥塞,从而无法进行正常工作的情况,但这只是冰山一角。

  • Linux下常用监控cacti的安装和配置(附图)

    本文介绍了Linux下常用监控cacti的架构、工作流程安装和配置的具体操作步骤,对操作命令做了详细注释说明易学易懂……

  • 创建服务器间的SSL连接

    我们应如何通过Internet在两个服务端间建立进行通讯的SSL连接呢?怎样的设置才是最好、最安全的?专家Mike Chapple将为我们解开疑团。

  • 如何配置网络防火墙与上游路由器通信

    我们使用同一家厂商的路由器和交换机,但是现在想要使用另一家厂商的防火墙产品。我们遇到了配置问题,防火墙和上游路由器不能通信。发生这种情况的最常见的原因是什么呢?