GoSecure/pyrdp项目中的RDP协议分层解析
引言
在远程桌面协议(RDP)的实现和分析中,理解协议的分层结构至关重要。GoSecure/pyrdp项目采用了一种清晰的分层架构来处理RDP协议数据流,本文将深入解析这一设计理念及其实现细节。
分层架构设计理念
RDP协议栈采用分层设计,数据从网络接收后依次通过各层处理。理想情况下,每一层都负责解析协议数据单元(PDU)的一部分,并逐步剥离无关数据,最终提取出核心内容。
典型的处理流程如下:
TCP -> 中间层1(400字节) -> 中间层2(380字节) -> ... -> 实际数据(250字节)
然而,RDP协议栈中的大多数协议并不如此简单。许多协议包含连接PDU类型,这些PDU不能简单地转发到下一层。特别是MCS协议,它具有复杂的初始化序列,并根据服务器或客户端角色使用不同的消息类型。
观察者模式的应用
为了处理这种复杂性,GoSecure/pyrdp采用了观察者模式:
- 基本机制:每个层可以附加零到多个观察者(Observer)
- 处理流程:当层接收到PDU时,调用
pduReceived
方法通知所有观察者 - 选择性转发:根据PDU类型决定是否转发到下一层
这种设计保持了层类的"解析并转发"的简洁性,同时通过观察者处理特殊PDU。
观察者的实际应用
- 功能实现:剪贴板和文件窃取逻辑都通过观察者实现
- 监控调试:可以附加观察者到每一层,记录或日志所有接收数据
- 灵活扩展:开发者可以轻松添加新的观察者来实现特定功能
RDP协议栈详细分层解析
1. TCP层
作为最底层,TCP层是网络引擎的适配器,主要功能包括:
- 数据转发
- TLS连接初始化
- 基础网络通信功能
2. 分段层(Segmentation)
位于TCP层之上,核心职责是根据PDU类型将数据路由到适当的上层:
- TPKT协议:结构简单,仅包含头部、长度和有效载荷
- 快速路径(Fast-path)协议:更为复杂,包含长度字段和输入/输出数据
两种协议可在同一会话中使用:
- 快速路径用于快速输入/输出传输
- TPKT用于连接序列和特殊PDU
3. TPKT层
专用于将数据流分割为独立消息,功能单一但关键。
4. X224/COTP层
处理初始连接信息,包括:
mstshash
cookie- 连接使用的协议(TLS、CredSSP等)
- 断开连接和错误PDU
只有数据PDU会被转发,其他类型PDU应由观察者处理。
5. MCS层
RDP中最复杂的协议,主要功能包括:
- 管理同一连接上不同用户和通道的通信
- 为每个功能/插件分配独立通道(输入/输出、剪贴板、驱动器映射等)
MCS层设计特殊之处:
- 无法设置单一的下层,因为数据处理取决于消息发送的通道
- 使用MCSRouter(观察者类)处理部分MCS PDU
MCS用户管理
- 用户创建由MCS路由器负责
- 用户必须附加后才能加入通道
- 通道创建使用ChannelFactory的
buildChannel
方法
MCS通道
每个MCS通道都应视为从MCS层分支出的独立层栈。
6. 安全层
处理加密/解密和签名,主要功能包括:
- RDP标准安全机制
- 安全头处理(即使在TLS连接中也用于部分PDU)
7. I/O(数据)层
处理慢速路径RDP数据的最终目的地,也用于连接序列的结束阶段。
8. 虚拟通道层
处理剪贴板、驱动器等虚拟通道,与I/O层路径相似但包结构不同。
9. 快速路径层
特点包括:
- 只包含关键信息
- 默认启用
- 混合了TPKT、安全和数据层的功能
10. GCC/T.124协议
严格来说不是独立层,但在连接阶段使用:
- MCS连接初始PDU的有效载荷是GCC创建会议请求
- 包含重要的RDP连接信息
设计优势与最佳实践
GoSecure/pyrdp的分层设计具有以下优势:
- 关注点分离:每层只处理特定协议功能
- 扩展性:通过观察者模式轻松添加新功能
- 灵活性:支持协议栈的动态调整
- 可维护性:清晰的层次划分便于调试和维护
对于开发者而言,理解这一分层架构是深入分析RDP协议的基础。无论是实现新的功能模块还是进行安全分析,都可以基于这一架构进行扩展。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考