
网络安全网络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 内置的 XMPP 协议分析器及其唯一公开事件xmpp_starttls展开讲解 Zeek 如何通过 binpac 解析 XMPP 流、识别starttls/proceed握手、在加密接管后触发xmpp_starttls事件并将后续字节流转交给 SSLTLS子分析器继续解密分析的完整链路。读完本文你将掌握xmpp_starttls事件的类型签名与触发时机、事件脚本的编写方式、协议识别DPD的注册机制以及如何通过现有 btest 测试用例验证该功能的实际行为。事件接口总览事件签名与语义xmpp_starttls是 Zeek XMPP 分析器对外暴露的唯一事件其完整定义位于 src/analyzer/protocol/xmpp/events.bif## Generated when a XMPP connection goes encrypted after a successful ## StartTLS exchange between the client and the server. ## ## c: The connection. event xmpp_starttls%(c: connection%);对应地自动生成的脚本接口文档 doc/scripts/base/bif/plugins/Zeek_XMPP.events.bif.zeek.rst 给出了类型化描述属性值NamespaceGLOBAL类型event (c: connection)参数c触发该事件的 XMPP 连接connection触发时机客户端与服务器之间成功完成 StartTLS 交换、连接转为加密后由于该事件位于 GLOBAL 命名空间脚本中可以直接书写event xmpp_starttls(c: connection)而不需要任何模块前缀。典型脚本用法在 Zeek 脚本中监听该事件并做后续处理是标准的 event handler 写法event xmpp_starttls(c: connection) { print fmt(XMPP connection %s switched to TLS, c$uid); # 此处可继续查询 c$ssl、更新 conn 状态或触发自定义分析 }事件携带的c: connection与 Zeek 连接管理体系中其它协议事件如ssl_established一致可直接访问连接的各种元数据与日志字段。StartTLS 识别与事件触发的底层链路基于 binpac 的流式解析XMPP 分析器并没有完整解析 XML 语法而是浅解析到足以识别 StartTLS 交互为止。这一点在 src/analyzer/protocol/xmpp/xmpp.pac 的注释中写得很明确Note that we currently do not even try to parse the protocol completely -- this is only supposed to be able to parse xmpp till StartTLS does (or does not) kick in.binpac 描述文件将 XMPP 数据划分为一个个 XML 标签令牌。协议文法定义在 src/analyzer/protocol/xmpp/xmpp-protocol.pactype XML_START RE//; type XML_END RE//; type XML_NAME RE/\/?[?:[:alnum:]]/; type XML_REST RE/[^]*/; type SPACING RE/[ \r\n]*/; type CONTENT RE/[^]*/; type XMPP_PDU(is_orig: bool) XMPP_TOKEN(is_orig)[] until($input.length() 0); type XMPP_TOKEN(is_orig: bool) record { : SPACING; : XML_START; name: XML_NAME; rest: XML_REST; : XML_END; tagcontent: CONTENT; };流级定义位于同一文件的flow XMPP_Flow而 src/analyzer/protocol/xmpp/xmpp-analyzer.pac 中的refine typeattr XMPP_TOKEN let让每个解析出的令牌都会回调proc_xmpp_token从而把识别 StartTLS与触发事件的决策逻辑注入到解析流程中。状态机client_starttls 与 proceed 的配对xmpp-analyzer.pac是触发逻辑的核心。它维护了一个连接级成员变量client_starttls并在解析每个令牌时执行以下判定协议确认当客户端方向出现stream:stream时调用AnalyzerConfirmation()确认这是 XMPP 流量跳过后续解析一旦看到success、message、db:result、db:verify、presence等标记说明握手已越过 StartTLS 阶段调用SetSkip(true)跳过剩余解析记录 starttls客户端方向出现starttls或去命名空间后的starttls时置client_starttls true触发事件服务器方向出现proceed且client_starttls为真时调用StartTLS()并排队发出xmpp_starttls事件if ( !is_orig ( token proceed || token_no_ns proceed ) client_starttls ) { zeek_analyzer()-StartTLS(); if ( xmpp_starttls ) zeek::BifEvent::enqueue_xmpp_starttls(zeek_analyzer(), zeek_analyzer()-Conn()); } else if ( !is_orig token proceed ) zeek_analyzer()-Weird(XMPP: proceed without starttls);异常检测若服务器在客户端从未发送starttls的情况下直接发送proceed则上报weird告警XMPP: proceed without starttls。注意第 4 步中的if ( xmpp_starttls )判空这是 binpac/Zeek 事件派发的标准保护只有脚本层确实注册了该事件的 handler 时才真正排队投递避免无谓的开销。加密接管StartTLS() 与 SSL 子分析器xmpp_starttls事件触发的同一步骤中C 分析器会调用 src/analyzer/protocol/xmpp/XMPP.cc 中的StartTLS()void XMPP_Analyzer::StartTLS() { // StartTLS was called. This means we saw a client starttls followed // by a server proceed. From here on, everything should be a binary // TLS datastream. tls_active true; Analyzer* ssl analyzer_mgr-InstantiateAnalyzer(SSL, Conn()); if ( ssl ) AddChildAnalyzer(ssl); }其语义包括置tls_active true此后 DeliverStream 不再把数据交给 binpac 的 XMPP 解释器而是调用ForwardStream直接转交给已实例化的 SSL 子分析器通过Analyzer::InstantiateAnalyzer(SSL, ...)动态创建 SSL 分析器并AddChildAnalyzer使后续 TLS 记录能被继续解密分析进而产出 ssl.log、x509.log 等日志。也就是说xmpp_starttls事件与 TLS 接管是同一逻辑的两个侧面事件通知脚本层连接已转加密分析器内部则完成了解析器的交接。分析器类骨架分析器类的声明见 src/analyzer/protocol/xmpp/XMPP.h它继承analyzer::tcp::TCP_ApplicationAnalyzerDeliverStream流数据入口TLS 激活后转交子分析器否则送入interp-NewDatabinpac 解析Undelivered发生 TCP 内容缺口时标记had_gap并调用interp-NewGap缺口存在期间不再尝试解析避免误判EndpointEOF/Done连接结束或流结束时通知 binpac 解释器FlowEOF收尾解析。协议注册与 DPD 动态识别XMPP 分析器以插件形式注册见 src/analyzer/protocol/xmpp/Plugin.ccAddComponent(new zeek::analyzer::Component(XMPP, zeek::analyzer::xmpp::XMPP_Analyzer::Instantiate)); config.name Zeek::XMPP; config.description XMPP analyzer (StartTLS only);插件自述为 XMPP analyzer (StartTLS only)再一次印证其范围限定在 StartTLS 握手识别。端口级静态识别则在脚本侧完成。加载base/protocols/xmpp后scripts/base/protocols/xmpp/main.zeekmodule XMPP; export { ## Well-known ports for XMPP. const ports { 5222/tcp, 5269/tcp } redef; } event zeek_init() priority5 { Analyzer::register_for_ports(Analyzer::ANALYZER_XMPP, ports); }默认端口5222/tcp客户端到服务器C2S与5269/tcp服务器间联邦S2Sports是redef可重定义常量部署时可追加自定义端口通过Analyzer::register_for_ports把 XMPP 分析器绑定到上述端口同时 DPDDynamic Protocol Detection会在内容层面识别stream:stream等特征即便流量出现在非标准端口也能被发现。事件验证与测试基线仓库自带的 btest 测试可直接验证事件链路的完整性。测试脚本 testing/btest/scripts/base/protocols/xmpp/starttls.test# TEST-EXEC: zeek -b -r $TRACES/tls/xmpp-starttls.pcap %INPUT # TEST-EXEC: btest-diff conn.log # TEST-EXEC: btest-diff ssl.log # TEST-EXEC: btest-diff x509.log load base/protocols/conn load base/protocols/ssl load base/protocols/xmpp它用真实抓包$TRACES/tls/xmpp-starttls.pcap回放 XMPP StartTLS 会话并校验 conn.log、ssl.log、x509.log 三份输出。基线数据 testing/btest/Baseline/scripts.base.protocols.xmpp.starttls/conn.log 中该连接在 conn.log 里被标记为proto tcp service xmpp,ssl conn_state SFservicexmpp,ssl正是上述完整链路的可验证证据分析器先确认 XMPP随后在proceed后接管为 SSL/TLS并最终进入SF正常完成状态。ssl.log与x509.log的存在也证明 TLS 记录确实被 SSL 子分析器解析证书被 x509 分析器提取。另外两个测试文件 client-dpd.test 与 server-dialback-dpd.test 则覆盖 DPD 侧的内容识别路径客户端流与服务器拨号回程可配合运行btest观察完整行为。注意事项与使用限制范围限定该分析器不解析完整 XMPP 语义Roster、Message、Presence 等只负责识别连接、捕获 StartTLS 握手并交接给 TLS 分析器。xmpp_starttls事件正是在这一交接瞬间产生是脚本层了解XMPP 连接转加密的主要也是唯一信号。事件可靠性触发依赖client_starttls与proceed的配对服务器未协商即发proceed会被上报为weirdXMPP: proceed without starttls此时不会触发xmpp_starttls。加载要求使用该事件前需load base/protocols/xmpp脚本接口由 src/analyzer/protocol/xmpp/events.bif 在构建期自动生成否则分析器不会随默认策略加载事件也不会触发。版本前提本文所描述的实现、端口常量与事件签名均以当前仓库含Zeek::XMPP插件、xmpp.pac文法与 btest 基线为准不同 Zeek 版本在内部实现上可能存在差异。小结xmpp_starttls虽是一个极简的单参数事件背后却串联了 binpac 文法解析、DPD 动态识别、BIF 事件生成、分析器状态机与 TLS 子分析器动态实例化等多层机制。对于编写 XMPP 相关 Zeek 脚本或扩展分析器的开发者理解这条从starttls/proceed到事件、再到 SSL 子分析器的完整链路是把控 XMPP 加密流量监控的关键一步。赞分享网络安全网络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 DNP3 分析器事件接口全解析从协议对象到脚本事件Zeek DNP3 分析器事件接口全解析从协议对象到脚本事件 本篇技术指南以 Zeek 仓库中 DNP3 协议分析器的官方事件接口文档 Zeek_DNP3.网络安全网络IDSZeek MySQL 协议分析器事件参考从握手、认证到查询结果行的完整事件指南Zeek MySQL 协议分析器事件参考从握手、认证到查询结果行的完整事件指南 本文是 Zeek 网络分析框架内置 MySQL 协议分析器插件 Zeek::网络安全网络IDSZeek HTTP 分析器事件接口全解析从请求、头部到实体与协议升级Zeek HTTP 分析器事件接口全解析从请求、头部到实体与协议升级 Zeek 的 HTTP 分析器Analyzer把 TCP 流上的 HTTP 对话解析网络安全网络IDS上一篇从“骨骼全乱”到“一键导出”在 Blender 里搞定虚幻引擎 PSK 模型与 PSA 动画的避坑实录下一篇魔兽争霸3辅助工具 WarcraftHelper 完整上手指南三步搞定宽屏、地图限制与帧率锁定创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考