入侵检测与安全组件的联动

【实验目的】

掌握了Snort3与Iptables基本配置

【知识点】

snort3,Iptables

【实验原理】

在1998年,Martin Roesch用C语言开发了开放源代码(Open Source)的入侵检测系统Snort。Snort已发展成为一个具有多平台(Multi-Platform)、实时(Real-Time)流量分析、网络IP数据包(Pocket)记录等特性的强大的网络入侵检测/防御系统(Network Intrusion Detection/Prevention System),即NIDS/NIPS。Snort符合通用公共许可(GPL------GNU General Public License),在网上可以通过免费下载获得Snort,并且只需要几分钟就可以安装并开始使用。

Snort有三种工作模式:嗅探器、数据包记录器、网络入侵检测系统。嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上。数据包记录器模式把数据包记录到硬盘上。网络入侵检测模式是最复杂的,而且是可配置的。我们可以让snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。

Snort能够对网络上的数据包进行抓包分析,但区别于其它嗅探器的是,它能根据所定义的规则进行响应及处理。Snort 通过对获取的数据包,进行各规则的分析后,根据规则链,可采取Activation(报警并启动另外一个动态规则链)、Dynamic(由其它的规则包调用)、Alert(报警),Pass(忽略),Log(不报警但记录网络流量)五种响应的机制。

Snort有数据包嗅探,数据包分析,数据包检测,响应处理等多种功能,每个模块实现不同的功能,各模块都是用插件的方式和Snort相结合,功能扩展方便。例如,预处理插件的功能就是在规则匹配误用检测之前运行,完成TIP碎片重组,http解码,telnet解码等功能,处理插件完成检查协议各字段,关闭连接,攻击响应等功能,输出插件将得理后的各种情况以日志或警告的方式输出。

Snort通过在网络TCP/IP的5层结构的数据链路层进行抓取网络数据包,抓包时需将网卡设置为混杂模式,根据操作系统的不同采用libpcap或winpcap函数从网络中捕获数据包;然后将捕获的数据包送到包解码器进行解码。

IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。

【软件工具】

  • Web 服务器:ubuntu 1台;
  • 操作机:ubuntu-desktop-20.04.5 1台;
  • 恶意PC : Kali linux 1台;
  • 交换机/路由 2台;
  • 软件:Snort3、iptables;

【实验拓扑】

【实验预期】

实现通过snort日志,自动阻断web攻击。

【实验步骤与结果】

1.SQL注入攻击

进入【Snort】控制台,(参考前几节的Web攻击分析与检测),编辑/usr/local/etc/rules/local.rules文件中创建两个规则,在终端中使用vim命令进行local.rules规则编辑,添加规则如下图所示,完成后保存并退出。

复制代码
alert tcp any any -> any 80 (msg: "Error Based SQL Injection Detected %27"; content: "%27" ; sid:100000011; )
alert tcp any any -> any 80 (msg: "Error Based SQL Injection Detected %22"; content: "%22" ; sid:100000012; )

现在,在接口上以检测模式运行Snort,并将所有警报打印到日志目录。

复制代码
snort -c /usr/local/etc/snort/snort.lua -i eth0 -s 65535 -k none -l /var/log/snort

新建终端使用tail -f 打印日志/var/log/snort/alert_fast.txt,如下图所示。

切换【恶意PC】控制台,在浏览器访问地址http://172.168.12.1/sqli/01.php?id=1',此处执行多次,如下图所示。

切换至【Snort】控制台,可以看到snort警告日志输出Error Based SQL Injection Detected %27

2.阻断攻击

切换至【Snort】控制台,使用命令封禁黑客IP地址140.250.74.206的全部数据包【iptables -I FORWARD -s 140.250.74.206 -j DROP】,再使用【iptables -L】查看规则命令,如下图所示。

参数-I是表示Insert(添加),-D表示Delete(删除)。后面跟的是规则,FORWARD表示Linux内核的路由和数据包转发,..***.***表示要封停的IP,DROP表示放弃连接。

  1. 如果数据包的目的地址是本机,则系统将数据包送往Input链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
  2. 如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往Forward链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
  3. 如果数据包是由本地系统进程产生的,则系统将其送往Output链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
  4. input--用于处理"进入"路由器的数据包,即数据包目标IP地址是到达路由器一个接口的IP地址,"经过"路由器的数据包不会在input-chains处理(这里要注意理解的是"进入"和"经过"的不同意味),forward-- 用于处理"通过"路由器的数据包。

切换【恶意PC】控制台,新建浏览器标签页,再次执行,发现无法访问,如下图所示。

切换至【snort】控制台,解除黑客IP地址封禁,【iptables -D FORWARD -s 140.250.74.206 -j DROP】,再使用【iptables -L】查看规则命令,已将上条规则清除,如下图所示。

切换【恶意PC】控制台,再次执行可正常访问。

3.编写脚本实现自动阻断

切换至【snort】控制台,首先过滤出黑客的IP地址使用cat命令查看/var/log/snort/alert_fast.txt日志文件,然后再使用awk命令过滤提取出倒数两列的IP地址,如下图所示。

复制代码
cat /var/log/snort/alert_fast.txt | awk '{print $(NF-2),$(NF)}'

过滤出黑客IP地址,后面再跟上egrep 提取带冒号的字符串,及过滤IP地址及端口号,最后使用awk命令过滤提取出倒数第二列的IP地址,及为黑客IP地址,如下图所示。

复制代码
cat /var/log/snort/alert_fast.txt | awk '{print $(NF-2),$(NF)}' | egrep ':' | awk -F ":" '{print $(NF-2)}'