关于安全:snort规则提取方法梳理

68次阅读

共计 5875 个字符,预计需要花费 15 分钟才能阅读完成。

一. 概述

suricata 是一款开源的流量检测引擎,反对实时入侵检测 (IDS)、内联入侵预防(IPS)、网络安全监控(NSM) 和离线 pcap 解决,通过编写 suricata 配套的 snort 规定可能对实时的网络流量进行威逼检测,及时发现网络流量中存在的威逼和危险。以下针对施行入侵检测的 snort 规定编写进行办法的梳理。

二. 规定组成及常用字段阐明

一条残缺的 suricata snort 规定次要分为三局部,动作(action)、规定头(header)、规定可选项(options)。如下图所示:

红色局部示意动作,绿色局部示意头,蓝色局部示意规定可选项。

2.1. 动作(action)

当 snort 规定命中流量中的要害数据是,须要执行的操作,次要有告警动作(alert)、抛弃动作(drop)。实时入侵检测以威逼告警为主,规定应用的是 alert 字段。

2.2. 规定头(header)

次要定义匹配的网络流量的协定、IP 地址、端口、流量方向。

2.2.1. 规定头协定

反对的根底协定为:tcp、udp、icmp、ip。更加下层的协定为:

http、ftp、tls (包含 ssl)、smb、dns、dcerpc、ssh、smtp、imap、msn、modbus (默认敞开该协定的反对)、dnp3 (默认敞开该协定的反对)、enip (默认敞开该协定的反对)、nfs (默认敞开该协定的反对)、ikev2 (默认敞开该协定的反对)、krb5 (依赖 rust 语言环境)、ntp (依赖 rust 语言环境)、dhcp (依赖 rust 语言环境)。

2.2.2. IP 地址和方向

IP 地址反对以常量、变量、范畴域、非运算符形式来定义匹配流量,参考:

示例解释
!1.1.1.1 所有的 IP 地址除去 1.1.1.1
![1.1.1.1, 1.1.1.2]所有的 IP 地址除去 1.1.1.1,1.1.1.2
$HOME_NET在 suricata.yaml 配置文件中设置的局域网范畴,IP 地址变量
[$EXTERNAL_NET, !$HOME_NET] 内部网络变量 除去局域网变量
[10.0.0.0/24, !10.0.0.5]所有 10.0.0.0/24(10.0.0.1-10.0.0.255)网段的 ip 除去 10.0.0.5

“->” 示意流量的方向,流量流向箭头指向的方向。

“<>” 示意双向流量都能够进行匹配。

端口与 IP 地址书写配套应用,反对常量,变量,任意端口的匹配,参考:

示例解释
[80, 81, 82]匹配 80,81,82 中的任意端口
[80: 82]匹配从 80 到 82 之间的任意端口
[1024:]匹配 1024 始终到 65535 的最大端口
!80匹配所有端口除去 80
[80:100,!99]匹配 80 到 100 端口,除去 99 端口
[1:80,![2,4]]匹配 1 到 80 端口,除去 2 到 4 端口
$HTTP_PORTS匹配在 suricata.yaml 配置文件中设置 $HTTP_PORTS 对应的端口

2.3. 规定可选项(options)

对于规定可选项局部 (options) 局部有以下常用字段。

2.3.1. sid

snort 规定的编号,确保每条规定编号的唯一性

2.3.2. rev

规定的版本,默认应用 1,如果规定有调整,能够减少 1

2.3.3. reference

规定相干信息,如参考链接等

2.3.4. classtype

规定分类,在 classification.config 中进行配置应用,确保 classification.config 存在对应规定类别,否则规定将无奈失效。

classification.config 内容配置示例:

config classification: web-application-attack,Web Application Attack,1config classification: not-suspicious,Not Suspicious Traffic,3

2.3.5. flow

数据流状态,从服务端到客户端,罕用值如下:

to_client

流量数据从服务端到客户端

to_server

流量数据从客户端到服务端

from_client

流量数据从客户端来 (与 to_server 成果雷同).

from_server

流量数据从服务端来 (与 to_client 成果雷同).

established

匹配曾经建设连贯的流量数据,对于 tcp 协定,为三次握手之后的流量数据,对于 udp 协定,为两端都存在数据传输之后的流量数据.

not_established

匹配未建设连贯的流量数据,该值能够用户检测端口扫描行为,端口扫描存在大量的未凋谢端口,因而都不能失常建设连贯.

stateless

匹配曾经建设为为建设连贯的流量数据,这个应该是用来束缚流数据或者报文数据协定的,个别指 tcp/udp 协定.

2.3.6. target

