Connetction Initiation是RDP连接的第一个阶段,具体包含两个消息RDP Negotiation Request和RDP Negotiation Response,下面结合协议数据包详细分析。
(1)RDP Negotiation Request
从数据包可以清晰看到此时的协议栈依次是TCP-TPKT-X.224-RDP。其中TCP协议非常普遍,这里不详细说了。TPKT协议的全称是"Transport Protocol Data Unit",它在RDP中负责对RDP数据进行分割、传输和重组。TPKT协议主要用于在网络中可靠地传输RDP数据。TPKT协议具体定义了如何将RDP数据分割成数据单元(称为数据包)以及如何在网络中传输这些数据包。每个TPKT数据包包含一个特定的头部,用于标识包的开始和结束,并提供错误检测和纠正机制。TPKT头部中包含了数据包长度、版本号和其他必要的控制信息。TPKT示例如下,包含版本和长度。
X.224协议是一种用于远程桌面协议(RDP)中的传输层协议。它提供了在网络中建立和管理RDP会话的功能,是RDP协议栈中的关键组成部分。X.224负责连接的建立和维护、可靠的数据传输、错误检测和纠正、会话管理以及安全性支持等功能。比如,X.224协议可以与其他安全协议结合使用,如SSL(Secure Sockets Layer)或TLS(Transport Layer Security),以提供传输层的数据加密和身份验证机制。通过这些安全协议,X.224可以确保RDP会话的机密性和保密性,示例如下。
下面我们来重点分析RDP_NEG_REQ消息。
RoutingToken/Cookie是可选字段,如果是RoutingToken则是用来作为负载均衡(load balancing),如果是Cookie则具体形式为“Cookie: mstshash=IDENTIFIER”,Token或Cookie只能是二者选一。
Type取值为0x01,表明消息类型为TYPE_RDP_NEG_REQ。
Flags字段包含8位,定义为0x01:RESTRICTED_ADMIN_MODE_REQUIRED (客户端要求为restricted admin mode,如果服务端支持则发送相应空证书),0x02:REDIRECTED_AUTHENTICATION_MODE_REQUIRED (客户端要求为Remote Credential Guard模式,如果服务器支持则基于CredSSP的重定向鉴别),0x08:CORRELATION_INFO_PRESENT(这里指示是否有rdpCorrelationInfo字段)。
Length必须是0x0008,也就是8个字节。
requestedProtocols指示支持的安全协议,长度为4字节。定义为0x00000000:PROTOCOL_RPD(支持标准RDP安全),0x00000001:PROTOCOL_SSL(支持TLS1.0,1.1或1.2),0x00000002:PROTOCOL_HYBRID(支持CredSSP,一般这里设置为1则TLS也设置为1),0x00000004:PROTOCOL_RDSTLS(支持RDSTLS协议),0x00000008:PROTOCOL_HYBRID_EX(一般这里设置为1则PROTOCOL_HYBRID也设置为1),0x00000010:PROTOCOL_RDSAAD(支持RDS AAD Auth安全)。
(2)RDP Negotiation Response
TPKT和X.224层不具体说了,重点分析RDP_NEG_RSP。
Type取值为0x02,表明消息类型为TYPE_RDP_NEG_RSP。
Flags字段也是8位长度,指示的是服务端的协议支持能力。
Length必须是0x0008,也就是8个字节。
selectedProtocol指示协商使用的安全协议类型,这里是CredSSP类型0x0000002。其他定义如下。
取值 | 说明 |
PROTOCOL_RDP 0x00000000 | standared RDP Security |
PROTOCOL_SSL 0x00000001 | TLS1.0 1.1 1.2 |
PROTOCOL_HYBRID 0x00000002 | CredSSP |
PROTOCOL_RDSTLS 0x00000004 | RDSTLS协议 |
PROTOCOL_HYBRID_EX 0x00000008 | Credential Security Support Provider protocol (CredSSP)基于 Early User Authorization Result PDU |
PROTOCOL_RDSAAD 0x00000010 | RDS AAD Auth安全协议 |