Snort规则定义与测试

网络安全安全Linux
一、实验环境

攻击机:kali2022  IP:192.168.127.124

靶  机:Ubuntu22.04 IP:192.168.127.122

软  件:snort 版本3.6.0、ping等

二、实验内容

步骤一  Snort规则的基本语法和构成

Snort3规则的基本格式:


<规则动作> <协议> <源IP> <源端口> —> <目标IP> <目标端口> (<规则选项>)

Snort规则由规则头部和规则选项组成:

规则头部(Rule Header):

规则头告诉snort在什么范围内去应用规则,并且做出什么动作。

  1. 动作(Action):定义当规则匹配时采取的行动,如alert、log、pass、activate等。
  2. 协议(Protocol):指定规则适用的协议,如TCP、UDP、ICMP等。
  3. 源IP地址(Source IP Address):指定数据包的源IP地址,可以使用任何有效的IP地址或网络地址。
  4. 源端口(Source Port):指定数据包的源端口号,可以使用任何有效的端口号或范围。
  5. 方向操作符(Direction Operator):指示流量的方向,“->”表示单向流动,“<>”表示双向流动等。
  6. 目的IP地址(Destination IP Address):指定数据包的目的IP地址。
  7. 目的端口(Destination Port):指定数据包的目的端口号。

规则选项(Rule Options):

规则选项通常包含多个关键字和对应的参数,用于定义要匹配的特定模式或特征。关键字和参数之间用冒号“:”分隔,不同的关键字之间用分号“;”分隔。

  1. msg(Message):当规则触发时显示的消息。
  2. content(Content):用于匹配数据包内容的规则选项。
  3. depth(Depth):指定content选项搜索的最大深度。
  4. offset(Offset):指定content选项开始搜索的位置。
  5. nocase(No Case):使content选项不区分大小写。
  6. flags(Flags):用于匹配TCP标志位。
  7. seq(Sequence Number):用于匹配TCP序列号。
  8. ack(Acknowledgment Number):用于匹配TCP确认号。
  9. dsize(Data Size):用于匹配数据包的大小。
  10. flow(Flow):用于匹配流控制信息。
  11. reference(Reference):提供关于规则的参考信息,通常包括CVE编号、Bugtraq ID等。
  12. classtype(Class Type):用于分类规则的类型。
  13. sid(Signature ID):规则的唯一标识符。
  14. rev(Revision):规则的版本号。

步骤二  创建自定义本地规则集测试Snort

  • 创建自定义本地规则集,用来测试Snort。

 sudo vim /usr/local/etc/rules/local.rules  //创建本地规则集

**注意:可以把自定义规则路径写进/usr/local/etc/snort/snort.lua配置文件中,同样是在ips部分定义规则集的路径,在include = ‘自定义规则集的路径’

  • 创建一个用于检测ping的规则,内容如下

alert icmp any any -> $HOME_NET any (msg:"ICMP connection test"; sid:1000001; rev:1;)

(1) alert icmp any any -> $HOME_NET any:这部分是规则的动作和流量描述。

  • alert:表示当这条规则被触发时,IDS将生成一个警报。
  • icmp:指定了这条规则适用于ICMP(Internet Control Message Protocol,互联网控制消息协议)类型的网络流量。ICMP通常用于发送错误消息、操作信息和其他需要注意的信息。
  • any any:第一个any表示源IP地址可以是任何地址;第二个any表示源端口也可以是任何端口(对于ICMP来说,端口的概念并不直接适用,但这里的格式是遵循更广泛的规则语法)。
  • ->:表示流量的方向,从左边到右边。
  • HOMENETanyHOME_NET any:HOME_NET是一个变量,通常在网络配置文件中定义,表示受监控或保护的网络范围;第二个any表示目的端口可以是任何端口。

(2) (msg:"ICMP connection test"; sid:1000001; rev:1;):这部分是规则的附加信息和元数据。

  • msg:"ICMP connection test":为这条规则提供了一个描述性的消息,说明这条规则是为了检测ICMP连接测试。
  • sid:1000001:为每个规则分配一个唯一的签名ID(Signature ID),用于标识和区分不同的规则。
  • rev:1:表示这条规则的版本号是1,这对于跟踪规则的更新和修改很有用。

**这条规则的作用是:**当检测到任何源IP地址向受监控网络($HOME_NET)发送ICMP流量时,IDS将生成一个警报,描述为“ICMP连接测试”,规则的唯一签名ID是1000001,且这是该规则的第一个版本。这种规则通常用于监控网络上的ping请求或其他ICMP活动,以检测可能的网络扫描或探测行为.

  • 测试规则是否编写正确:

~/桌面/snortSourceFiles$snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules 

--------------------------------------------------
o")~   Snort++ 3.6.0.0
--------------------------------------------------
Loading /usr/local/etc/snort/snort.lua:
Loading snort_defaults.lua:
......
appid: patterns loaded: 11537
--------------------------------------------------
pcap DAQ configured to passive.
Snort successfully validated the configuration (with 0 warnings).
o")~   Snort exiting
  • 执行测试命令:

