我现在的工作是写入侵检测规则,suricata 关于 http 协议关键字部分也好好看了,但依然有问题不太懂。
官方手册 v6.0.9 中章节 6.12.20 中指出:
http.request_body
replaces the previous keyword name: http_client_body
. You may continue +to use the previous name, but it’s recommended that rules be converted to use +the new name.
实际上,我测试了一下,似乎不能直接替代:
# 没问题
alert http any any -> any any (msg:"Victure WR1200 系统命令执行漏洞 (CVE-2021-43283)"; flow:to_server,established; content:"password="; http_client_body; nocase; sid:650013; rev:1; gid:879013; priority:4;)
# 单纯只是把上面的 http_client_body 替换成了 http.request_body 报 error:nocase needs preceding content option
# 翻译过来是:nocase 需要前面的内容选项
alert http any any -> any any (msg:"Victure WR1200 系统命令执行漏洞 (CVE-2021-43283)"; flow:to_server,established; content:"password="; http.request_body; nocase; sid:650014; rev:1; gid:879014; priority:4;)
# 如果把 nocase 放到 content 的后面。报 error:rule 650015 setup buffer http_client_body but didn't add matches to it
# 翻译过来是:规则 650015 设置缓冲区 http_client_body 但没有添加匹配项
alert http any any -> any any (msg:"Victure WR1200 系统命令执行漏洞 (CVE-2021-43283)"; flow:to_server,established; content:"password="; nocase; http.request_body; sid:650015; rev:1; gid:879015; priority:4;)
# 如果把 http.request_body 放到 content 的前面,无报错
alert http any any -> any any (msg:"Victure WR1200 系统命令执行漏洞 (CVE-2021-43283)"; flow:to_server,established; http.request_body; content:"password="; nocase; sid:650016; rev:1; gid:879016; priority:4;)
所以,我感觉 http_client_body 是 content modifier ,而 http.request_body 是 sticky buffer 。 不知道我的理解对不对?
1
lambdaq 2023-01-03 17:01:13 +08:00
盲猜一个解码了一个没解码
|
2
daxin945 2023-01-03 17:11:45 +08:00
抛转引玉了
我个人理解 是不同的 suricata 版本支持的 Snort 规则版本不同 本质上都是指的请求体 但是具体的细节没太抠过 在实际写 Snort 的时候 我习惯于用 http_client_body suricata 版本 6.0.4 |
3
hack2xia OP 我也主要用的 http_client_body 。
但有时候可能会有点问题,比如: content:"balabala";http_client_body;pcre:/<regex>/iPR; 由于 R 的存在,它类似于 distance:0 ,pcre 这里要和前面在同一个 sticky buffer 。上面的规则会报错。 http.request_body;content:"balabala";pcre:/<regex>/iPR; 则不会报错。 当然,不写 R 应该是没问题的。 |
4
hack2xia OP |
5
hack2xia OP 上面链接的问题,看到有人回答:
Removed 'http_client_body' because we have 'http.request_body' in Suricata 5.0. Also, if you did want to use 'http_client_body', it would come after the content in which you're hoping to match. 'http.request_body' is a sticky buffer so all content following it are considered to be part of that buffer 从他的意思来看,我的理解应该没问题 |