zoukankan      html  css  js  c++  java
  • suricata(一)

    Suricata

    目录

    一、什么是suricata

    Suricata是一个高性能的检测系统(IDS)、预防系统(IPS)和网络安全监控(NSM)的引擎。它是开源的,由一个社区经营的非营利基金会开放信息安全基金会(OISF)拥有。Suricata由OISF开发。

    IDS/IPS

    IDS:检测系统(Intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,根据预设的策略,在发现可疑传输时发出警报

    IPS:预防系统(Intrusion prevention system,简称“IPS”)是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备,一般位于防火墙网络的设备之间,能够即时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。

    IPS相对于IDS主能提供了中断防御功能。

    二、安装

    Ubuntu下:
    sudo add-apt-repository ppa:oisf/suricata-stable
    sudo apt-get update
    sudo apt-get install suricata
    

    三、规则分析

    案例:
    drop tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"ET TROJAN Likely Bot Nick in IRC (USA +..)"; flow:established,to_server; flowbits:isset,is_proto_irc; content:"NICK "; pcre:"/NICK .*USA.*[0-9]{{3,}}/i"; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)
    

    1、action(动作)

    drop为action(动作)
    
     - pass   
     Suricata将停止扫描数据包并跳到所有规则的末尾(仅针对当前数据包)
     
     - drop
     这只涉及IPS/inline模式。如果程序找到匹配的包含drop的签名,它将立即停止。数据包将不再发送。缺点:接收器没有接收到正在发生的事情的消息,从而导致超时(当然是TCP)。Suricata为此数据包生成警报。
     
     
     - reject
     这是对数据包的主动拒绝。接收端和发送端都接收到拒绝数据包。有两种类型的拒绝数据包将被自动选择。如果有问题的数据包与TCP有关,它将是一个重置数据包。对于所有其他协议,它将是一个ICMP错误包。Suricata也会生成警报。当处于inline/ips模式时,违规数据包也将像“drop”操作一样被删除
     
     - alert
     如果签名匹配并包含alert,则该数据包将被视为任何其他非威胁性数据包,但此数据包除外,Suricata将生成警报。只有系统管理员才能注意到此警报。
    

    2、Protocol(协议)

    tcp为Protocol(协议)
    
    TCP(用于TCP通信)
    UDP协议
    ICMP
    ip(ip代表“all”或“any”)
    
    应用层协议:
    http
    ftp
    tls (this includes ssl)
    smb
    dns
    dcerpc
    ssh
    smtp
    imap
    modbus (disabled by default)
    dnp3 (disabled by default)
    enip (disabled by default)
    nfs (depends on rust availability)
    ikev2 (depends on rust availability)
    krb5 (depends on rust availability)
    ntp (depends on rust availability)
    dhcp (depends on rust availability)
    

    3、源/目的地

    $HOME_NET			来源地
    $EXTERNAL_NET		目的地
    
    可选参数:
    ../..					 IP ranges (CIDR notation)
    !						  exception/negation
    [.., ..]				grouping
    
    例子:
    $HOME_NET					yaml配置文件中的 HOME_NET
    [$EXTERNAL_NET, !$HOME_NET]						配置文件中的EXTERNAL_NET 以及非HOME_NET
    ! 1.1.1.1						除了1.1.1.1外的任意IP
    

    4、port(端口)

    any  为port(端口),第一个为源地址的端口,第二个为目标地址的端口
    
    可选参数:
    :				端口系列
    !					除...外
    [.., ..]			组内所有端口
    
    例子:
    [80, 81, 82]			端口 80, 81和 82
    [80: 82]				80到82端口
    [1024: ]			1024以后的端口
    !80						除 80端口外
    [80:100,!99]				80到100中除了99外的端口
    [1:80,![2,4]]				1到80端口中除2到4的其他端口
    

    5、direction(方向)

    ->  为direction(方向)
    只有方向与签名中相同的数据报才能匹配
    
    可选参数:
    source -> destination				源到目标,单向匹配
    source <> destination				双向都匹配
    

    6、其它规则参数

    其他规则参数
    
    规则的其余部分由选项组成。它们用括号括起来,用分号分隔。有些选项具有设置(例如 msg ,由选项的关键字、冒号和设置指定。其他的没有设置,只是关键字(例如 nocase )
    
    <k>:<settings>;				有设置的规则
    <k>;				无设置的规则
    

    注意:

    在suricata中,`;`和`"`都有特殊的含义,所以在规则setting中使用必须转义,使用`\`对其进行转义
    例如:		msg:"hhhhh;"
    

    四、meta关键字

    drop tcp $HOME_NET any -> $EXTERNAL_NET any (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”; flow:established,to_server; flowbits:isset,is_proto_irc; content:”NICK “; pcre:”/NICK .*USA.*[0-9]{3,}/i”; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)
    

    1、msg(message)

    一般,签名的第一部分都大写,并且显示签名的类型。

    一般,msg都放在签名的第一部分

    msg:"ET TROJAN Likely Bot Nick in IRC (USA +..)"; 
    

    2、sid(signature ID)

    sid给每一个签名一个id,一般放在签名的末尾处

    3、rev(revision)

    rev表示签名的版本。如果修改了签名,则签名编写器将增加Rev的数量。sid通常与rev一起使用

    一般而言,sid在rev之前,它们是签名的最后两个

    4、 gid (group ID)

    gid关键字可用于为不同的签名组提供另一个ID值(如在sid中)。Suricata默认使用gid 1。可以修改这个。它将被改变是不常见的,改变它没有技术上的影响。您只能在警报中注意到它。

    下面例子中,[1:2008124:2],其中1表示gid,2008124表示sid,2表示rev

    10/15/09-03:30:10.219671 [**] [1:2008124:2] ET TROJAN Likely Bot Nick in IRC (USA +..) [**] [Classification: A Network Trojan was Detected] [Priority: 3] {TCP} 192.168.1.42:1028 -> 72.184.196.31:6667
    

    5、classtype

    classtype给出规则和警告的类型信息。它由一个短名称、一个长名称和一个优先级组成。对于每个类类型,classification.config都有一个优先级,该优先级将在规则中使用。

    通常classtype在sid和rev之前,在其他关键字之后

    drop tcp $HOME_NET any -> $EXTERNAL_NET any (......; classtype:trojan-activity; sid:2008124; rev:2;)
    

    6、reference

    引用关键字直接指向可以找到有关签名和签名试图解决的问题的信息的位置。引用关键字可以在签名中多次出现。这个关键字是为那些调查签名匹配原因的签名作者和分析人员准备的。格式如下:

    reference:type,reference
    
    e.g.
    reference: url, www.info.com
    reference: cve, CVE-2014-1234
    

    7、priority(优先级)

    priority关键字带有一个强制数字值,该值的范围为1到255数字1到4最常用。优先权更高的签名将首先被检查。最高优先级是1。通常签名已经通过ClassType具有优先级。这可以通过关键字优先级来克服。优先级格式为

    priority:1;
    

    8、metadata

    metadata关键字允许在签名中添加其他非功能性信息。尽管没有格式要求,建议使用key value方式

    metadata:key value;
    metadata:key value, key value;
    

    9、target

    target关键字允许规则编写器指定警报的哪一侧是攻击的目标。如果指定,则会增强警报事件以包含有关源和目标的信息

    target:src_ip;
    

    五、IP关键字

    alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL MISC 0 ttl”; ttl:0; reference:url,support.microsoft.com/default.aspx?scid=kb#-#-EN-US#-#-q138268; reference:url,www.isi.edu/in-notes/rfc1122.txt; classtype:misc-activity; sid:2101321; rev:9;)
    

    1、ttl

    TTL关键字用于检查数据包头中的特定IP生存时间值。生存时间值决定了包在Internet系统中的最大时间量。如果此字段设置为0,则必须销毁数据包。格式为:

    ttl:<number>
    

    2、ipopts

    使用ipopts关键字,您可以检查是否设置了特定的IP选项。ipopts必须在规则的开头使用。每个规则只能匹配一个选项。

    IP Option Description
    rr Record Route
    eol End of List
    nop No Op
    ts Time Stamp
    sec IP Security
    esec IP Extended Security
    lsrr Loose Source Routing
    ssrr Strict Source Routing
    satid Stream Identifier
    any any IP options are set
    ipopts: <IP Option>
    
    e.g.
    alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL MISC source route ssrr”; ipopts:ssrr; reference:arachnids,422; classtype:bad-unknown; sid:2100502; rev:3;)
    

    3、sameip

    每个包都有一个源IP地址和一个目标IP地址,源IP和目标IP可以相同,sameip可以检查源的IP地址是否与目标的IP地址相同

    sameip
    

    4、ipopts

    https://www.osgeo.cn/suricata/rules/header-keywords.html#ip-proto

    使用ip_proto关键字,您可以在包头的ip协议上进行匹配。您可以使用协议的名称或编号。

    5、id

    ID标识由主机发送的每个数据包,并且通常随发送的每个数据包一起递增。

    IP ID用作片段标识号。每个数据包都有一个IP ID,当数据包碎片化时,该数据包的所有碎片都有相同的ID。这样,数据包的接收者就知道哪些碎片属于同一个数据包。

    id:<number>;
    
    alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET DELETED F5 BIG-IP 3DNS TCP Probe 1”; id: 1; dsize: 24;......;)
    

    6、geoip

    https://suricata.readthedocs.io/en/suricata-5.0.2/rules/header-keywords.html#geoip

    geoip关键字使(您)能够匹配网络流量的源、目标或源和目标IPv4地址,并查看它属于哪个国家。

    geoip: src, RU;
    geoip: both, CN, RU;
    geoip: dst, CN, RU, IR;
    geoip: both, US, CA, UK;
    geoip: any, CN, IR;
    

    7、fragbits (IP fragmentation)

    使用fragbits关键字,可以检查IP头中是否设置了碎片和保留位。fragbits关键字应放在规则的开头。fragbits用于修改碎片机制。在将消息从一个Internet模块路由到另一个模块的过程中,可能会出现数据包大于网络可以处理的最大数据包大小的情况。在这种情况下,包可以以片段形式发送。

    M - More Fragments
    D - Do not Fragment
    R - Reserved Bit
    
    e.g.
    alert tcp$external_net any->$home_net any(msg:“et exploit invalid non-fragmented packet with fragment offset>0”; fragbits: M; ......;)
    

    8、fragoffset

    使用fragoffset关键字,可以匹配IP片段偏移字段的特定十进制值。如果要检查会话的第一个片段,则必须将fragoffset 0与more fragment选项组合在一起。碎片偏移场便于重新组装。

    ID用于确定哪些片段属于哪个包,碎片偏移字段澄清片段的顺序。

    9、tos

    TOS关键字可以匹配IP头TOS字段的特定十进制值。TOS关键字的值可以是0-255

    tos:[!]<number>;
    

    六、TCP关键字

    1、seq

    seq关键字可以在签名中用于检查特定的TCP序列号。序列号实际上是由TCP连接的两个端点随机生成的数字。客户机和服务器都创建了一个序列号,序列号随着发送的每个字节的增加而增加。所以两边的序列号是不同的。连接两侧必须确认此序列号。TCP通过序列号处理确认、排序和重传。它的数目随着发送方发送的每个数据字节的增加而增加。seq帮助跟踪字节所属的数据流中的位置。如果syn标志设置为1,那么数据第一个字节的序列号就是这个数字加1

    2、ack

    ACK是对接收到TCP连接另一端发送的所有以前(数据)字节的确认。在大多数情况下,TCP连接的每个包在第一个SYN之后都有一个ACK标志,ACK号随着每个新数据字节的接收而增加。ACK关键字可用于签名中,以检查特定的TCP确认号。

    3、window

    TCP窗口大小是一种控制数据流的机制。该窗口由接收器(接收器公布的窗口大小)设置,并指示可以接收的字节数。在发送方可以发送相同数量的新数据之前,接收方必须先确认此数据的大小。此机制用于防止接收器被数据溢出。

    window:[!]<number>;
    
    alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL DELETED typot trojan traffic”; flow:stateless; flags:S,12; window:55808; reference:mcafee,100406; classtype:trojan-activity; sid:2182; rev:8;)
    

    4、tcp.mss

    匹配tcp mss选项值。如果选项不存在,将不匹配

    tcp.mss:<min>-<max>;
    tcp.mss:[<|>]<number>;
    tcp.mss:<value>;
    
    e.g.
    alert tcp $EXTERNAL_NET any -> $HOME_NET any (flow:stateless; flags:S,12; tcp.mss:<536; sid:1234; rev:5;)
    

    5、tcp.hdr

    在整个TCP头上匹配的粘性缓冲区。

    alert tcp $EXTERNAL_NET any -> $HOME_NET any (flags:S,12; tcp.hdr; content:”|02 04|”; offset:20; byte_test:2,<,536,0,big,relative; sid:1234; rev:5;)
    

    七、UDP关键字

    1、udp.hdr

    在整个UDP头上匹配的粘性缓冲区。

    alert udp any any -> any any (udp.hdr; content:”|00 08|”; offset:4; depth:2; sid:1234; rev:5;)
    

    八、Payload关键字

    1、content

    在引号之间,你可以写上你希望签名匹配的内容。

    content:"......"
    
    alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"Outdated Firefox on
    Windows"; content:"User-Agent|3A| Mozilla/5.0 |28|Windows|3B| ";
    content:"Firefox/3."; distance:0; content:!"Firefox/3.6.13";
    distance:-10; sid:9000000; rev:1;)
    
    如果Firefox的版本不是3.6.13就会生成警告
    

    2、nocase

    不区分大小写,nocase为content的修饰符,不需要跟参数

    content: "abc"; nocase;         修饰前面最近的一个content,不区分大小写
    

    3、depth

    绝对内容修饰符。它在content之后,深度内容修饰符带有一个强制的数字值

    depth:3
    

    如图,深度为3,content就无法匹配到def,只能匹配到abc

    4、startswith

    content的修饰符,不需要跟参数,匹配content 以...开头

    startswith 不能与 depthoffsetwithindistance 混合使用

    content:"GET|20|"; startswith;        匹配内容以`GET|20|`开头
    

    等价于

    content:"GET|20|"; depth:4;offset:0;
    

    5、endswith

    content的修饰符,不需要跟参数,匹配content 以...结尾

    endswith 不能和 offset, withindistance混合使用

    content:".php"; endswith;
    

    等价于

    content:".php";isdatat:!1,relative
    

    6、offset

    offset关键字指定从哪个字节检查有效负载以查找匹配。例如,偏移量:3;检查第四个字节并进一步检查。

    content:"def";offset:3;depth:3;
    

    7、distance

    从上一次匹配之后的任意位置开始n个字节出匹配

    1)第一次匹配abc,下一次匹配起始点为c后任意个数字符

    2)distance起始匹配位置c后任意个数字符,然后匹配def

    3)distance可以为负数,能够用来匹配之前的内容是否匹配

    8、within

    检查第二个content是否在第一个content的n距离范围内

    within和distance联合使用,判断第二个content是否在第一个content+within个字节范围内

    如下图所示

    9、isdataat

    查看负载的特定部分是否仍有数据

    isdataat:512;         # 负载的512字节位置上,时候有数据
    isdataat:8,relative;       # 相对一上一次匹配位置开始的n个字节上是否有数据
    

    10、bsize

    使用bsize关键字,可以匹配缓冲区的长度。这增加了内容匹配的精度,以前这可以用isdataat完成

    bsize:<number>;
    

    11、dsize

    使用dsize关键字,可以匹配数据包负载的大小。

    dsize:<number>;
    
    alert udp $EXTERNAL_NET any -> $HOME_NET 65535 (msg:"GPL DELETED EXPLOIT LANDesk Management Suite Alerting Service buffer overflow";   dsize:>268; reference: bugtraq,23483; reference: cve,2007-1674; classtype: attempted-admin; sid:100000928; rev:1;)
    

    12、byte_test

    https://suricata.readthedocs.io/en/suricata-5.0.2/rules/payload-keywords.html#byte-test

    byte_test:<num of bytes>, [!]<operator>, <test value>, <offset> [,relative][,<endian>][, string, <num type>][, dce][, bitmask <bitmask value>];
    

    13、byte_jump

    https://www.osgeo.cn/suricata/rules/payload-keywords.html#byte-jump

    14、byte_extract

    https://www.osgeo.cn/suricata/rules/payload-keywords.html#byte-extract

    15、rpc

    rpc(远程过程调用)是允许计算机程序在另一台计算机(或地址空间)上执行过程的应用程序。用于进程间通信。

    rpc关键字可用于在sunrpc调用中匹配rpc过程号和rpc版本。用*定义的通配符可以匹配所有版本号和/或过程号。

    rpc:<application number>, [<version number>|*], [<procedure number>|*]>;
    

    16、replace

    17、pcre (Perl Compatible Regular Expressions)

    https://www.osgeo.cn/suricata/rules/payload-keywords.html#suricata-s-modifierss

    关键字pcre匹配特定于正则表达式

    pcre的复杂性带来了很高的价格:它对性能有负面影响。因此,为了减少对pcre的经常检查,pcre主要与“内容”结合使用。在这种情况下,必须先匹配内容,然后才能检查pcre。

    pcre:"/<regex>/opts";
    
    pcre: "/<regex>/i";
    
    i       不区分大小写
    s      检查换行符
    m    可以使一行(有效负载)计为两行
    A     模式必须在缓冲区的开头匹配
    E     忽略缓冲区/负载末尾的换行符
    G    反贪婪
    

    九、Prefiltering关键字

    https://www.osgeo.cn/suricata/rules/prefilter-keywords.html

    1、fast_pattern

    content:"Badness"; distance:0; fast_pattern;
    

    2、prefilter

    alert ip any any -> any any (ttl:123; prefilter; content:"a"; sid:1;)
    

    十、flow关键字

    1、flowbits

    存在属于一个流的多个数据包,suricata会将这些信息保存在内存中。只有当两个数据包匹配时才会生成警报。因此,当第二个包匹配时,Suricata必须知道第一个包是否也是匹配的。如果一个包匹配,那么FlowBits会标记该流,因此当第二个包匹配时,它会生成一个警报。

    flowbits: set, name
    	如果flow中存在,就会设置 条件/名字
    	
    flowbits: isset, name
    	可以在规则中使用,以确保当规则匹配并且在流中设置了条件时,它会生成警报
    	
    flowbits: toggle, name
    	反转当前设置。因此,例如,如果设置了某个条件,它将被取消设置,反之亦然。
    
    flowbits: unset, name
    	可用于取消设置flow中的条件
    
    flowbits: isnotset, name
    	可以在规则中使用,以确保它在匹配且flow中未设置条件时生成警报。
    
    flowbits: noalert
    	此规则不会生成警报
    

    2、flow

    Flow关键字可用于匹配流的方向,例如to/from客户端或to/from服务器。它还可以匹配是否建立了流。流关键字还可以用来表示签名必须只在流上匹配(只在流上匹配)或只在包上匹配(不在流上匹配)。

    to_client
    	在从服务器到客户端的数据包上匹配
    
    to_server
    	在从客户端到服务器的数据包上匹配
    	
    from_client
    	在从客户端到服务器的数据包上匹配(等同于to_server)
    	
    from_server
    	在从服务器到客户端的数据包上匹配 (等同于to_client)
    	
    established
    	匹配已建立的连接
    	
    not_established
    	匹配不属于已建立连接的数据包
    	
    stateless
    	匹配属于或不属于已建立连接的数据包
    	
    only_stream
    	匹配流引擎重新组装的数据包
    	
    no_stream
    	匹配流引擎未重新组装的数据包。与重新组装的数据包不匹配
    	
    only_frag
        匹配从片段中重新组装的数据包
        
    no_frag
    	匹配未从片段重新组合的数据包
    
    e.g.
    flow:to_client, established
    flow:to_server, established, only_stream
    flow:to_server, not_established, no_frag
    

    3、flowint

    4、stream_size

    十一、Bypass关键字

    1、bypass

    在匹配的HTTP流量上绕过流

    e.g.
    alert http any any -> any any (content:"suricata-ids.org"; http_host; bypass; sid:10001; rev:1;)
    

    十二、http关键字

    uri与url

    <img

    1、http_method

    修饰content,表示content只能在HTTP方法缓冲区上匹配

    http_method:GET, POST, PUT, HEAD, DELETE, TRACE, OPTIONS, CONNECT and PATCH

    content:"GET";http_method;
    

    2、http_uri/http_raw_uri

    http_uri    <===>   http.uri
    
    

    http_uri 以及 http_raw_uri 内容修饰符,可以专门匹配,并且只能在请求URI缓冲区上匹配

    URI在Suricata中有两种外观:原始URI和规范化URI。空格用十六进制%20表示这是个规范化的uri

    .png)

    3、uricontent

    效果与http_uri相同,虽然仍然支持,但是不推荐使用。

    content:"/frame.html?";http_uri
    等价于
    uricontent:"/frame.html?"
    

    4、urilen

    urilen用来匹配uri长度

    urilen:number;
    

    5、http.protocol

    http_protocol <====> http.protocol

    protocol从http请求或响应行检查协议字段。如果请求行是“GET/HTTP/1.0rn”,则此缓冲区将包含“HTTP/1.0”。

    alert http any any -> any any (flow:to_server; http.protocol; content:"HTTP/1.0"; sid:1;)
    

    6、http.request_line

    http_request_line强制检查整个HTTP请求行

    alert http any any -> any any (http_request_line; content:"GET / HTTP/1.0"; sid:1;)
    

    7、http.header / http.header.raw

    匹配HTTP header 缓存区所有信息,除了那些有专门文本修饰符的(http.cookiehttp.method等)

    8、http.cookie

    只匹配cookie缓存区,可以和 depth, distance, offset, nocase , within连用

    9、http.user_agent

    http.user_agent修饰符是http请求头的一部分。这使得可以在用户代理头的值上进行特定的匹配。它是标准化的,因为它不包含“User-Agent: ”、“头名称和分隔符”,也不包含尾随的回车和换行符(CRLF)。

    匹配的是user-agent中的value中纯文本内容,不包括key(User-Agent: )、末尾的

    注意:

    • http_user_agent 缓冲区将不包括头名称、冒号或前导空白。即不包括“User-Agent”。
    • http_user_agent 缓冲区结尾不包含CRLF(0x0D 0x0A)。如果要匹配缓冲区的结尾,使用相对 isdataat 或者pcre(尽管pcre的性能会更差)
    • 如果一个请求包含多个“用户代理”头,这些值将在 http_user_agent 缓冲区,按从上到下的顺序排列,每个缓冲区之间有逗号和空格(“,”)。

    请求头:

    GET /test.html HTTP/1.1
    User-Agent: SuriTester/0.8
    User-Agent: GGGG
    

    匹配规则:

    content:"SuriTester/0.8","GGGG";http.user_agent
    
    • 使用http.user_agent比使用http.header效率高约10%

    10、http.accept

    HTTP Accept header匹配的粘性缓冲区。仅包含标题值。头后面的 不是缓冲区的一部分。

    alert http any any -> any any (http.accept; content:"image/gif"; sid:1;)
    

    11、http.accent_enc

    HTTP Accept-Encoding header匹配的粘性缓冲区。仅包含标题值。头后面的 不是缓冲区的一部分。

    alert http any any -> any any (http.accept_enc; content:"gzip"; sid:1;)
    

    12、http.accept_lang

    HTTP Accept-Language header匹配的粘性缓冲区。仅包含标题值。头后面的 不是缓冲区的一部分。

    alert http any any -> any any (http.accept_lang; content:"en-us"; sid:1;)
    

    13、http.connection

    HTTP Connection header匹配的粘性缓冲区。仅包含标题值。头后面的 不是缓冲区的一部分。

    alert http any any -> any any (http.connection; content:"keep-alive"; sid:1;)
    

    14、http.content_type

    HTTP Content-Type header匹配的粘性缓冲区。仅包含标题值。头后面的 不是缓冲区的一部分。

    使用 flow:to_server 或者flow:to_client 区分是reuqest还是response

    alert http any any -> any any (flow:to_server; 
            http.content_type; content:"x-www-form-urlencoded"; sid:1;)
    
    alert http any any -> any any (flow:to_client; 
            http.content_type; content:"text/javascript"; sid:2;)
    

    15、http.content_len

    HTTP Content-Length header匹配的粘性缓冲区。仅包含标题值。头后面的 不是缓冲区的一部分。

    使用 flow:to_server 或者flow:to_client 区分是reuqest还是response

    alert http any any -> any any (flow:to_server; 
            http.content_len; content:"666"; sid:1;)
    
    alert http any any -> any any (flow:to_client; 
            http.content_len; content:"555"; sid:2;)
    

    16、http_referer

    要在HTTP Referer header上匹配的粘性缓冲区。仅包含标题值。头之后的 不是缓冲区的一部分。

    alert http any any -> any any (http.referer; content:".php"; sid:1;)
    

    17、http.start

    检查HTTP请求/响应的的起始。

    alert http any any -> any any (http.start; content:"HTTP/1.1|0d 0a|User-Agent"; sid:1;)
    

    18、http.header_names

    检查只包含HTTP头名称的缓冲区。用于确保头不存在或测试头的特定顺序。

    缓冲区以 开头,以额外的 结尾

    缓冲区:

    \r\nHost\r\n\r\n
    

    规范示例:

    alert http any any -> any any (http_header_names; content:"|0d 0a|Host|0d 0a|"; sid:1;)
    

    示例以确保 only 主机存在

    alert http any any -> any any (http_header_names; 
            content:"|0d 0a|Host|0d 0a 0d 0a|"; sid:1;)
    

    示例以确保 User-Agent 紧跟在Host后面:

    alert http any any -> any any (http_header_names; 
            content:"|0d 0a|Host|0d 0a|User-Agent|0d 0a|"; sid:1;)
    

    示例以确保 User-AgentHost之后 ,但紧跟其后:

    alert http any any -> any any (http_header_names; 
            content:"|0d 0a|Host|0d 0a|"; content:"|0a 0d|User-Agent|0d 0a|"; 
            distance:-2; sid:1;)
    

    19、http.request_body

    http.client_body 内容修饰符,可以专门匹配,并且只能在HTTP request body上匹配。

    20、http.stat_code

    http.stat_code 内容修饰符,可以专门匹配,并且只能在HTTP status code缓冲区上匹配。关键字可以与前面提到的所有内容修饰符(如 distanceoffsetnocasewithin 等。

    21、http.stat_msg

    http.stat_msg 内容修饰符,可以专门匹配,并且只能在HTTP status message缓冲区上匹配。关键字可以与前面提到的所有内容修饰符(如 depthdistanceoffsetnocasewithin .

    22、http.response_line

    http.response_line 检查整个HTTP响应行

    alert http any any -> any any (http_response_line; content:"HTTP/1.0 200 OK"; sid:1;)
    

    23、http.response_body

    http.response_body 内容修饰符,可以在HTTP response body进行特定匹配。关键字可以与前面提到的所有内容修饰符(如 distanceoffsetnocasewithin 等。

    24、http.server

    http.server 内容修饰符,可以在HTTP Server body进行特定匹配。

    alert http any any -> any any (flow:to_client; 
            http.server; content:"Microsoft-IIS/6.0"; sid:1;)
    

    25、http.location

    http.server_body 内容修饰符,可以在HTTP Location headers进行特定匹配。

    alert http any any -> any any (flow:to_client; 
            http.location; content:"http://www.google.com"; sid:1;)
    

    26、http.host and http.host.raw

    使用http.host content修饰符,可以只与规范化的hostname进行特定匹配。http.host.raw检查原始主机名。

    可以与 distance, offset, within,等一起使用,但是不能与nocase一起使用

    注意:

    • 这个 http.hosthttp.raw_host 缓冲区由URI(如果请求中存在完整的URI,如代理请求)或HTTP主机头填充。如果两者都存在,则使用URI。

    • 这个 http.hosthttp.raw_host 如果从主机头填充,缓冲区将不包括头名称、冒号或前导空格。也就是说,它们不包括“主机:”。

    • 这个 http.hosthttp.raw_host 缓冲区结尾不包括CRLF(0x0D 0x0A)。如果要匹配缓冲区的结尾,请使用相对的“isdataat”或PCRE(尽管PCRE的性能会更差)。

    • 这个 http.host 缓冲区被规范化为全部小写。

    • 内容与 http.host 应用于必须全部小写或具有 nocase 标志集。

    • http.raw_host 匹配未规范化的缓冲区,因此匹配将区分大小写(除非 nocase 设置)。

    • 如果一个请求包含多个“主机”头,这些值将在 http.hosthttp.raw_host 缓冲区,按从上到下的顺序排列,每个缓冲区之间有逗号和空格(“,”)。

      请求示例:

      GET /test.html HTTP/1.1
      Host: ABC.com
      Accept: */*
      Host: efg.net
      

      http.host 缓冲区内容:

      abc.com, efg.net
      

      http.raw_host 缓冲区内容:

      ABC.com, efg.net
      
    • 相应的PCRE修改器 (http.host ): W

    • 相应的PCRE修改器 (http.raw_host ): Z

    27、file_data

    file_data ,检查HTTP响应主体,就像 http.server_body 。这个 file_data 关键字的工作方式与普通内容修饰符稍有不同;当在规则中使用时,规则中跟随它的所有内容匹配都会受到它的影响(修改)。

    注意:

    • 如果HTTP主体正在使用gzip或deflate, file_data 将匹配已解压缩的数据。
    • 否定匹配受分块检查的影响。例如,‘content:!”<html”;’无法在第一个块上匹配,但可能在第二个块上匹配。要避免这种情况,请使用深度设置。深度设置会考虑到车身尺寸。假设 response-body-minimal-inspect-size 大于1K,‘content:!”<html”; depth:1024;’只能在第一个检查的块中缺少模式‘<html’时匹配。
    • file_data 也可以与SMTP一起使用
  • 相关阅读:
    SET NOCOUNT ON 作用
    C# WinForm控件之Dock先后顺序调整
    Sql查询按某字段值排序
    sql server 中DateName()函数及DatePart()函数
    js的字符串代码库及讲解
    js实现字符串格式的日期加一天
    1、用datetimepicker插件实现限定时间范围的选择 2、时间插件实现默认当天的时间和只能选择小于今天的日期
    js判断开始时间不能小于结束时间
    vue监听路由的变化,跳转到同一个页面时,Url改变但视图未重新加载问题
    js对json格式对象进行增加,修改,删除
  • 原文地址:https://www.cnblogs.com/linagcheng/p/12559922.html
Copyright © 2011-2022 走看看