【suricata】HTTP keywords

http_method
http_method是content的修饰符,表示其所修饰的content只匹配http method部分。http可以使用的方法包括:GET, POST, PUT, HEAD, DELETE, TRACE, OPTIONS, CONNECT和PATCH。
修改规则如下:
alert http any any -> any any (msg:"Http Get Found"; content:"GET"; http_method; classtype:vinc; sid:1000001; rev:1;)
则会对所有的GET方法告警
http_uri和http_raw_uri
http_uri和http_raw_uri这两个关键字都是说明所修饰的content是用来匹配http uri部分的内容。所不同的是http_uri指在匹配之前先对URI进行标准化,所谓的标准化就是对数据包中的uri按照RFC文档规定进行一定的转化,包括保留语义转化、一般保留语义转化、改变语义转化。
将url中的协议、域名等转化为小写,比如HTTP://www.Example.com/ → http://www.example.com/
将以%开头的转义字符中的字母转化为大写,比如http://www.example.com/a%c2%b1b → http://www.example.com/a%C2%B1b
将以%开头但在可见字符范围内的进行转化,比如http://www.example.com/%7Eusername/ → http://www.example.com/~username/
移出默认的端口号,比如http对应的80端口
而http_raw_uri则是直接对uri进行匹配。
修改规则如下:
alert http any any -> any any (msg:"Http Get Found"; content:"123"; http_uri; classtype:vinc; sid:1000001; rev:1;)
uricontent
uricontent的作用和http_uri相同,都是匹配uri部分的,不同的是uricontent可以独立使用,相当于content+http_uri的效果。
alert http any any -> any any (msg:"Http Get Found"; uricontent:"123"; classtype:vinc; sid:1000001; rev:1;)
http_header和http_raw_header
和http_uri一样,http_header也是只匹配http的header部分的内容(不包括cookie,会匹配UA和Content-type等其他),http_raw_header则是匹配没有标准化过的header(参考HTTP header),简单来说就是标准化的header在每个字段的结尾\r\n之前都会去掉其余的空白字符。
http_cookie
http_cookie从http_header中独立出来
http_user_agent
http_user_agent用于匹配http的User-Agent字段的内容
http_client_body和http_server_body
使用了这两个修饰符的content表示只匹配http包中的内容部分,前者值匹配request包,而后者只匹配response。
需要注意的是suricata会根据suricata.yaml配置文件中的libhtp小节对于这两部分长度限制来进行匹配,也就是说如果想要匹配的内容在数据包中的长度超过了配置文件中的数值,则这条规则不会被匹配到。比如说如果要检测Webshell大马,则需要调整
           #    request-body-limit: 4096
           #    request-body-limit: 4096
alert http any any -> any any (msg:"Http Get Found"; content:"123"; http_client_body; classtype:vinc; sid:1000001; rev:1;)
只要POST内容中包含123就会告警
http_stat_code和http_stat_msg
这两个content修饰符分别匹配response应答包返回的状态码和状态信息
file_data
file_data的作用和http_server_body差不多,都是使content匹配response body中的内容,唯一不同的是使用了file_data关键字的规则,其在file_data之后的content都会受到它的影响。比如下面这条规则,值为”abc”和”xyz”的content都必须在response body里面匹配:
alert http any any -> any any (file_data; content:"abc"; content:"xyz";)
urilen
urilen关键字用于匹配http uri部分的长度,可以使用<和>运算符