攻打指标,可抉择值,src_ip|dest_ip,如果被攻击者是源 ip,则 target:src_ip,默认被攻击者是目标 ip

2.3.7. msg

规定信息阐明,能够在规定中丰盛对规定的阐明形容。例如,某 cve 编号对应破绽的检测规定,某个木马家族名称对应的上线包等

2.3.8. content

须要匹配的网络流量。反对 16 进制及明文字符串匹配,应用示例:

content:”a|0D|bc”;

content:”|61 0D 62 63|”;

content:”a|0D|b|63|”;

默认 content 匹配的内容为字符串敏感,

2.3.9. nocase

nocase 与 content 配套应用,申明 content 大小写字符串不敏感,应用示例:

content: “abc”; nocase;

2.3.10. offset

匹配网络流量的偏移地位。偏移地位起始地位为标准协议头之后的数据载荷 payload,应用示例:

content:”def”; offset:3; depth:3;

2.3.11. depth

匹配网络流量的长度,个别与 offset 字段搭配应用,应用示例:

2.3.12. distance

与 content 配套应用,本次匹配内容与上次匹配 payload 内容的间距,同时确保不同的 content 匹配内容存在匹配的程序,distance 失效的 content 为间隔 distance 最近的左侧 content。举例:

content:”abc”; content:”def”;distance:0;

2.3.13. pcre

正则表达式匹配,遵循规范正则表达式的书写办法,此处不做开展。相干链接。https://redmine.openinfosecfo…
示例:

pcre:”/<regex>/opts”;

/ i 示意正则表达式字符串大小写不敏感。

2.3.14. dsize

匹配的通信流量 payload 大小。示例:

dsize:>268; payload 大于 268 字节

dsize:<268;  payload 小于 268 字节

dsize:268;   payload 等于 268 字节

dsize:200<>268;  payload 在 200 字节和 268 字节之间

三. 罕用 snort 威逼检测规定示例剖析

当拿到威逼流量 pcap 包后,要提取 snort 规定,首先须要剖析通信包的具体内容,从中提取固定的能够作为通信特色的标识。以下将选取两种场景进行 pcap 通信包的剖析与特色规定提取。

3.1. 木马通信上线包

3.1.1. wireshark 数据流的跟踪

应用 Wireshark 流量剖析工具关上离线 pcap 包,

如果木马应用 TCP 协定进行通信,个别上线包的会呈现在 TCP 三次握手之后,因而能够对 TCP 三次握手之后的数据包进行查看和剖析,要获取整个木马通信的数据流能够应用 WireShark 的数据流跟踪性能,如下图所示:

应用追踪性能后能够失去和本次上线通信连贯无关的所有数据包数据,如下图所示:

3.1.2. payload 载荷特征分析

应用数据流追踪失去了可读的字符串流数据,红色数据表示 socket 客户端向服务端发送的数据,蓝色数据表示 socket 服务端向客户端的返回数据。通过对字符串流数据的察看,socket 客户端也就是木马程序像服务端上传了操作系统、CPU 性能等计算机配置数据,这个是典型的获取计算机配置并进行上传的木马上线行为。下方反复呈现的信息,疑似木马的向管制端发送的心跳包。能够应用 WireShark 查看每个通信包的大小以及服务端的端口如下图所示:

3.1.3. snort 通信特征提取剖析

alert:将该规定定义为产生告警动作的规定。

tcp:通过抓包剖析,木马通信属于 tcp 协定。

any(ip):客户端为任意 ip。(* 如果重点监测内网木马上线,能够将 any 换成,$HOME_NET,放大匹配范畴、控制精度有利于升高规定的误报,同时要联合 snort 规定的应用场景,如果 snort 规定检测的指标是蜜罐服务,suricata 引擎 (实时入侵检测性能) 部署在蜜罐零碎处,非大流量进口则可适当放宽规定扩充检出范畴,如果位于大流量并且存在大量白流量的流量口,则须要更加准确的管制规定)。

any(port):客户端为任意端口

->:网络数据流向。

any(ip): 服务端为任意 ip。通过剖析失去的服务端 IP 和端口能够作为 C2 IOC 情报,本次剖析的 PCAP 包为生成器生成,C2 端属于演练环境 IP,不做 IOC 提取。

any(port):服务端为任意端口,木马管制端的端口同家族存在一些相似性,在大流量的环境下,能够管制木马管制端端口的精度,采纳准确的木马管制端端口,例如:48080,如果指定某些罕用的高位端口范畴,例如:[40000:60000]

msg:规定相干阐明及附件信息木马家族信息等,通过病毒检测引擎曾经明确产生该通信包的家族为 Dofloo 家族。

