ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zeek 文件分析器(File Analyzers)权威指南:Files::Tag 枚举、内置插件与实战配置

Zeek 文件分析器(File Analyzers)权威指南:Files::Tag 枚举、内置插件与实战配置 网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载本文以 Zeek 官方脚本参考文档 doc/reference/zeekscript/autogenerated-file-analyzer-index.rst 为主线系统梳理 Files 框架中全部内置文件分析器File Analyzers的类型标签、事件与函数 API并结合 scripts/base/files/ 下的真实脚本实现给出可复制、可运行的 Zeek 脚本示例。读完本文你将掌握Files::add_analyzer、register_for_mime_type等核心 API 的用法能够为文件启用哈希、熵值、提取、PE 与 X.509/OCSP 分析并理解各分析器底层的工作原理。一、文件分析器与 Files::Tag 枚举总览在 Zeek 中文件分析器File Analyzer是附着在fa_file文件句柄上、对文件内容进行专项处理的分析单元。它与协议分析器不同文件分析器不关心数据如何传输只关心被还原出的完整文件本身如通过 HTTP 下载的二进制、TLS 会话中的证书。Files::Tag是 Zeek 脚本层用来标识文件分析器类型的枚举类型其全部取值如下Files::Tag 枚举值对应分析器用途Files::ANALYZER_DATA_EVENTZeek::FileDataEvent将文件内容以数据事件形式交付给脚本层Files::ANALYZER_ENTROPYZeek::FileEntropy对文件内容做熵测试信息密度Files::ANALYZER_EXTRACTZeek::FileExtract将文件内容提取写入磁盘Files::ANALYZER_MD5Zeek::FileHash计算 MD5 摘要Files::ANALYZER_SHA1Zeek::FileHash计算 SHA1 摘要Files::ANALYZER_SHA224Zeek::FileHash计算 SHA224 摘要Files::ANALYZER_SHA256Zeek::FileHash计算 SHA256 摘要Files::ANALYZER_SHA384Zeek::FileHash计算 SHA384 摘要Files::ANALYZER_SHA512Zeek::FileHash计算 SHA512 摘要Files::ANALYZER_PEZeek::PE解析 Windows PE可移植可执行文件Files::ANALYZER_ZIPZeek::ZIP解析 ZIP 压缩包结构Files::ANALYZER_OCSP_REPLYZeek::X509解析 OCSP 应答Files::ANALYZER_OCSP_REQUESTZeek::X509解析 OCSP 请求Files::ANALYZER_X509Zeek::X509解析 X.509 证书这些枚举值的定义与说明完整保留在 doc/reference/zeekscript/autogenerated-file-analyzer-index.rst 中是本文后续所有内容的索引骨架。二、分析器的挂载方式显式添加与 MIME 自动注册在深入各分析器之前先掌握两种挂载文件分析器的方式。它们定义于 scripts/base/frameworks/files/main.zeek。2.1 显式添加Files::add_analyzer对一个已知文件句柄f直接挂载分析器# 为文件 f 添加 SHA256 哈希分析器 Files::add_analyzer(f, Files::ANALYZER_SHA256); # 添加提取分析器并指定提取文件名与大小上限单位字节 Files::add_analyzer(f, Files::ANALYZER_EXTRACT, Files::AnalyzerArgs($extract_filenamesample.bin, $extract_limit10485760));Files::add_analyzer签名见 scripts/base/frameworks/files/main.zeekglobal add_analyzer: function(f: fa_file, tag: Files::Tag, args: AnalyzerArgs defaultAnalyzerArgs()): bool;返回T表示分析器成功挂载返回F表示该文件当前未处于分析状态例如已经结束或传入的args对该分析器类型无效。对应地Files::remove_analyzer用于移除分析器Files::stop则彻底停止对该文件的后续分析。2.2 MIME 类型自动注册register_for_mime_type更常见的做法是让分析器按文件 MIME 类型自动挂载。核心函数为Files::register_for_mime_type(tag, mt)批量版本是Files::register_for_mime_types其含义是一旦某个文件的 MIME 类型被识别为mt就自动把tag指定的分析器挂到该文件上。MIME 类型匹配不区分大小写。典型的真实用法来自 scripts/base/files/x509/main.zeek# 只要识别出 X.509 证书相关 MIME就自动挂载 X509 与哈希分析器 Files::register_for_mime_type(Files::ANALYZER_X509, application/x-x509-user-cert); Files::register_for_mime_type(Files::ANALYZER_X509, application/x-x509-ca-cert); Files::register_for_mime_type(Files::ANALYZER_X509, application/pkix-cert); Files::register_for_mime_type(Files::ANALYZER_MD5, application/x-x509-user-cert); Files::register_for_mime_type(Files::ANALYZER_SHA1, application/x-x509-user-cert); Files::register_for_mime_type(Files::ANALYZER_SHA256, application/x-x509-user-cert);在这段代码中前三条调用把X509分析器注册到三类证书 MIME 上后三条调用确保对证书始终计算 MD5/SHA1/SHA256 摘要SHA256 是证书事件缓存所必需见下文第四节。三、六大内置分析器逐个解析3.1 Zeek::FileDataEvent —— 数据交付组件Files::ANALYZER_DATA_EVENT该分析器的职责是交付文件内容即把还原出的文件数据以事件形式交给脚本层供自定义逻辑如病毒特征匹配、内容关键字检测消费。它是内置插件Zeek::FileDataEvent的核心。3.2 Zeek::FileEntropy —— 熵测试组件Files::ANALYZER_ENTROPY事件file_entropy(f: fa_file, ent: entropy_test_result)file_entropy在文件分析器对文件完成一次熵测试后触发。参数含义f被测文件ent熵测试结果其中ent$entropy是以每字符比特数表示的信息密度。熵值用于衡量文件内容的随机/压缩程度高熵通常意味着加密、压缩或混淆数据低熵常见于明文文本或未压缩的简单格式。策略脚本 scripts/policy/frameworks/files/entropy-test-all-files.zeek 演示了完整用法——它向Files::Info记录追加entropy字段并在file_new事件中对每个新文件挂载熵分析器redef record Files::Info { entropy: double log optional; }; event file_new(f: fa_file) { Files::add_analyzer(f, Files::ANALYZER_ENTROPY); } event file_entropy(f: fa_file, ent: entropy_test_result) { f$info$entropy ent$entropy; }这样files.log中每个文件都会带上一列entropy值便于后续统计与告警。3.3 Zeek::FileExtract —— 文件提取组件Files::ANALYZER_EXTRACT文件提取是把网络流量中还原出的文件内容写入本地磁盘的过程常用于恶意软件样本收集。相关实现位于 scripts/base/files/extract/main.zeek。事件file_extraction_limit(f: fa_file, args: Files::AnalyzerArgs, limit: count, len: count)当提取分析器即将突破Files::AnalyzerArgs的extract_limit字段所允许的最大文件大小时触发随后分析器会被自动从文件f上移除除非脚本调用FileExtract::set_limit调高限额。参数含义f被提取的文件args标识某个特定提取分析器的参数通常仅用于转交给FileExtract::set_limitlimit即将被突破的限额字节len即将写入的文件块长度字节。函数FileExtract::__set_limit(file_id: string, args: any, n: count): bool这是FileExtract::set_limit的底层实现由脚本层包装函数调用见 scripts/base/files/extract/main.zeekglobal set_limit: function(f: fa_file, args: Files::AnalyzerArgs, n: count): bool; function set_limit(f: fa_file, args: Files::AnalyzerArgs, n: count): bool { return __set_limit(f$id, args, n); }关键配置选项均可在local.zeek中redef覆盖FileExtract::prefix提取文件写入的前缀目录默认./extract_files/。实际路径由build_path_compressed(prefix, extract_filename)拼接生成见 scripts/base/files/extract/main.zeekFileExtract::default_limit默认提取大小上限默认104857600100 MB0表示不限制FileExtract::default_limit_includes_missing缺失字节如因丢包或 Range 下载产生的空洞是否计入限额默认T。设为F时带空洞的文件会以稀疏文件sparse file形式落盘其表观大小可能超过限额。Files::AnalyzerArgs中与提取相关的字段scripts/base/files/extract/main.zeek字段类型默认值说明extract_filenamestring自动生成本地文件名未指定时自动生成为extract-last_active-source-id格式extract_limitcountFileExtract::default_limit允许的最大字节数0表示不限extract_limit_includes_missingboolFileExtract::default_limit_includes_missing缺失字节是否计入限额提取分析器被挂载时on_add回调scripts/base/files/extract/main.zeek会自动在Files::Info中记录extracted本地提取文件名logextracted_cutoff文件是否因达到限额被截断logextracted_size实际写入磁盘的字节数log。file_extraction_limit事件以priority10处理时会把extracted_cutoff置为Tscripts/base/files/extract/main.zeek因此运维人员可以从files.log直接发现被截断的样本。3.4 Zeek::FileHash —— 内容哈希组件Files::ANALYZER_MD5、Files::ANALYZER_SHA1、Files::ANALYZER_SHA224、Files::ANALYZER_SHA256、Files::ANALYZER_SHA384、Files::ANALYZER_SHA512事件file_hash(f: fa_file, kind: string, hash: string)每当文件分析生成一次内容摘要时触发。参数含义f文件kind摘要算法名称字符串如md5、sha1、sha256hash哈希计算结果。基础脚本 scripts/base/files/hash/main.zeek 会把 MD5/SHA1/SHA256 摘要写回Files::Info并记录到日志redef record Files::Info { md5: string log optional; sha1: string log optional; sha256: string log optional; }; event file_hash(f: fa_file, kind: string, hash: string) priority5 { switch ( kind ) { case md5: f$info$md5 hash; break; case sha1: f$info$sha1 hash; break; case sha256: f$info$sha256 hash; break; default: break; } }这解释了为何默认情况下files.log中每个文件都有md5、sha1、sha256三列六个哈希标签共用同一个Zeek::FileHash插件而基础脚本只把最常见的三种写入日志。想要 SHA224/SHA384/SHA512 结果可在自己的脚本中监听file_hash事件并按kind分支处理。3.5 Zeek::PE —— Windows 可执行文件解析组件Files::ANALYZER_PEPE 分析器解析 Windows Portable Executable 文件把 DOS 头、DOS 存根、文件头、可选头、节表等结构逐层解析并触发事件。其日志记录实现位于 scripts/base/files/pe/main.zeek。PE 文件通过 MIME 类型application/x-dosexec自动识别scripts/base/files/pe/main.zeek。pe.log的Info记录包含machine编译目标机器、compile_ts编译时间、os所需操作系统、subsystem、is_exe、is_64bit、uses_aslr、uses_dep、uses_code_integrity、uses_seh、has_import_table、has_export_table、has_cert_table、has_debug_data、section_names等字段scripts/base/files/pe/main.zeek。PE 分析器触发的事件族f均为文件事件参数含义pe_dos_headerh: PE::DOSHeader解析出顶层 DOS 头含文件大小、寄存器初值等信息pe_dos_codecode: string解析出 DOS 存根一段在 DOS 下运行的兼容程序通常用于提示用户无法在 DOS 模式运行pe_file_headerh: PE::FileHeader解析出文件头含目标机器、创建时间戳、节数量及指向文件其他部分的指针pe_optional_headerh: PE::OptionalHeader解析出可选头可执行文件必需、目标文件可选含 OS 需求、原始入口点地址及装载信息pe_section_headerh: PE::SectionHeader解析出节表头含节名称、大小、地址与特征各事件在脚本层的挂载与日志写入对应 scripts/base/files/pe/main.zeek 的source-code引用区域可用于自定义检测例如检查is_64bit与section_names判断可疑加载方式。3.6 Zeek::X509 —— X.509 证书与 OCSP组件Files::ANALYZER_X509、Files::ANALYZER_OCSP_REQUEST、Files::ANALYZER_OCSP_REPLYX509 插件是文件分析器中结构最复杂、功能最丰富的内置插件同时覆盖 X.509 证书解析、OCSP 请求/应答解析与证书链验证。基础脚本位于 scripts/base/files/x509/main.zeekOCSP 日志实现在 scripts/base/files/x509/log-ocsp.zeek。3.6.1 核心记录类型X509::Certificate定义于 scripts/base/init-bare.zeek——证书基础信息大多数字段log记录字段类型说明versioncount版本号serialstring序列号subjectstring主体Subjectissuerstring颁发者Issuercnstring optional最后一个最具体的通用名not_valid_beforetime有效期起始时间not_valid_aftertime有效期截止时间key_algstring密钥算法名称sig_algstring签名算法名称key_typestring optional密钥类型rsa/dsa/ec可由 OpenSSL 解析时key_lengthcount optional密钥长度位exponentstring optionalRSA 证书的指数curvestring optionalEC 证书的曲线tbs_sig_algstringtbsCertificate 内给出的签名算法名应与sig_alg一致X509::Extension——通用扩展scripts/base/init-bare.zeekname扩展长名未知时为 OID、short_name已知时的短名可选、oid、critical是否关键扩展、value已知扩展解析为字符串否则为原始数据。X509::BasicConstraintsscripts/base/init-bare.zeekca是否 CA 标志与path_len最大路径长度可选整条记录log。X509::SubjectAlternativeNamescripts/base/init-bare.zeekdns、uri、email、ip四个向量字段均log optional以及other_fields证书是否包含其他未识别/未解析的名称字段。X509::Resultscripts/base/init-bare.zeek证书链验证结果含resultOpenSSL 结果码、result_string、以及验证成功时按终端证书在前顺序排列的chain_certsvector of opaque of x509可选。3.6.2 证书相关事件x509_certificate(f, cert_ref: opaque of x509, cert: X509::Certificate)遇到 X.509 证书时触发例如 TLS 明文握手。cert_ref是指向底层 OpenSSL 证书结构的 opaque 句柄。x509_extension(f, ext: X509::Extension)证书中出现扩展时触发。x509_ext_basic_constraints(f, ext: X509::BasicConstraints)解析到 basic constraints 扩展时触发可用于识别证书主体是否为 CA。x509_ext_subject_alternative_name(f, ext: X509::SubjectAlternativeName)解析到 SAN 扩展时触发SAN 通常用于绑定一个或多个 DNS 名指明证书对哪些域名有效。x509_ocsp_ext_signed_certificate_timestamp(f, version, logid, timestamp, hash_algorithm, signature_algorithm, signature)遇到 RFC 6962 定义的signed_certificate_timestampSCT扩展时触发该扩展用于传输证书透明度Certificate Transparency的签名证明可在 X.509 证书或 OCSP 应答中出现。其中version恒为 0v1、logid为 32 位密钥 ID、timestamp为自 epoch 起忽略闰秒的 NTP 毫秒时间戳。基础脚本对以上事件的优先级为priority5scripts/base/files/x509/main.zeek逐一把扩展填入f$info$x509$extensions、san、basic_constraints与extensions_cache并在文件结束file_state_remove时按去重索引写入x509.log。3.6.3 OCSP 事件族OCSP在线证书状态协议RFC 6960相关事件共六个覆盖请求与应答的完整生命周期事件触发时机关键参数ocsp_request(f, version)每个 OCSP 请求恰好触发一次如 HTTP 连接中version通常为 0v1ocsp_request_certificate(f, hashAlgorithm, issuerNameHash, issuerKeyHash, serialNumber)OCSP 请求针对的每一张证书触发一次单个请求可含多张证书颁发者名称哈希、颁发者公钥哈希、证书序列号ocsp_response_status(f, status)每个 OCSP 应答恰好触发一次status如 successful/malformedRequest/tryLaterocsp_response_bytes(f, status, version, responderId, producedAt, signatureAlgorithm, certs)遇到含响应信息的 OCSP 应答时触发certs为随应答发送的验证用证书列表x509_opaque_vectorocsp_response_certificate(f, hashAlgorithm, issuerNameHash, issuerKeyHash, serialNumber, certStatus, revokeTime, revokeReason, thisUpdate, nextUpdate)OCSP 应答中每个 SingleResponse 触发一次吊销时间/原因未吊销时revokeTime为 0、revokeReason为空串ocsp_extension(f, ext: X509::Extension, global_resp: bool)应答中出现 OCSP 扩展时触发global_resp为T表示扩展位于全局 ResponseDataF表示位于 SingleResponse其中ocsp_response_certificate的日志落地实现在 scripts/base/files/x509/log-ocsp.zeek输出到ocsp.log可用于监测证书吊销状态的变化。3.6.4 X.509 实用函数 APIX509 插件还提供一组可在脚本中直接调用的函数定义于 scripts/base/bif/plugins/Zeek_X509.functions.bif.zeek函数签名要点用途x509_parse(cert: opaque of x509) : X509::Certificate把证书 opaque 句柄解析为X509::Certificatex509_from_der(der: string) : opaque of x509从 DER 字符串构造 opaque 证书句柄主要用于测试x509_get_certificate_string(cert, pem: bool defaultF) : string返回证书字符串pemT返回 PEM 形式否则返回原始 ASN.1 二进制x509_ocsp_verify(certs: x509_opaque_vector, ocsp_reply: string, root_certs: table_string_of_string, verify_time: time default0.0) : X509::Result校验 OCSP 应答certs中服务器证书在前x509_verify(certs: x509_opaque_vector, root_certs: table_string_of_string, verify_time: time default0.0) : X509::Result校验证书链宿主证书必须在索引 0成功后返回完整证书链sct_verify(cert, logid, log_key, signature, timestamp, hash_algorithm, issuer_key_hash: string default) : bool验证证书透明度 SCTRFC 6962SCT 出现在 X.509 扩展中时须提供issuer_key_hashx509_subject_name_hash/x509_issuer_name_hash/x509_spki_hash(cert, hash_alg: count) : string分别计算主体 DN、颁发者 DN、Subject Public Key Info 的哈希hash_alg按 IANA TLS 参数映射取值x509_check_hostname(hostname: string, certname: string) : bool按 RFC 6125 通配规则检查主机名与证书名是否匹配x509_check_cert_hostname(cert_opaque: opaque of x509, hostname: string) : string检查主机名是否匹配证书中的任一名称存在 SAN 时仅校验 SAN 并忽略 Subject CNRFC 2818无 SAN 时使用 Subject 中最后一个 CN。匹配返回匹配名可能含通配符不匹配返回空串x509_set_certificate_cache(tbl: string_any_table) : bool建立证书缓存遇到证书时若tbl[sha256 of certificate]已设置则跳过后续处理仅调用回调x509_set_certificate_cache_hit_callback(f: string_any_file_hook) : bool设置命中缓存时调用的回调函数注意基础脚本已用x509_set_certificate_cache建立证书缓存见 scripts/base/files/x509/certificate-event-cache.zeek只有确定不会与基础脚本冲突时才应修改缓存表或回调函数。3.6.5 X509 分析器的行为配置来自 scripts/base/files/x509/main.zeek 的常用选项X509::hash_function证书指纹哈希函数默认sha256_hash改动会影响ssl.log与x509.log中的指纹X509::log_x509_in_files_log是否把 X.509 证书条目也写入files.log默认FX509::relog_known_certificates_after证书去重后重新记录的最大时间间隔默认1day设为0secs完全关闭去重。注意整机重启会重置去重状态X509::known_log_certs_maximum_sizeknown_log_certs集合上限默认1000000X509::known_log_certs_enable_publish/known_log_certs_enable_node_up_publish是否把已记录证书哈希发布到集群其他节点、以及新 worker 上线时是否由 manager 下发全量集合默认均T。对应实现是X509::log_cert_hashes_internal事件与Cluster::node_up处理scripts/base/files/x509/main.zeekX509::default_max_field_string_bytes/default_max_field_container_elements/default_max_total_container_elements日志中单字符串字段、单容器字段、记录总容器元素的上限分别默认继承Log::全局默认值、500、1500用于防止超大证书撑爆日志。四、端到端实战给某个文件同时挂多个分析器下面把以上知识整合为一个可直接运行的 Zeek 脚本演示file_new中批量挂载、事件中处理结果# my-file-analyzers.zeek load base/frameworks/files load base/files/hash load base/files/extract load base/files/x509 load base/files/pe module MyFileAnalysis; export { redef record Files::Info { sha512: string log optional; }; } event file_new(f: fa_file) { # 显式挂载SHA512 哈希 熵测试 Files::add_analyzer(f, Files::ANALYZER_SHA512); Files::add_analyzer(f, Files::ANALYZER_ENTROPY); # 提取限定 50 MB文件名自动生成 Files::add_analyzer(f, Files::ANALYZER_EXTRACT, Files::AnalyzerArgs($extract_limit52428800)); } event file_hash(f: fa_file, kind: string, hash: string) { if ( kind sha512 ) f$info$sha512 hash; } event file_extraction_limit(f: fa_file, args: Files::AnalyzerArgs, limit: count, len: count) { # 达到限额时把上限翻倍继续提取 if ( FileExtract::set_limit(f, args, limit * 2) ) print fmt(extended extraction limit for %s, f$id); }运行时使用zeek -C -r trace.pcap my-file-analyzers.zeek即可观察files.log中出现sha512列、pe.log、x509.log按 MIME 自动记录以及./extract_files/目录下的提取产物。若不想每次手动加载可把上述逻辑放进local.zeek或包package中。五、验证与进一步探索以上所有结论均可在当前仓库中直接核实分析器枚举与全部事件/函数参考doc/reference/zeekscript/autogenerated-file-analyzer-index.rst即本文主文档由 doc/reference/zeekscript/file-analyzers.rst 引入Files 框架核心 APIscripts/base/frameworks/files/main.zeek提取FileExtract::prefix/default_limit及file_extraction_limit处理见 scripts/base/files/extract/main.zeek哈希file_hash落日志见 scripts/base/files/hash/main.zeek熵策略级全文件熵测试见 scripts/policy/frameworks/files/entropy-test-all-files.zeekPEpe.log字段与事件挂载见 scripts/base/files/pe/main.zeekX.509证书去重、MIME 注册、日志策略见 scripts/base/files/x509/main.zeekOCSP 日志见 scripts/base/files/x509/log-ocsp.zeek证书缓存见 scripts/base/files/x509/certificate-event-cache.zeekZIP 分析器脚本scripts/base/files/zip/main.zeek。如需深入事件触发时序与数据流可结合 doc/frameworks/file-analysis.rst 中关于 Files 框架的整体介绍阅读。赞分享网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载相关推荐gopls 内置 Analyzers 全解析静态分析器套件的配置、来源与实战指南gopls 内置 Analyzers 全解析静态分析器套件的配置、来源与实战指南 本文以 Go 官方工具链仓库 x/tools 中的 gopls/doc/an开发工具静态分析代码质量IDE代码生成Telegraf enum 处理器插件字段与标签枚举值映射配置与源码实战指南Telegraf enum 处理器插件字段与标签枚举值映射配置与源码实战指南 本指南围绕 Telegraf 内置的 enum 处理器插件展开讲解如何将指标字可观测性指标监控运维初学者必看distiluse-base-multilingual-cased多语言句子嵌入模型常见问题与解决方案指南初学者必看distiluse base multilingual cased多语言句子嵌入模型常见问题与解决方案指南 distiluse base multi上一篇如何实现 Developer Portfolio 企业级部署AWS、DigitalOcean 和 CI/CD 流水线终极指南下一篇javalang社区贡献指南参与开源Java解析器开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表