资讯动态

Zeek RFB(VNC)协议分析完全指南:从 DPD 检测到 rfb.log 会话审计

发布时间:2026/10/9 1:41:53 来源:尧图企业网站定制
网络安全网络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点击查看免费下载本指南以 doc/scripts/base/protocols/rfb/index.rst 为骨架深入剖析 Zeek 内置的 Remote FrameBufferRFB即 VNC 系列协议分析能力。RFB 包覆盖所有 VNC 服务器TigerVNC、TightVNC、RealVNC、Apple Remote Desktop 等读者读完本文后将掌握如何通过load base/protocols/rfb开启 RFB 分析、如何解读 rfb.log 中 16 个日志字段、RFB 握手各阶段版本协商、安全类型选择、认证、初始化的事件钩子以及底层 binpac 解析器与 C 分析器的实现原理。1. 包结构总览一行加载全链路生效Zeek 的 RFB 分析由脚本层与 C 层协同完成。脚本层位于scripts/base/protocols/rfb/共 4 个文件职责清晰文件作用load.zeek包加载入口引入 main 与 DPD 签名main.zeek日志流定义、事件处理与状态机dpd.sigDPD 动态协议检测签名识别 RFB 流量README一句话包说明加载方式极简在站点脚本如 scripts/site/local.zeek中加入load base/protocols/rfb__load__.zeek会依次执行load ./main load-sigs ./dpd.sig其中load-sigs激活 DPD 签名使得未被静态分配到 5900 端口VNC 默认端口的 RFB 会话也能被动态识别。2. DPD 动态检测双向 RFB 横幅签名dpd.sig 用两条相互绑定的签名完成协议识别signature dpd_rfb_server { ip-proto tcp payload /^RFB/ tcp-state responder requires-reverse-signature dpd_rfb_client enable rfb } signature dpd_rfb_client { ip-proto tcp payload /^RFB/ tcp-state originator }要点解读双向验证只有 TCP 客户端方向先发出以RFB开头的横幅、且服务端方向随后也匹配RFB前缀时签名dpd_rfb_server才会被触发并enable rfb从而激活 RFB 分析器。requires-reverse-signature防止了对非 VNC 流量如恰好以 RFB 开头的其他数据的误判。方向约束tcp-state originator/responder确保横幅出现在正确的连接发起方向。rfb标签该标签正是 C 分析器注册的标识见下文 Plugin.ccDPD 命中后据此挂载分析器。3. rfb.log16 个字段的会话审计记录加载包后Zeek 会创建名为rfb的日志流。日志结构由RFB::Inforecord 定义于 main.zeektype Info: record { ts: time log; # 事件时间戳 uid: string log; # 连接唯一 ID id: conn_id log; # 连接四元组地址/端口 client_major_version: string log optional; # 客户端主版本 client_minor_version: string log optional; # 客户端次版本 server_major_version: string log optional; # 服务端主版本 server_minor_version: string log optional; # 服务端次版本 authentication_method: string log optional; # 认证方法标识 auth: bool log optional; # 认证是否成功 share_flag: bool log optional; # 独占/共享会话标志 desktop_name: string log optional; # 共享屏幕名称 width: count log optional; # 屏幕宽度 height: count log optional; # 屏幕高度 done: bool defaultF; # 内部标记是否已写日志 };字段说明前三个字段ts、uid、id为 Zeek 日志通用头部标识连接本身版本字段4 个来自握手第一阶段的双向版本横幅authentication_method是可读化的认证方法名称而非原始数字映射见第 4 节auth记录安全类型协商后认证的成功与否share_flag、desktop_name、width、height来自 ServerInit 消息描述共享会话的桌面done为内部状态防止同一连接被重复写日志。日志流在zeek_init中以优先级 5 注册main.zeekLog::create_stream(RFB::LOG, Log::Stream($columnsInfo, $evlog_rfb, $pathrfb, $policylog_policy));即日志路径为rfb写入事件为log_rfb并支持log_policy策略钩子对记录做二次加工。3.1 真实日志样本BTest 基线来自 vnc-scanner 测试基线 的典型 VNC 扫描流量记录#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p client_major_version client_minor_version server_major_version server_minor_version authentication_method auth share_flag desktop_name width height XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 192.168.0.11 46381 10.0.0.149 5900 003 008 003 008 VNC F - - - -解读客户端 192.168.0.11 连接 10.0.0.149:5900双方协议版本均为 3.8服务端选择了 VNC 认证但最终认证失败authF因握手未进入 ServerInit 阶段桌面信息为空。Apple Remote Desktop 基线 则展示了完整会话XXXXXXXXXX.XXXXXX C4J4Th3PJpwUYZZ6gc 192.168.2.115 52353 192.168.2.16 5900 003 889 003 889 Apple Remote Desktop T T MacMini SSD 1920 1080可见认证方法被翻译为Apple Remote Desktop认证成功、共享标志为真桌面名为MacMini SSD分辨率为 1920×1080 —— 一条记录即可还原整个 VNC 会话的握手画像。4. 认证方法编号 → 可读名称映射friendly_auth_name()main.zeek将 RFB 安全类型编号映射为人类可读名称编号方法名说明0Invalid无效1None无认证2VNC经典 DES 挑战应答16TightTightVNC 扩展17UltraUltraVNC18TLSTLS 封装19VeNCryptTLS 协商变体20GTK-VNC SASLGTK-VNC 的 SASL21MD5 hash authenticationMD5 哈希认证22Colin Dean xvpxvp 扩展30Apple Remote DesktopmacOS 远程桌面其他RealVNC默认兜底RealVNC 系该函数由事件rfb_authentication_type触发把原始count值转为字符串写入authentication_method字段这也是日志中直接看到VNC、Apple Remote Desktop等名称的原因。5. 握手事件钩子从横幅到认证结果events.bif 定义了 7 个 BIF 事件构成完整握手生命周期main.zeek 中每个事件都以priority5捕获并回填日志状态事件参数触发时机rfb_client_versionc, major_version, minor_version客户端发送版本横幅RFB 003.008等rfb_server_versionc, major_version, minor_version服务端回应版本横幅rfb_authentication_typec, authtype: count服务端选择安全类型3.7rfb_authentication_resultc, result: bool认证结果消息rfb_share_flagc, flag: bool客户端发送 ClientInit 共享标志rfb_server_parametersc, name, width, height服务端发送 ServerInit 桌面参数log_rfbrec: Info日志写出事件状态回填机制示例event rfb_server_parameters(c: connection, name: string, width: count, height: count) priority5 { set_session(c); c$rfb$desktop_name name; c$rfb$width width; c$rfb$height height; } event rfb_server_parameters(c: connection, name: string, width: count, height: count) priority-5 { write_log(c); # 低优先级收尾参数齐备后立即落盘 }同一事件的两个处理器利用优先级差5先填字段-5后写日志。set_session()main.zeek负责首次遇到 RFB 事件时为连接挂载Info记录并注册finalize_rfb移除钩子write_log()通过done标志保证每个连接只写一次日志。若连接在握手完成前中断finalize_rfb钩子main.zeek会在连接移除时把已收集的部分信息补写进日志——这就是基线上那些半条记录认证方法缺失的来源。5.1 脚本层自定义示例由于日志流已就绪策略脚本可直接订阅事件做告警例如检测到认证失败即上报 Noticeevent rfb_authentication_result(c: connection, result: bool) { if ( ! result c?$rfb c$rfb?$authentication_method ) NOTICE([$noteVNC::Failed_Authentication, $connc, $msgfmt(VNC authentication failed for %s, c$rfb$authentication_method)]); }注实际使用时需在policy/protocols/vnc或站点脚本中定义相应NOTICE调用。6. C 分析器与 binpac 解析器底层实现原理6.1 分析器类RFB.h 中的RFB_Analyzer继承自TCP_ApplicationAnalyzer构造时创建 binpac 解释器binpac::RFB::RFB_ConnDeliverStream()将重组后的 TCP 流喂给解释器捕获binpac::Exception并触发AnalyzerViolation同时置invalid标志停止后续解析RFB.cc一旦interp-saw_handshake()成立服务端方向的像素数据便不再解析——注释明确说明握手后的帧缓冲更新大部分是无趣的像素数据且解析器未完整实现Undelivered()记录内容缺口had_gap遇到缺口即放弃该连接的状态机推进避免基于残缺流的误判。6.2 binpac 协议描述解析器由三份 .pac 文件构成rfb.pac总纲、rfb-protocol.pac消息定义、rfb-analyzer.pac代码生成。协议采用双方向状态机enum ServerState { SERVER_VERSION, SERVER_AUTH_TYPE, SERVER_AUTH_VNC_CHALLENGE, SERVER_AUTH_RESULT, SERVER_INIT, SERVER_MESSAGE_TYPE, ... } enum ClientState { CLIENT_VERSION, CLIENT_AUTH_SELECTION, CLIENT_INIT, CLIENT_MESSAGE_TYPE, ... }每个方向的 PDU 按当前状态分发RFB_PDU_request/RFB_PDU_response字节序固定为大端byteorder bigendian。关键消息结构包括RFBProtocolVersion固定 12 字节的RFB xxx.yyy横幅主/次版本各 3 字节字符串RFBSecurityType/RFBSecurityTypes373.7 之前单安全类型、3.7 安全类型列表RFBVNCAuthenticationRequest16 字节挑战码RFBVNCAuthenticationResponse16 字节响应RFBSecurityARDChallengeApple Remote Desktop 的 DH 挑战generator、key_length、prime_mod、publickeyRFBClientInit1 字节共享标志RFBServerInit宽高 16 字节像素格式 桌面名各类客户端消息ClientSetPixelFormat、ClientSetEncodings、ClientFramebufferUpdateRequest、ClientKeyEvent、ClientPointerEvent、ClientCutText服务端消息ServerFramebufferUpdate含PixelData按编码分派raw/copyrect/RRE/hextile/TRLE/ZRLE、ServerSetColorMapEntries、ServerBell、ServerCutText。安全方面MAX_DATA_LENGTH 65536用于限制可变长字段如剪贴板文本、失败原因字符串配合enforce(len MAX_DATA_LENGTH)防止恶意超长字段引发过度缓冲——这是一个值得关注的健壮性设计。7. 测试验证BTest 基线与真实流量回放RFB 分析在 testing/btest/scripts/base/protocols/rfb/ 下有完整回放测试全部采用回放 pcap 比对 rfb.log模式例如# TEST-EXEC: zeek -b -C -r $TRACES/rfb/vnc-scanner.pcap %INPUT # TEST-EXEC: btest-diff rfb.log load base/protocols/rfb三个测试用例覆盖三类典型场景测试流量验证点vnc-scannerVNC 扫描器流量认证失败的短握手日志版本 3.8、VNC 认证、authFvnc-mac-to-linuxmacOS 客户端连 Linux 服务端常规跨平台 VNC 会话rfb-apple-remote-desktopApple Remote Desktop 流量3.889 版本、ARD 认证、完整桌面参数与多连接记录基线 rfb.log 既锁定了字段顺序与输出格式也作为回归测试的断言依据保证解析器改动不会破坏既有行为。本地复现方式安装 Zeek 后在仓库根目录运行btest -d testing/btest/scripts/base/protocols/rfb/需先完成构建并配置 btest 环境。8. 适用边界与已知限制从源码注释与实现可确认以下边界均为当前仓库实际状态非外部断言握手后服务器数据不解析DeliverStream()中interp-saw_handshake() ! orig即返回服务端帧缓冲更新、像素数据等握手之后的内容基本不进入解析器RFB.cc对应的PD_Hextile、PD_TRLE等编码在 rfb-protocol.pac 中标记为# TODO空实现。伪编码Pseudo-encoding未支持PD_PseudoCursor、PD_PseudoDesktopSize因 binpac 对负值处理问题被注释掉同一文件 L226-L228。ARD 挑战结构待验证RFBSecurityARDChallenge的注释说明未找到完整规范准确性存疑L91-L99。日志统计范围rfb.log 只覆盖握手阶段元数据版本、认证、桌面不含会话时长、传输字节数等流量统计。9. 小结一条命令获得 VNC 握手全景回到起点RFB 包文档用一句话定义了它的存在意义——Support for Remote FrameBuffer analysis. This includes all VNC servers.支持远程帧缓冲分析涵盖所有 VNC 服务器。落实到实操只需在local.zeek中加入load base/protocols/rfbZeek 便会通过 DPD 双向签名在任意端口动态识别 RFB 流量以 binpac 状态机解析版本协商、安全类型、认证与初始化阶段将结果沉淀为 rfb.log 的 16 字段结构化记录并通过 7 个事件开放给策略层做二次分析。对于监控 VNC 扫描、审计内部远程桌面访问、追踪认证失败尝试等场景这一内置分析器提供了零成本、可验证的开箱能力而 main.zeek、rfb-protocol.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点击查看免费下载相关推荐Zeek 协议分析入门深入 base/protocols/rfb 包RFB/VNC 分析器的加载机制与 rfb.logZeek 协议分析入门深入 base/protocols/rfb 包RFB/VNC 分析器的加载机制与 rfb.log 本篇技术指南围绕 Zeek 仓库中网络安全网络IDSZeek 动态协议检测DPD与 analyzer.log 完全解读从协议违规日志到可疑流量识别Zeek 动态协议检测DPD与 analyzer.log 完全解读从协议违规日志到可疑流量识别 Zeek 的 analyzer.log 是动态协议检测D网络安全网络IDSZeek 动态协议检测DPD违规处理机制解析从协议违规到服务移除与 conn.log 记录Zeek 动态协议检测DPD违规处理机制解析从协议违规到服务移除与 conn.log 记录 导读 本文聚焦 Zeek 网络分析框架中动态协议检测Dyna网络安全网络IDS上一篇如何实现Windows远程桌面多用户连接RDPWrap配置文件完整指南下一篇type-challenges 00005「Get Readonly Keys」攻略オブジェクトの readonly キーを Union 型で抽出する创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