content:”|56 45 52 53 4F 4E 45 58 3A 4C 69 6E 75 78|”;  “VERSONEX” 的 16 进制表达方式。

offset:0; 偏移为 0,从载荷 payload 处开始匹配

depth:14; 匹配深度为 14 个字节

content:”|4D 48 7A 7C|”; “MHz|” 的 16 进制表达方式 ”

pcre: “/MHz|[0-9]{1,}MB|[0-9]{1,}MB|Hacker/i”; 正则表白是匹配可变的数字配置,配置单位为固定值放弃不变,Hacker 为固定值放弃不变,大小写不明感

distance:0;  配置相干匹配内容的程序呈现在 VERSIONEX 之后

dsize: < 1025;  载荷 payload 的大小 1025 个字节

sid:10017115; 规定 id

flow:established,to_server; 流量方向为 socket 客户端到服务端,并且匹配曾经建设连贯的流量。

target: src_ip; 因为木马上线包是被管制的受益机器收回的,因而受害者是是源 ip

3.2. 破绽规定 REC 攻打包

3.2.1. wireshark 数据流的跟踪

应用 Wireshark 流量剖析工具关上离线 pcap 包,

因为该破绽为 HTTP 申请,因而可进行 HTTP 的数据流跟踪

点击后失去 HTTP 申请相干数据流数据

3.2.2. payload 载荷特征分析

如果流量数据的破绽是已知破绽,能够通过网上公布的一些破绽剖析和复现文章理解破绽利用的原理,有利于提取破绽利用的要害流量特色。该破绽利用对应的 CVE 编号为 CVE-2015-1427,对应的剖析文章链接:

https://jordan-wright.com/blo…

https://www.secpulse.com/arch…

破绽原理是 es9200 服务对应的 api 脚本查问模块,因为搜索引擎反对应用脚本代码(MVEL),作为表达式进行数据操作,攻击者能够通过 MVEL 结构执行任意 java 代码。具体 Exp 如下:

提取要害因素:

1.es 9200 端口服务

2.http api

3. 脚本查问模块

4. 白名单中的类获取 Class 对象

5.java Runtime exec 执行,exec 执行

通过上述因素提取 snort 特色。

3.2.3. snort 通信特征提取剖析

alert:将该规定定义为产生告警动作的规定。

tcp:通过抓包剖析,木马通信属于 tcp 协定,也能够写成 http 协定,通过 snort 规定编写和应用 suricata 引擎检测,放弃其余条件不变,存在 tcp 协定可能检出,http 不能检出的状况,视具体情况而定。

any(ip):客户端为任意 ip。(* 如果重点监测内网木马上线,能够将 any 换成,$HOME_NET,放大匹配范畴、控制精度有利于升高规定的误报,同时要联合 snort 规定的应用场景,如果 snort 规定检测的指标是蜜罐服务,suricata 引擎 (实时入侵检测性能) 部署在蜜罐零碎处,非大流量进口则可适当放宽规定扩充检出范畴,如果位于大流量并且存在大量白流量的流量口,则须要更加准确的管制规定)。

any(port):客户端为任意端口

->:网络数据流向。

any(ip): 服务端为任意 ip。通过剖析失去的服务端 IP 和端口能够作为 C2 IOC 情报,本次剖析的 PCAP 包为生成器生成,C2 端属于演练环境 IP,不做 IOC 提取。

any(port):9200 es api 默认的端口为 9200。个别编写破绽规定填写默认端口,从以往教训来看,公网的破绽攻打和破绽扫描也只针对默认端口进行破绽扫描。

msg:规定相干阐明及附加信息 CVE 编号破绽形容信息等,通过相干剖析曾经明确该破绽对应的 CVE 编号为 CVE-2015-1427。

content:”POST”;  http 的申请形式为 POST 申请

offset:0;   载荷 payload 为偏移为 0,http 申请的开始几个字节为申请形式。

depth:5;   匹配深度为 5 确保罕用的 web 申请形式可能被匹配到。

content:”/_search”;   匹配查问的 api uri

distance:0; 确保本次匹配的程序为上一次匹配的内容之后

content:”script_fields”;   匹配脚本相干字符串

distance:0; 确保本次匹配的程序为上一次匹配的内容之后

pcre:”/class.forName.java.lang.Runtime..getRuntime().exec/i”;  匹配白名单类中的 forName, . 示意应用符号本来的字符示意,不容许正则表达式本义. 否则. 在正则表白是示意匹配任意单个字符。其余示意援用 java 中的 Runtime 并且执行

sid:130000030; 规定 id

flow:established,to_server; 流量方向为 socket 客户端到服务端,并且匹配曾经建设连贯的流量。

正文完
 0