10.18. SSL/TLS 关键词¶
Suricata 提供了多个规则关键词来匹配 TLS/SSL 握手过程中的各种属性。匹配方式为字符串包含匹配。
10.18.1. tls.cert_subject¶
匹配 TLS/SSL 证书的 Subject 字段。
示例:
tls.cert_subject; content:"CN=*.googleusercontent.com"; isdataat:!1,relative;
tls.cert_subject; content:"google.com"; nocase; pcre:"/google\.com$/";
tls.cert_subject
是一个 'sticky buffer'。
tls.cert_subject
可作为 fast_pattern
使用。
tls.cert_subject
支持多缓冲区匹配,详见 多缓冲区匹配。
10.18.1.1. tls.subject¶
旧版关键词,用于匹配 TLS/SSL 证书的 Subject 字段。
示例:
tls.subject:"CN=*.googleusercontent.com"
区分大小写,不能使用 'nocase' 或其他修饰符。
注意: tls.cert_subject
替代了以下旧版关键词:tls_cert_subject
和 tls.subject
。
建议将规则转换为使用新版关键词。
10.18.2. tls.cert_issuer¶
匹配 TLS/SSL 证书的 Issuer 字段。
示例:
tls.cert_issuer; content:"WoSign"; nocase; isdataat:!1,relative;
tls.cert_issuer; content:"StartCom"; nocase; pcre:"/StartCom$/";
tls.cert_issuer
是一个 'sticky buffer'。
tls.cert_issuer
可作为 fast_pattern
使用。
10.18.2.1. tls.issuerdn¶
旧版关键词,用于匹配 TLS/SSL 证书的 IssuerDN 字段。
示例:
tls.issuerdn:!"CN=Google-Internet-Authority"
区分大小写,不能使用 'nocase' 或其他修饰符。
注意: tls.cert_issuer
替代了以下旧版关键词:tls_cert_issuer
和 tls.issuerdn
。
建议将规则转换为使用新版关键词。
10.18.3. tls.cert_serial¶
匹配证书中的序列号。
示例:
alert tls any any -> any any (msg:"match cert serial"; \
tls.cert_serial; content:"5C:19:B7:B1:32:3B:1C:A1"; sid:200012;)
tls.cert_serial
是一个 'sticky buffer'。
tls.cert_serial
可作为 fast_pattern
使用。
tls.cert_serial
替代了旧版关键词名:tls_cert_serial
。可以继续使用旧名称,但建议将规则转换为使用新名称。
10.18.4. tls.cert_fingerprint¶
匹配证书的 SHA-1 指纹。
示例:
alert tls any any -> any any (msg:"match cert fingerprint"; \
tls.cert_fingerprint; \
content:"4a:a3:66:76:82:cb:6b:23:bb:c3:58:47:23:a4:63:a7:78:a4:a1:18"; \
sid:200023;)
tls.cert_fingerprint
是一个 'sticky buffer'。
tls.cert_fingerprint
可作为 fast_pattern
使用。
tls.cert_fingerprint
替代了旧版关键词名:tls_cert_fingerprint
可以继续使用旧名称,但建议将规则转换为使用新名称。
10.18.5. tls.sni¶
匹配 TLS/SSL 的 Server Name Indication 字段。
示例:
tls.sni; content:"oisf.net"; nocase; isdataat:!1,relative;
tls.sni; content:"oisf.net"; nocase; pcre:"/oisf.net$/";
tls.sni
是一个 'sticky buffer'。
tls.sni
可作为 fast_pattern
使用。
tls.sni
替代了旧版关键词名:tls_sni
。可以继续使用旧名称,但建议将规则转换为使用新名称。
10.18.6. tls.subjectaltname¶
匹配 TLS/SSL 的 Subject Alternative Name 字段。
示例:
tls.subjectaltname; content:"|73 75 72 69 63 61 74 61 2e 69 6f|";
tls.subjectaltname
是一个 'sticky buffer'。
tls.subjectaltname
可作为 fast_pattern
使用。
tls.subjectaltname
支持多缓冲区匹配,详见 多缓冲区匹配。
10.18.7. tls_cert_notbefore¶
匹配证书中的 NotBefore 字段。
示例:
alert tls any any -> any any (msg:"match cert NotBefore"; \
tls_cert_notbefore:1998-05-01<>2008-05-01; sid:200005;)
10.18.8. tls_cert_notafter¶
匹配证书中的 NotAfter 字段。
示例:
alert tls any any -> any any (msg:"match cert NotAfter"; \
tls_cert_notafter:>2015; sid:200006;)
10.18.9. tls_cert_expired¶
如果证书已过期则返回匹配。它会评估证书的有效期。
用法:
tls_cert_expired;
10.18.10. tls_cert_valid¶
如果证书未过期则返回匹配。它仅评估有效期,不 验证证书链。它是 tls_cert_expired
的反义词。
用法:
tls_cert_valid;
10.18.11. tls.certs¶
对 TLS 证书链中的每个证书进行 "原始" 匹配。
示例:
alert tls any any -> any any (msg:"match bytes in TLS cert"; tls.certs; \
content:"|06 09 2a 86|"; sid:200070;)
tls.certs
是一个 'sticky buffer'。
tls.certs
可作为 fast_pattern
使用。
tls.certs
支持多缓冲区匹配,详见 多缓冲区匹配。
10.18.12. tls.version¶
匹配协商的 TLS/SSL 版本。
支持的值: "1.0", "1.1", "1.2", "1.3"
也可以使用十六进制字符串匹配版本。
示例:
tls.version:1.2;
tls.version:0x7f12;
第一个示例匹配 TLSv1.2,而最后一个示例匹配 TLSv1.3 草案 16。
10.18.13. ssl_version¶
匹配 SSL/TLS 记录的版本。
支持的值: "sslv2", "sslv3", "tls1.0", "tls1.1", "tls1.2", "tls1.3"
示例:
alert tls any any -> any any (msg:"match TLSv1.2"; \
ssl_version:tls1.2; sid:200030;)
也可以同时匹配多个版本。
示例:
alert tls any any -> any any (msg:"match SSLv2 and SSLv3"; \
ssl_version:sslv2,sslv3; sid:200031;)
10.18.14. tls.fingerprint¶
匹配 TLS/SSL 证书的 SHA1 指纹。
示例:
tls.fingerprint:!"f3:40:21:48:70:2c:31:bc:b5:aa:22:ad:63:d6:bc:2e:b3:46:e2:5a"
区分大小写,不能使用 'nocase'。
tls.fingerprint 缓冲区为小写,因此必须使用小写字母才能匹配。
10.18.15. tls.store¶
将 TLS/SSL 证书存储到磁盘。 位置可在 yaml 配置文件的 output.tls-store.certs-log-dir 参数中指定,参见 TLS 参数和证书日志(tls.log)。
10.18.16. ssl_state¶
ssl_state
关键词匹配 SSL 连接的状态。可能的状态包括 client_hello
, server_hello
, client_keyx
, server_keyx
和 unknown
。
可以使用 |
(OR) 指定多个状态来检查其中任意一个状态。
10.18.17. tls.random¶
匹配来自 client hello 或 server hello 记录的 TLS random 字段的 32 字节。
示例:
alert tls any any -> any any (msg:"TLS random test"; \
tls.random; content:"|9b ce 7a 5e 57 5d 77 02 07 c2 9d be 24 01 cc f0 5d cd e1 d2 a5 86 9c 4a 3e ee 38 db 55 1a d9 bc|"; sid: 200074;)
tls.random
是一个 sticky buffer。
10.18.18. tls.random_time¶
匹配来自 client hello 或 server hello 记录的 TLS random 字段的前 4 字节。
示例:
alert tls any any -> any any (msg:"TLS random_time test"; \
tls.random_time; content:"|9b ce 7a 5e|"; sid: 200075;)
tls.random_time
是一个 sticky buffer。
10.18.19. tls.random_bytes¶
匹配来自 client hello 或 server hello 记录的 TLS random 字段的后 28 字节。
示例:
alert tls any any -> any any (msg:"TLS random_bytes test"; \
tls.random_bytes; content:"|57 5d 77 02 07 c2 9d be 24 01 cc f0 5d cd e1 d2 a5 86 9c 4a 3e ee 38 db 55 1a d9 bc|"; sid: 200076;)
tls.random_bytes
是一个 sticky buffer。
10.18.20. tls.cert_chain_len¶
匹配 TLS 证书链的长度。
tls.cert_chain_len 使用 无符号 32 位整数。
tls.cert_chain_len 支持 <, >, <>, ! 以及精确值。
示例:
alert tls any any -> any any (msg:"cert chain exact value"; \
tls.cert_chain_len:1; classtype:misc-activity; sid:1; rev:1;)
alert tls any any -> any any (msg:"cert chain less than value"; \
tls.cert_chain_len:<2; classtype:misc-activity; sid:2; rev:1;)
alert tls any any -> any any (msg:"cert chain greater than value"; \
tls.cert_chain_len:>0; classtype:misc-activity; sid:2; rev:1;)
alert tls any any -> any any (msg:"cert chain greater than less than value";\
tls.cert_chain_len:0<>2; classtype:misc-activity; sid:3; rev:1;)
alert tls any any -> any any (msg:"cert chain not value"; \
tls.cert_chain_len:!2; classtype:misc-activity; sid:4; rev:1;)
10.18.21. tls.alpn¶
匹配 ALPN 缓冲区。
示例:
alert tls any any -> any any (msg:"TLS ALPN test"; \
tls.alpn; content:"http/1.1"; sid:1;)
tls.alpn
是一个 sticky buffer。