
网络安全网络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 为 SMB/CIFS 版本 1 协议暴露的事件smb1_transaction_secondary_request展开说明其事件签名、SMB1::Trans_Sec_Args参数结构、与 SMB Transaction 子协议Transaction Subprotocol的关系并结合仓库中对应的 BIF 声明与 binpac 语法解析实现梳理该事件从报文解析到 Zeek 脚本层投递的完整链路。读完本文你将能够在 Zeek 脚本中正确挂接该事件读懂parameters/data载荷的语义并理解它与smb1_transaction_request如何协同还原大事务的完整数据。事件概览签名、命名空间与触发条件smb1_transaction_secondary_request是 Zeek 的 SMB 分析器位于src/analyzer/protocol/smb/在解析 SMB/CIFS 版本 1 的transaction_secondary类型请求时生成的脚本层事件定义在 GLOBAL 命名空间中。其完整签名如下event smb1_transaction_secondary_request(c: connection, hdr: SMB1::Header, args: SMB1::Trans_Sec_Args, parameters: string, data: string)依据官方生成的接口文档Zeek_SMB.smb1_com_transaction_secondary.bif.zeek.rst该事件为 SMBServer Message Block/ CIFSCommon Internet File System版本 1的transaction_secondary类型请求而生成充当Transaction Subprotocol Commands由 transaction 请求承载的附加请求数据容器即用于续传主transaction请求未能一次携带完的参数与数据对应的协议规范参考为 MS-CIFS 2.2.4.34即SMB_COM_TRANSACTION_SECONDARY请求结构。事件声明位于 smb1_com_transaction_secondary.bif其中除了事件本身外还声明了配套的记录类型type SMB1::Trans_Sec_Args: record;作为args参数的承载类型。背景SMB1 Transaction 子协议为什么需要 secondary 请求SMB1 的 Transaction 子协议允许客户端发起一个“事务”如命名管道 I/O、邮件槽广播、RAP 远程管理调用等其语义由请求中的 Setup/Parameters/Data 三部分描述。由于单个 SMB 报文存在长度上限较大的事务数据无法一次装下。MS-CIFS 定义了两种续传机制SMB_COM_TRANSACTION_SECONDARY本事件对应的报文用于在主transaction请求之后继续追加 Parameters 与 Data 片段与之对应的还有SMB_COM_TRANSACTION2_SECONDARYZeek 中以smb1_com_transaction2_secondary事件族呈现见 src/analyzer/protocol/smb 目录下同名.bif与.pac文件面向 Transaction2 子协议。因此smb1_transaction_secondary_request本身不携带事务的“发起信息”如事务名称、子命令号这些信息由先行到达的smb1_transaction_request提供secondary 请求只负责把剩余的参数与数据“接力”送达这也是文档中称其为“additional request data container附加请求数据容器”的原因。事件参数详解该事件的五个参数语义如下依据官方文档与 smb1_com_transaction_secondary.bif 中的注释参数类型含义cconnection产生该请求的连接对象hdrSMB1::Header该 SMB 版本 1 报文的解析后头部argsSMB1::Trans_Sec_Args记录类型携带本次续传的字节计数与位移等结构化信息详见下文parametersstringSMB_Data.Trans_Parameters字段内容即续传的参数块datastringSMB_Data.Trans_Data字段内容即续传的数据块argsSMB1::Trans_Sec_Args 的结构字段Trans_Sec_Args的具体字段由 binpac 解析器在投递事件时逐项填充字段顺序与赋值索引可从 smb1-com-transaction-secondary.pac 的proc_smb1_transaction_secondary_request函数中确认索引字段说明0total_param_count整个事务的参数总字节数跨多个报文累计1total_data_count整个事务的数据总字节数2param_count本报文中参数块的字节数3param_offset本报文参数块相对 SMB 头的偏移4param_displacement本报文参数块在事务总参数序列中的起始位移5data_count本报文中数据块的字节数6data_offset本报文数据块相对 SMB 头的偏移7data_displacement本报文数据块在事务总数据序列中的起始位移从字段可以看出secondary 报文的关键信息是*_displacement位移分析器或脚本可以据此把各续传片段按位移拼接还原完整的事务参数与数据序列。这也是smb1_transaction_secondary_request事件最有价值的字段组。源码级实现从报文到事件投递1. binpac 语法定义报文字段布局smb1-com-transaction-secondary.pac 用 binpac 语法定义了SMB1_transaction_secondary_request记录的完整报文布局type SMB1_transaction_secondary_request(header: SMB_Header) record { word_count : uint8; total_param_count : uint16; total_data_count : uint16; param_count : uint16; param_offset : uint16; param_displacement : uint16; data_count : uint16; data_offset : uint16; data_displacement : uint16; byte_count : uint16; pad1 : padding to param_offset - SMB_Header_length; parameters : bytestring length param_count; pad2 : padding to data_offset - SMB_Header_length; data : SMB1_transaction_data(header, true, data_count, 0, SMB_UNKNOWN, false); } let { proc : bool $context.connection.proc_smb1_transaction_secondary_request(header, this); };布局要点头部是固定的计数/位移字段组total_*为总量param_*/data_*为本次片段的计数、偏移与位移parameters按param_count精确截取data字段复用SMB1_transaction_data联合类型定义于 smb1-com-transaction.pac其case分支会按传输类型如SMB_PIPE、SMB_UNKNOWN等解析出对应的字节内容记录末尾通过let的proc钩子调用连接对象上的处理函数proc_smb1_transaction_secondary_request把解析结果投递为 Zeek 事件。2. C 侧填充 args、构造字符串并投递事件同一文件中的proc_smb1_transaction_secondary_request函数C 代码块完成事件投递前的全部准备工作快速失败检查若脚本层未注册smb1_transaction_secondary_request事件处理器函数直接返回false避免无谓开销构造Trans_Sec_Args记录通过zeek::make_intrusivezeek::RecordVal(zeek::BifType::Record::SMB1::Trans_Sec_Args)创建记录并依次将total_param_count、total_data_count、param_count、param_offset、param_displacement、data_count、data_offset、data_displacement八个字段赋值到索引 0–7构造参数串把parameters字节序列转为zeek::StringVal构造数据串当data_count 0时调用transaction_data_to_val()定义于 smb1-com-transaction.pac按传输类型返回管道数据或未知数据当data_count 0时直接使用空字符串zeek::val_mgr-EmptyString()投递事件调用zeek::BifEvent::enqueue_smb1_transaction_secondary_request(...)把连接、SMB 头、args、parameters、data 一并入队最终由事件调度器回调 Zeek 脚本层。3. 与 transaction 请求的协作子命令信息的来源由于 secondary 报文本身不携带事务名称与子命令号相关上下文来自主请求。仓库中的脚本 smb1-main.zeek 给出了smb1_transaction_request事件的官方处理示例event smb1_transaction_request(c: connection, hdr: SMB1::Header, name: string, sub_cmd: count, parameters: string, data: string) { c$smb_state$current_cmd$sub_command SMB1::trans_sub_commands[sub_cmd]; }也就是说事务的“身份”如name指向的管道/邮件槽名称、sub_cmd对应的子命令在smb1_transaction_request中即可确定而后续到达的多个smb1_transaction_secondary_request事件则持续补充分片数据——脚本层若需要拼装完整事务可依据args$param_displacement/args$data_displacement将多个片段的parameters与data按序归位。Zeek 脚本使用示例在 Zeek 脚本中挂接该事件与挂接其他 SMB1 事件一致例如event smb1_transaction_secondary_request(c: connection, hdr: SMB1::Header, args: SMB1::Trans_Sec_Args, parameters: string, data: string) { if ( args$data_count 0 ) print fmt(%s transaction_secondary data fragment: %d bytes at displacement %d, c$id, args$data_count, args$data_displacement); }实践要点事件仅在transaction_secondary类型请求到达时触发无需额外注册即可生效前提是 SMB 分析器已加载scripts/base/protocols/smb/下的脚本随默认策略加载若要完整还原事务内容应与smb1_transaction_request事件联合使用以connection为纽带聚合多个续传片段data为空串是正常情况data_count 0时解析器显式投递空字符串判断时应以args$data_count为准而非字符串是否为空。相关文件索引以下仓库文件可供进一步深入研究事件接口文档doc/scripts/base/bif/plugins/Zeek_SMB.smb1_com_transaction_secondary.bif.zeek.rstBIF 事件与类型声明src/analyzer/protocol/smb/smb1_com_transaction_secondary.bifbinpac 报文解析与 C 投递实现src/analyzer/protocol/smb/smb1-com-transaction-secondary.pac事务数据联合类型与transaction_data_to_valsrc/analyzer/protocol/smb/smb1-com-transaction.pac脚本层状态维护示例smb1_transaction_request处理器scripts/base/protocols/smb/smb1-main.zeekSMB 分析器目录含 transaction2-secondary 等相关事件族src/analyzer/protocol/smb本文所述协议字段布局与事件语义均可在上述源码与文档中逐项对照验证SMB1::Trans_Sec_Args的字段顺序则从smb1-com-transaction-secondary.pac的赋值代码推断得出可作为编写依赖该记录结构脚本时的依据。赞分享网络安全网络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点击查看免费下载相关推荐用 GetQzonehistory 导出全部 QQ 空间历史说说一次扫码拿到 6 张 Excel 和一个网页相册用 GetQzonehistory 导出全部 QQ 空间历史说说一次扫码拿到 6 张 Excel 和一个网页相册 GetQzonehistory 是一个在本网络安全网络IDSOpen SWE基于 Deep Agents 与 LangGraph 的开源软件工厂实战指南Open SWE基于 Deep Agents 与 LangGraph 的开源软件工厂实战指南 Open SWEOpen Source Software Fa网络安全网络IDSZeek SMB 分析器实战smb1_nt_cancel_request 事件与 SMB1 NT_CANCEL 命令的解析原理Zeek SMB 分析器实战 smb1_nt_cancel_request 事件与 SMB1 NT_CANCEL 命令的解析原理 Zeek 内置的 SMBS网络安全网络IDS上一篇LinkSwift九大网盘直链下载终极解决方案轻松突破下载限制下一篇Operit 计算器限定 API 修复实践Math 与 stats 命名空间在解析器与求值器中的对齐实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考