攻击机: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在什么范围内去应用规则,并且做出什么动作。
- 动作(Action):定义当规则匹配时采取的行动,如alert、log、pass、activate等。
- 协议(Protocol):指定规则适用的协议,如TCP、UDP、ICMP等。
- 源IP地址(Source IP Address):指定数据包的源IP地址,可以使用任何有效的IP地址或网络地址。
- 源端口(Source Port):指定数据包的源端口号,可以使用任何有效的端口号或范围。
- 方向操作符(Direction Operator):指示流量的方向,“->”表示单向流动,“<>”表示双向流动等。
- 目的IP地址(Destination IP Address):指定数据包的目的IP地址。
- 目的端口(Destination Port):指定数据包的目的端口号。
规则选项(Rule Options):
规则选项通常包含多个关键字和对应的参数,用于定义要匹配的特定模式或特征。关键字和参数之间用冒号“:”分隔,不同的关键字之间用分号“;”分隔。
- msg(Message):当规则触发时显示的消息。
- content(Content):用于匹配数据包内容的规则选项。
- depth(Depth):指定content选项搜索的最大深度。
- offset(Offset):指定content选项开始搜索的位置。
- nocase(No Case):使content选项不区分大小写。
- flags(Flags):用于匹配TCP标志位。
- seq(Sequence Number):用于匹配TCP序列号。
- ack(Acknowledgment Number):用于匹配TCP确认号。
- dsize(Data Size):用于匹配数据包的大小。
- flow(Flow):用于匹配流控制信息。
- reference(Reference):提供关于规则的参考信息,通常包括CVE编号、Bugtraq ID等。
- classtype(Class Type):用于分类规则的类型。
- sid(Signature ID):规则的唯一标识符。
- 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来说,端口的概念并不直接适用,但这里的格式是遵循更广泛的规则语法)。
- ->:表示流量的方向,从左边到右边。
- 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 入侵检测系统,并指定了一些配置选项。以下是每个参数的含义:
- snort: 调用 Snort 程序。
- -c /usr/local/etc/snort/snort.lua: 使用指定的 Lua 配置文件 /usr/local/etc/snort/snort.lua。Lua 是一种轻量级的脚本语言,Snort 可以使用它来扩展和自定义其功能。
- -R /usr/local/etc/rules/local.rules: 加载本地规则文件 /usr/local/etc/rules/local.rules。这些规则定义了 Snort 如何检测网络流量中的可疑活动。
- -i ens33: 指定要监听的网络接口为 ens33。这个接口是 Snort 将捕获和分析网络流量的地方。
- -A _fast: 设置警报模式为 _fast。通常意味着 Snort 将以快速模式运行,可能会牺牲一些准确性以换取性能。
- -s 65535: 设置日志记录的输出目录为 65535。一个临时目录,用于存储日志文件。
- -k none: 禁用检查点功能。这意味着 Snort 不会保存状态信息,每次重启都会从头开始分析流量。
-
然后在攻击主机kali上执行ping命令,ping snort主机
ping 192.168.127.122
-
回到Ubuntu可以看到开始数据包处理(Commencing packet processing),测试成功
-
结束ping,此时攻击机一共向靶机发送了49个icmp数据包,并且都送达,没有丢失。
-
在终端可以看到snort3统计到的数据如下:
Packet Statistics(数据包统计)
daq(数据包获取):
- received: 接收到的数据包总数为151。
- analyzed: 分析的数据包总数为151。
- allow: 允许通过的数据包总数为151(全部被分析)。
- rx_bytes: 接收到的字节总数为18696。
codec(编解码器):
- total: 总数据包数为151。
- arp, eth, icmp4, icmp6, ipv4, ipv6, tcp, udp: 分别是不同协议的数据包数量和百分比。
Module Statistics(模块统计)
- ac_bnfa 和 ac_full:这两种是Snort中用于模式匹配的算法,显示了搜索次数、匹配次数和处理的字节数。
- appid:应用识别模块,显示了处理的、忽略的数据包数量,会话数量,服务缓存添加次数等。
- arp_spoof(ARP欺骗)、back_orifice(一种后门工具)、binder(Android的IPC机制之一)等模块显示了各自处理的数据包数量或流程信息。
- detection:检测模块,显示了分析的数据包数量、硬评估次数、搜索次数、警报数量等。
- dns、ips_actions、port_scan、search_engine、ssl等模块提供了各自领域内的详细统计信息。
- stream、stream_icmp、stream_tcp、stream_udp:流重建模块,显示了会话数量、创建和释放的会话等。
- wizard:用于检测扫描活动的模块,显示了TCP和UDP扫描的尝试和结果。
部分截图如下:
Appid Statistics(应用识别统计)
- 显示了检测到的应用程序和服务的详细信息,包括应用程序名称、服务数量、客户端数量、用户数量、有效载荷数量等。
Summary Statistics(总结统计)
- process:进程信号数量为2。
- timing:运行时间00:02:32、秒数为152和每秒处理的数据包数量为1。
步骤三 配置Snort 3的日志输出并测试
-
修改snort配置文件,在configure outputs部分配置是否输出为文件
sudo vim /usr/local/etc/snort/snort.lua //打开并修改配置文件
修改后,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
下面是关于测试命名的解释:
- -c /usr/local/etc/snort/snort.lua:这个选项指定了Snort的配置文件。在这个例子中,配置文件是一个Lua脚本(snort.lua),它位于/usr/local/etc/snort/目录下。Lua脚本通常用于配置Snort的高级功能。
- -R /usr/local/etc/rules/local.rules:这个选项告诉Snort使用指定的规则文件。在这个例子中,规则文件是local.rules,它位于/usr/local/etc/rules/目录下。这些规则定义了Snort将如何检测网络流量中的异常或攻击行为。
- -i ens33:这个选项指定了Snort将要监听的网络接口。在这个例子中,接口名是ens33。
- -s 65535:这个选项设置了Snort可以捕获的数据包的最大大小(以字节为单位)。在这个例子中,它被设置为65535字节,这是以太网帧的最大可能大小。
- -k none:这个选项用于设置Snort的校验和模式。none表示不进行任何校验和验证。
- -1 /var/log/snort/:这个选项指定了Snort日志文件的目录。在这个例子中,日志将被写入/var/log/snort/目录。
-
再次在kali使用ping向snort靶机发送icmp数据包
-
警告会被写入到日志文件: