一. 概述

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客户端到服务端,并且匹配曾经建设连贯的流量。