sudo snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules -i ens33 -A alert_fast -s 65535 -k none 

        这条命令用于启动 Snort 入侵检测系统,并指定了一些配置选项。以下是每个参数的含义:

  1. snort: 调用 Snort 程序。
  2. -c /usr/local/etc/snort/snort.lua: 使用指定的 Lua 配置文件 /usr/local/etc/snort/snort.lua。Lua 是一种轻量级的脚本语言,Snort 可以使用它来扩展和自定义其功能。
  3. -R /usr/local/etc/rules/local.rules: 加载本地规则文件 /usr/local/etc/rules/local.rules。这些规则定义了 Snort 如何检测网络流量中的可疑活动。
  4. -i ens33: 指定要监听的网络接口为 ens33。这个接口是 Snort 将捕获和分析网络流量的地方。
  5. -A _fast: 设置警报模式为 _fast。通常意味着 Snort 将以快速模式运行,可能会牺牲一些准确性以换取性能。
  6. -s 65535: 设置日志记录的输出目录为 65535。一个临时目录,用于存储日志文件。
  7. -k none: 禁用检查点功能。这意味着 Snort 不会保存状态信息,每次重启都会从头开始分析流量。
  • 然后在攻击主机kali上执行ping命令,ping snort主机

ping 192.168.127.122

picture.image

  • 回到Ubuntu可以看到开始数据包处理(Commencing packet processing),测试成功

picture.image

  • 结束ping,此时攻击机一共向靶机发送了49个icmp数据包,并且都送达,没有丢失。

picture.image

  • 在终端可以看到snort3统计到的数据如下:

Packet Statistics(数据包统计)

daq(数据包获取):

  1. received: 接收到的数据包总数为151。
  2. analyzed: 分析的数据包总数为151。
  3. allow: 允许通过的数据包总数为151(全部被分析)。
  4. rx_bytes: 接收到的字节总数为18696。

codec(编解码器):

  1. total: 总数据包数为151。
  2. arp, eth, icmp4, icmp6, ipv4, ipv6, tcp, udp: 分别是不同协议的数据包数量和百分比。

picture.image

Module Statistics(模块统计)

  1. ac_bnfa 和 ac_full:这两种是Snort中用于模式匹配的算法,显示了搜索次数、匹配次数和处理的字节数。
  2. appid:应用识别模块,显示了处理的、忽略的数据包数量,会话数量,服务缓存添加次数等。
  3. arp_spoof(ARP欺骗)、back_orifice(一种后门工具)、binder(Android的IPC机制之一)等模块显示了各自处理的数据包数量或流程信息。
  4. detection:检测模块,显示了分析的数据包数量、硬评估次数、搜索次数、警报数量等。
  5. dns、ips_actions、port_scan、search_engine、ssl等模块提供了各自领域内的详细统计信息。
  6. stream、stream_icmp、stream_tcp、stream_udp:流重建模块,显示了会话数量、创建和释放的会话等。
  7. wizard:用于检测扫描活动的模块,显示了TCP和UDP扫描的尝试和结果。

部分截图如下: picture.image

Appid Statistics(应用识别统计)

  1. 显示了检测到的应用程序和服务的详细信息,包括应用程序名称、服务数量、客户端数量、用户数量、有效载荷数量等。

Summary Statistics(总结统计)

  1. process:进程信号数量为2。
  2. timing:运行时间00:02:32、秒数为152和每秒处理的数据包数量为1。

picture.image

步骤三  配置Snort 3的日志输出并测试

  • 修改snort配置文件,在configure outputs部分配置是否输出为文件

sudo vim /usr/local/etc/snort/snort.lua			//打开并修改配置文件

picture.image

        修改后,snort将写入日志到文件alert_fast.txt

  • 检查配置,出现“Snort successfully validated the configuration (with 0 warnings)”配置成功。

~/桌面/snortSourceFiles$snort -c /usr/local/etc/snort/snort.lua
--------------------------------------------------
o")~   Snort++ 3.6.0.0
--------------------------------------------------
Loading /usr/local/etc/snort/snort.lua:
Loading snort_defaults.lua:
Finished snort_defaults.lua:
	Ssh
......

Snort successfully validated the configuration (with 0 warnings).
o")~   Snort exiting
  • 执行测试,用-l指定日志目录

~/桌面/snortSourceFiles$sudo snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules -i ens33 -s 65535 -k none -1 /var/log/snort/ 
--------------------------------------------------
o")~   Snort++ 3.6.0.0
--------------------------------------------------
Loading /usr/local/etc/snort/snort.lua:
......
appid: patterns loaded: 11537
--------------------------------------------------
pcap DAQ configured to passive.
Commencing packet processing
++ [0] ens33

        下面是关于测试命名的解释:

  1. -c /usr/local/etc/snort/snort.lua:这个选项指定了Snort的配置文件。在这个例子中,配置文件是一个Lua脚本(snort.lua),它位于/usr/local/etc/snort/目录下。Lua脚本通常用于配置Snort的高级功能。
  2. -R /usr/local/etc/rules/local.rules:这个选项告诉Snort使用指定的规则文件。在这个例子中,规则文件是local.rules,它位于/usr/local/etc/rules/目录下。这些规则定义了Snort将如何检测网络流量中的异常或攻击行为。
  3. -i ens33:这个选项指定了Snort将要监听的网络接口。在这个例子中,接口名是ens33。
  4. -s 65535:这个选项设置了Snort可以捕获的数据包的最大大小(以字节为单位)。在这个例子中,它被设置为65535字节,这是以太网帧的最大可能大小。
  5. -k none:这个选项用于设置Snort的校验和模式。none表示不进行任何校验和验证。
  6. -1 /var/log/snort/:这个选项指定了Snort日志文件的目录。在这个例子中,日志将被写入/var/log/snort/目录。
  • 再次在kali使用ping向snort靶机发送icmp数据包

picture.image

  • 警告会被写入到日志文件:

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
云原生数仓如何构建高性能向量检索技术
火山引擎ByteHouse团队基于社区 ClickHouse 进行技术演进,提出了全新的向量检索功能设计思路,满足业务对向量检索稳定性与性能方面的需求。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论