10.16. DNS 关键词

Suricata 支持粘性缓冲区以及针对 DNS 消息中特定字段进行高效匹配的关键词。

请注意,粘性缓冲区通常后接一个或多个 有效载荷关键词

10.16.1. dns.opcode

该关键词匹配 DNS 头部标志中的 opcode 字段。

dns.opcode 使用 无符号8位整数

10.16.1.1. 语法

dns.opcode:[!]<数字>
dns.opcode:[!]<数字1>-<数字2>

10.16.1.2. 示例

匹配 opcode 为 4 的 DNS 请求和响应:

dns.opcode:4;

匹配 opcode 不为 0 的 DNS 请求:

dns.opcode:!0;

匹配 opcode 在 7 到 15 之间(不含边界)的 DNS 请求:

dns.opcode:7-15;

匹配 opcode 不在 7 到 15 之间的 DNS 请求:

dns.opcode:!7-15;

10.16.2. dns.rcode

该关键词匹配 DNS 头部标志中的 rcode 字段。

dns.rcode 使用 无符号8位整数。 也可以通过枚举文本指定。

当前 Suricata 仅支持 [0-15] 范围内的 rcode 值,而当前 DNS 版本根据 RFC 6895 支持 [0-23] 的 rcode 值。

我们计划根据 RFC 6895 扩展 Suricata 支持的 rcode 值,相关进展可通过工单跟踪:https://redmine.openinfosecfoundation.org/issues/6650

10.16.2.1. 语法

dns.rcode:[!]<数字>
dns.rcode:[!]<数字1>-<数字2>

10.16.2.2. 示例

匹配 rcode 为 4 的 DNS 请求和响应:

dns.rcode:4;

匹配 rcode 不为 0 的 DNS 请求和响应:

dns.rcode:!0;

10.16.3. dns.rrtype

该关键词匹配 DNS 消息中的 **rrtype**(整数)字段。

dns.rrtype 使用 无符号16位整数

也可以通过枚举文本指定。

10.16.3.1. 语法

dns.rrtype:[!]<数字>

10.16.3.2. 示例

匹配 rrtype 为 4 的 DNS 请求和响应:

dns.rrtype:4;

匹配 rrtype 不为 0 的 DNS 请求和响应:

dns.rrtype:!0;

10.16.4. dns.query

dns.query 是一个粘性缓冲区,用于检查 DNS 请求消息中的查询名称。示例:

alert dns any any -> any any (msg:"测试 dns.query 选项"; dns.query; content:"google"; nocase; sid:1;)

作为粘性缓冲区,应在 dns.query 后使用如 content 等负载关键词:

../_images/dns_query.png

dns.query 关键词会影响后续所有内容匹配,直到使用 pkt_data 或到达规则结尾。

Note

dns.query 等同于旧版 dns_query

Note

dns.query 仅匹配 DNS 请求消息,若要同时匹配 DNS 响应消息,请参阅 dns.queries.rrname

dns.queries.rrname 支持 多缓冲区匹配

10.16.4.1. 标准化缓冲区

缓冲区包含字面域名

  • 原始 DNS 请求中的 <length> 值被转换为字面的 '.' 字符

  • 无前导 <length> 值

  • 无终止 NULL (0x00) 字节(可使用否定相对 isdataat 匹配结尾)

示例 DNS 请求 "mail.google.com"(为便于阅读,十六进制值用竖线分隔):

原始 DNS 查询片段:

|04|mail|06|google|03|com|00|

dns.query 缓冲区:

mail.google.com

10.16.5. dns.queries.rrname

dns.queries.rrname 是一个粘性缓冲区,用于检查 DNS 查询(问题)资源记录中的名称字段。它与 dns.query 几乎相同,但同时支持 DNS 请求和响应。

dns.queries.rrname 会检查请求和响应,因此建议使用 flow 限定特定方向。

匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。

dns.queries.rrname 支持 多缓冲区匹配

dns.queries.rrname 在 Suricata 8.0.0 中引入。

10.16.6. dns.answers.rrname

dns.answers.rrname 是一个粘性缓冲区,用于检查 DNS 应答资源记录中的名称字段。

dns.answers.rrname 会检查请求和响应,因此建议使用 flow 限定特定方向。

匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。

dns.answers.rrname 支持 多缓冲区匹配

dns.answers.rrname 在 Suricata 8.0.0 中引入。

10.16.7. dns.authorities.rrname

dns.authorities.rrname 是一个粘性缓冲区,用于检查 DNS 权威资源记录中的 rrname 字段。

dns.authorities.rrname 会检查请求和响应,因此建议使用 flow 限定特定方向。

匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。

dns.authorities.rrname 支持 多缓冲区匹配

dns.authorities.rrname 在 Suricata 8.0.0 中引入。

10.16.8. dns.additionals.rrname

dns.additionals.rrname 是一个粘性缓冲区,用于检查 DNS 附加资源记录中的 rrname 字段。

dns.additionals.rrname 会检查请求和响应,因此建议使用 flow 限定特定方向。

匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。

dns.additionals.rrname 支持 多缓冲区匹配

dns.additionals.rrname 在 Suricata 8.0.0 中引入。

10.16.9. dns.response.rrname

dns.response.rrname 是一个粘性缓冲区,用于检查所有表示为资源名称(主机名)的 DNS 响应(应答)资源记录的名称和 rdata 字段。它支持检查所有 DNS 响应区段。示例:

alert dns any any -> any any (msg:"测试 dns.response.rrname 选项"; \
    dns.response.rrname; content:"google"; nocase; sid:1;)

rdata 字段匹配支持包含域名结构数据的类型子集,例如:"www.suricata.io"。被检查的类型列表包括:

  • CNAME

  • PTR

  • MX

  • NS

  • SOA(mname 数据:主名称服务器)

匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。

dns.response.rrname 支持 多缓冲区匹配

dns.response.rrname 在 Suricata 8.0.0 中引入。