Base64 关键词 =============== Suricata 支持对缓冲区中的 base64 编码数据进行解码,并对解码后的数据进行匹配。 这是通过使用两个关键词 ``base64_decode`` 和 ``base64_data`` 实现的。必须同时使用这两个关键词才能生成警报。 base64_decode ------------- 从缓冲区解码 base64 数据,并将其提供给 base64_data 函数使用。 我们建议改用 base64 转换功能 —— 参见 :ref:`from_base64 `。 语法:: base64_decode:bytes <数值>, offset <数值>, relative; ``bytes`` 选项指定 Suricata 应解码并供 base64_data 使用的字节数。 该数值限制为 64KiB。 解码将在缓冲区末尾停止。 ``offset`` 选项指定 Suricata 在解码前应跳过的字节数。 如果未设置 ``relative``,则跳过的字节数是相对于载荷缓冲区的起始位置计算的。 ``relative`` 选项使解码相对于前一个内容匹配的位置开始。默认行为是从缓冲区起始位置开始。 该选项使 ``offset`` 相对于前一个匹配的位置跳过字节。 .. 注意:: 关于 ``relative`` 和 ``base64_decode``: 你希望相对解码的内容匹配必须是流中的第一个匹配项。 .. 注意:: ``base64_decode`` 默认遵循 RFC 4648,即遇到任何不在 base64 字母表中的字符会导致该字符及后续字符串被拒绝。 参见 Redmine Bug 5223: https://redmine.openinfosecfoundation.org/issues/5223 和 RFC 4648: https://www.rfc-editor.org/rfc/rfc4648#section-3.3 base64_data ----------- base64_data 是一个 ``粘性缓冲区``。 允许对之前由 base64_decode 解码的数据进行内容匹配。 示例 ------- 以下是一个规则示例,用于匹配 http_uri 缓冲区中找到的 base64 编码字符串 "test"。 它从已知字符串 "somestring" 的相对位置开始解码,已知偏移量为 1。这必须是缓冲区中第一个出现的 "somestring"。 示例:: 缓冲区内容: http_uri = "GET /en/somestring&dGVzdAo=¬_base64" 规则: alert http any any -> any any (msg:"示例"; http.uri; content:"somestring"; \ base64_decode:bytes 8, offset 1, relative; \ base64_data; content:"test"; sid:10001; rev:1;) 缓冲区内容: http_uri = "GET /en/somestring&dGVzdAo=¬_base64" 规则: alert http any any -> any any (msg:"示例"; content:"somestring"; http_uri; \ base64_decode:bytes 8, offset 1, relative; \ base64_data; content:"test"; sid:10001; rev:1;) .. 注意:: ``base64_data`` 不能与 ``fast_pattern`` 一起使用,否则会导致规则加载错误。