使用Snort进行网络入侵流量检测

使用Snort进行网络入侵流量检测

Snort是一种开源网络入侵检测系统 (NIDS),使用基于签名的检测技术分析网络流量并检测威胁。它提供灵活的规则语言,因此用户可以编写自己的威胁检测规则或自定义现有规则。此外snort还拥有社区提供的大量规则。

主机安全(HIDS)很多人都知道,但是NIDS大部分人都了解比较少,本文通过部署开源的snort作为NIDS检测主机流量。

HIDS和NIDS的区别

HIDS(主机入侵检测系统)和NIDS(网络入侵检测系统)的主要特点和差异:

特点HIDS(主机入侵检测系统)NIDS(网络入侵检测系统)
监控范围监控单个主机的内部活动和状态监控网络的数据流动
部署位置部署在特定主机上部署在网络的关键交汇点,如网络边界或核心交换机附近
侦测内容系统调用、文件系统访问、系统日志等捕获和分析网络流量,如数据包内容
主要功能检测未授权文件改动、系统配置异常、恶意软件活动等检测拒绝服务攻击、端口扫描、恶意流量模式等
面对威胁侧重防范内部威胁和后门攻击侧重检测网络层面的攻击和异常活动
局限性无法获得网络层面的信息,可能影响主机性能对加密流量的分析能力受限,难以深入单一主机的具体应用层面

安装 Snort

apt install snort -y

安装完成后查看snort版本。

root@VM-24-5-ubuntu:~# snort -V

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.15.1 GRE (Build 15125) 
   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
           Copyright (C) 2014-2019 Cisco and/or its affiliates. All rights reserved.
           Copyright (C) 1998-2013 Sourcefire, Inc., et al.
           Using libpcap version 1.10.1 (with TPACKET_V3)
           Using PCRE version: 8.39 2016-06-14
           Using ZLIB version: 1.2.11
curl testmyids.com
tail -f /var/log/snort/snort.alert.fast

测试 Snort 是否正常工作。

Snort 分析 PCAP 文件

为了开始分析,运行 Snort 的系统上必须存在 PCAP 文件。可以在snort的主机上用tcpdump抓包保存为pcap文件后用snort分析。下面的命令分为3个不同窗口执行。

python3 -m http.server 80
tail -f /var/log/snort/snort.alert.fast
tcpdump -i eth0  -w snort-test.pcap

用python监听80端口。

然后随便用一个扫描器扫描。

扫描完成后终止tcpdump抓包。

snort -r snort-test.pcap -c /etc/snort/snort.conf 2>&1 | less

使用snort分析刚才抓包的pcap流量。

告警内容输出到/var/log/snort/snort.alert.fast文件中。

查看Snort告警日志

Snort的日志文件位于:/var/log/snort

snort.alert.fast 包含了简略的告警信息,比如触发的什么规则,以及对应的id。

而Snort.log中就包含了触发告警的原始请求信息。

手动添加Snort规则

上面的测试中都是用的Snort默认自带的规则。我们也可以添加自己的规则,比如http请求中包含snort-test-payload的就告警。

vim /etc/snort/rules/local.rules

添加下面的内容然后重启。

alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"Detected Snort Test Payload in HTTP Request"; flow:to_server,established; content:"snort-test-payload"; http_uri; sid:1000001; rev:1; classtype:web-application-attack; priority:2;)
systemctl restart snort

这条规则的组成部分说明如下:

  • alert tcp: 规则动作和协议,表示对TCP协议生成警告。
  • $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS: 规则的网络地址和端口,表示从任何外部地址到内网HTTP端口的流量。
  • msg:”Detected Snort Test Payload in HTTP Request”: 规则触发时的消息。
  • flow,established: 流量方向和状态,只检测建立了的向服务器的流量。
  • content:”snort-test-payload”: 规则内容,检测HTTP请求URI中含有”snort-test-payload”字符串。
  • http_uri: 指定content检测的位置在HTTP URI中。
  • sid:1000001: 规则的唯一标识符(Signature ID)。
  • rev:1: 规则的修订版本号。
  • classtype: 规则分类。
  • priority:2: 规则的优先级。

自动生成Snort规则

上面的规则自己写会非常麻烦,网上有现成Snort规则生成工具。

https://github.com/chrisjd20/Snorpy

http://www.cyb3rs3c.net/

Snort 禁用指定规则

我是在腾讯云上部署的snort,云主机自身会有ping的动作会导致持续触发snort的规则告警。

误报对我们造成的的干扰非常大,我们可以禁用掉这条规则。

root@VM-24-5-ubuntu:~# grep -irn "ICMP PING NMAP" /etc/snort/rules/
/etc/snort/rules/icmp.rules:32:alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP PING NMAP"; dsize:0; itype:8; reference:arachnids,162; classtype:attempted-recon; sid:469; rev:3;)

找到对应的规则文件位置,手动注释掉。

修改完规则文件后,需要重启Snort服务以使更改生效。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论