资讯详情

Zeek 基于 DHCP vendor_class 的软件识别与提取:policy/protocols/dhcp/software 脚本深度解析

📅 2026/10/10 5:21:47 | 华诺云谱 👁 阅读
Zeek 基于 DHCP vendor_class 的软件识别与提取:policy/protocols/dhcp/software 脚本深度解析
网络安全网络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 官方策略脚本 scripts/policy/protocols/dhcp/software.zeek 展开讲解如何利用 DHCP 协议中的vendor_class选项Option 60提取客户端与服务器上报的软件标识并接入 base/frameworks/software 软件框架完成软件版本登记与software.log输出。读完本文你将掌握该策略脚本的加载方式、两个新增日志字段与两个软件类型的含义、两个关键事件处理函数的完整执行逻辑以及如何从源码与解析器Pac 描述层面理解这一功能的底层链路并学会自定义扩展。脚本定位与加载方式software.zeek位于策略脚本目录policy/protocols/dhcp/下与 msg-orig.zeek记录同一 DHCP 事务中报文来源地址和 sub-opts.zeek提取 relay agent 的circuit_id、agent_remote_id、subscriber_id并列为该目录下三个可选的 DHCP 增强脚本。它依赖两个基础包base/protocols/dhcp提供 DHCP 协议分析器、DHCP::Info日志记录结构以及DHCP::aggregate_msgs、DHCP::log_dhcp等事件base/frameworks/software提供软件检测与版本解析框架其入口为Software::found函数。运行时加载方式与其它策略脚本一致load policy/protocols/dhcp/software或在命令行直接指定zeek -r traffic.pcap policy/protocols/dhcp/software加载后DHCP 日志dhcp.log会额外出现client_software与server_software两列同时软件框架开始为 DHCP 场景产出software.log。新增日志字段与软件类型该脚本通过两个redef扩展基础脚本中已有的类型文档中称为 Redefinitions。扩展 DHCP::Info 记录redef record DHCP::Info { ## Software reported by the client in the vendor_class option. client_software: string log optional; ## Software reported by the server in the vendor_class option. server_software: string log optional; };client_software客户端在vendor_class选项中上报的软件标识server_software服务器在vendor_class选项中上报的软件标识。两者均声明为log optionallog使它们成为dhcp.log的正式列optional表示仅在实际观察到对应选项时才填充该字段。基础记录DHCP::Info定义于 scripts/base/protocols/dhcp/main.zeek其中已包含ts、uids、client_addr、server_addr、mac、host_name、domain、requested_addr、assigned_addr、lease_time、msg_types等核心列本脚本在保持原结构不变的前提下为其追加两列。扩展 Software::Type 枚举redef enum Software::Type { ## Identifier for web servers in the software framework. DHCP::SERVER, ## Identifier for web browsers in the software framework. DHCP::CLIENT, };DHCP::CLIENT表示 DHCP 客户端侧发现的软件DHCP::SERVER表示 DHCP 服务器侧发现的软件。基础框架 scripts/base/frameworks/software/main.zeek 仅定义了占位类型UNKNOWN并明确说明检测新软件类型的脚本需要redef此枚举以加入自己的类型。DHCP::CLIENT与DHCP::SERVER正是通过这一机制为 DHCP 注册的两个新类型最终会出现在software.log的software_type列中。两个核心事件处理函数脚本的核心逻辑落在两个事件上DHCP::aggregate_msgs与DHCP::log_dhcp。事件一DHCP::aggregate_msgs —— 汇总阶段提取软件标识event DHCP::aggregate_msgs(ts: time, id: conn_id, uid: string, is_orig: bool, msg: DHCP::Msg, options: DHCP::Options) priority5 { if ( options?$vendor_class ) { if ( is_orig ) log_info$client_software options$vendor_class; else { log_info$server_software options$vendor_class; Software::found(id, Software::Info($unparsed_versionoptions$vendor_class, $hostid$resp_h, $software_typeDHCP::SERVER)); } } }DHCP::aggregate_msgs是 DHCP 基础脚本中用于聚合DHCP 会话同一事务 ID 在一段时间内的报文集合的内部事件。基础脚本在 main.zeek 中以priority1000注册了聚合入口负责按msg$xid把报文归并进join_data表并设置全局变量DHCP::log_info随后以priority5的处理器填充duration、uids、msg_types、client_message、server_message、host_name、mac、requested_addr、assigned_addr、domain、lease_time等字段。本脚本以同样的priority5挂接该事件但专注于vendor_class选项DHCP Option 60当options?$vendor_class成立即报文中携带 Option 60时进入处理is_orig T表示该报文属于客户端方向将原始 vendor class 字符串写入log_info$client_softwareis_orig F服务器方向时一方面写入log_info$server_software另一方面调用Software::found将服务器侧的软件上报给软件框架。注意这里服务器方向的Software::found调用$hostid$resp_h将被识别的软件归属到响应方服务器地址$unparsed_version保存未经解析的原始 vendor class 字符串$software_type标记为DHCP::SERVER。事件二DHCP::log_dhcp —— 日志落盘前补全软件上报event DHCP::log_dhcp(rec: DHCP::Info) { if ( rec?$assigned_addr rec?$server_addr (rec?$client_software || rec?$server_software) ) { local id conn_id($orig_hrec$assigned_addr, $orig_prec$client_port, $resp_hrec$server_addr, $resp_prec$server_port, $proto17); # DHCP is typically UDP if ( rec?$client_software rec$assigned_addr ! 255.255.255.255 ) { Software::found(id, Software::Info($unparsed_versionrec$client_software, $hostrec$assigned_addr, $host_pid$orig_p, $software_typeDHCP::CLIENT)); } if ( rec?$server_software ) { Software::found(id, Software::Info($unparsed_versionrec$server_software, $hostrec$server_addr, $host_pid$resp_p, $software_typeDHCP::SERVER)); } } }DHCP::log_dhcp由基础脚本在zeek_init中注册日志流时指定为$ev事件见 main.zeek即每条dhcp.log记录在写入前都会触发本事件。它的作用是补一次软件上报前置条件记录中同时存在assigned_addr与server_addr且至少有一个软件字段被填充说明这是一次完整的地址分配事务手工构造conn_id以被分配地址assigned_addr为源$orig_h服务器地址server_addr为响应方$resp_h端口取client_port/server_port协议固定为$proto17UDP注释明确说明DHCP is typically UDP客户端侧当存在client_software且分配地址不是广播地址255.255.255.255时以$hostrec$assigned_addr、$host_pid$orig_p、$software_typeDHCP::CLIENT上报服务器侧只要存在server_software即以$hostrec$server_addr、$host_pid$resp_p、$software_typeDHCP::SERVER上报。这样同一 DHCP 事务中客户端与服务器的软件标识都会以规范化形式进入软件框架而不仅仅停留在dhcp.log中。软件框架侧的处理链路Software::found是软件框架的唯一入口函数定义于 scripts/base/frameworks/software/main.zeek。它对 DHCP 脚本上报的Software::Info做如下处理资产过滤默认asset_tracking LOCAL_HOSTS若目标主机不匹配跟踪范围且未设置force_log则直接返回F去重缓存found_cache默认10mins过期在 worker 节点上抑制重复上报字段校验Info记录必须携带version或unparsed_version二者之一否则报错返回DHCP 脚本采用后者即直接传递原始 vendor class 字符串集群分发集群模式下通过Cluster::publish_hrw(Cluster::proxy_pool, info$host, Software::new, info)按主机地址哈希路由到代理节点非集群模式直接触发本地Software::new事件注册与去重Software::new事件main.zeek在缺少解析结果时调用parse_with_cache完成name/version解析随后触发Software::registerregister在tracked_software默认1day过期中维护每主机每软件名的版本集合版本无变化且未强制记录时不再重复写日志发现新版本则触发Software::version_change事件。框架内置的parse函数main.zeek具备通用的版本串解析能力并对Mozilla、MSIE、Edge、Safari、Firefox、Chrome、Opera等浏览器形态的字符串做了专门的parse_mozilla分支main.zeek。DHCP 场景的 vendor class 字符串如MSFT 5.0、PXEClient:Arch:00000、dhcpcd-9.4.1等在缺少明确版本号时最终会以name可能是parse errorunparsed_version原始字符串的形式写入software.log原始字符串字段保证了信息的完整保留。底层解析器Option 60 的 Pac 实现vendor_class之所以能出现在DHCP::Options中源于底层 BinPac 分析器对 DHCP 选项的解析。在 src/analyzer/protocol/dhcp/dhcp-options.pac 中可以找到完整定义let VENDOR_CLASS_OPTION 60; # Parse the option refine casetype OptionValue { VENDOR_CLASS_OPTION - vendor_class : bytestring lengthlength; }; refine flow DHCP_Flow { function process_vendor_class_option(v: OptionValue): bool %{ ${context.flow}-options-Assign(18, zeek::make_intrusivezeek::StringVal(${v.vendor_class}.length(), reinterpret_castconst char*(${v.vendor_class}.begin()))); return true; %} }; refine typeattr Option let { proc_vendor_class_option $context.flow.process_vendor_class_option(info.value) if(codeVENDOR_CLASS_OPTION); };关键点Option 60 vendor_classVENDOR_CLASS_OPTION 60对应 DHCP 标准中的 Vendor Class Identifier 选项二进制解析解析器按选项长度lengthlength截取原始字节不依赖字符集假设写入 options 表处理函数把结果以索引18存入options表——18是DHCP::Options中vendor_class字段的内部序号该索引随后在 Zeek 脚本层映射为options$vendor_class字段条件触发仅当选项代码等于 60 时执行解析其它选项走各自的处理分支。这也是本文开头聚合事件中options?$vendor_class判断之所以可行的根源字段的存在性检查?$与底层选项是否出现一一对应。自定义扩展建议若需要在 DHCP 软件识别基础上进一步定制可参考以下模式1. 调整上报主机范围软件框架默认只跟踪本地主机asset_tracking LOCAL_HOSTS可在local.zeek中放宽redef Software::asset_tracking ALL_HOSTS;该选项取值包括LOCAL_HOSTS、REMOTE_HOSTS、ALL_HOSTS、NO_HOSTS定义见 scripts/base/frameworks/software/main.zeek。2. 补充软件别名vendor class 字符串与软件框架识别的名称不一致时可在alternate_names表中添加映射框架默认已含Flash Player Flash示例见 main.zeekredef Software::alternate_names { [MSFT 5.0] Microsoft Windows, };3. 挂接版本变化事件监听Software::version_change即可在发现新版本时执行自定义通知或关联分析。4. 结合其它 DHCP 策略脚本policy/protocols/dhcp/目录下三个脚本互不冲突可同时加载software与sub-optsrelay agent 的circuit_id/agent_remote_id/subscriber_id以获取更完整的 DHCP 视图其中sub-opts对DHCP::aggregate_msgs的处理逻辑在 scripts/policy/protocols/dhcp/sub-opts.zeek 中可见。输出效果与验证加载本脚本后一次典型的 DHCP 地址分配事务会在dhcp.log中呈现新增列列名来源典型内容client_software客户端报文的 Option 60MSFT 5.0、PXEClient:Arch:00000server_software服务器报文的 Option 60如dd-wrt等自定义 vendor class同时在software.log中出现对应的software_type为DHCP::CLIENT或DHCP::SERVER的记录host列分别对应被分配的地址或服务器地址unparsed_version保留原始 vendor class 字符串name/version则由软件框架的解析器尽力解析。该脚本对应的自动化测试可参考同目录策略脚本的验证方式——例如 dhcp-sub-opts.zeek 展示了使用捕获文件运行 Zeek 并 diff 输出日志的标准 btest 模式zeek -b -r $TRACES/dhcp/dhcp_ack_subscriber_id_and_agent_remote_id.pcap %INPUT protocols/dhcp/sub-opts btest-diff dhcp.log对software.zeek可采用同样的方式构造携带 Option 60 的 pcap 进行验证。小结policy/protocols/dhcp/software.zeek是 Zeek 中协议字段 → 软件框架这一设计模式在 DHCP 场景的完整落地底层 Pac 解析器Option 60 →options$vendor_class、基础聚合脚本DHCP::aggregate_msgs、策略扩展新增Info字段与Software::Type枚举以及软件框架Software::found→software.log四层各司其职。理解这条链路既可以准确解读dhcp.log中的client_software/server_software与software.log的对应关系也可以举一反三地为其它协议编写类似的软件识别扩展。赞分享网络安全网络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 DHCP 协议分析常量表深度解读DHCP::message_types 与 DHCP::option_types 的源码、RFC 映射与实战应用Zeek DHCP 协议分析常量表深度解读DHCP::message_types 与 DHCP::option_types 的源码、RFC 映射与实战应用 D网络安全网络IDSZeek Software 软件检测框架版本识别、解析与 software.log 日志机制全解析Zeek Software 软件检测框架版本识别、解析与 software.log 日志机制全解析 本指南围绕 Zeek 内置的软件检测框架 base/fr网络安全网络IDSLinuxKit 与 MirageSDK 的 DHCP 客户端安全设计why-dhcp 文档深度解析LinuxKit 与 MirageSDK 的 DHCP 客户端安全设计why dhcp 文档深度解析 导读 why dhcp.md https://link.操作系统云原生容器运行时上一篇为什么选择ASMREPL探索这款x86-64汇编REPL的7大核心优势下一篇DeepSeek-V3 推理调用从跑通到调参创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