RDP協議,remote desktop protocol,遠端桌面協議
一 前言
二 概述
三 同絡層次
四 各連線模組說明
五 各功能模組說明
六 rdpwin結構、資料流說明
七 總結
一、前言
RDP, Remote Desktop Protocol,遠端桌面協議,是一個多通道(multi-channel)的協議,讓使用者(客戶端或稱“本地電腦”)連上提供微軟終端機服務的電腦(伺服器端或稱“遠端電腦”)。大部分的Windows、Linux、FreeBSD、Mac OS X都有相應的客戶端。服務端聽取送到 TCP 3389 埠的資料。該協議是對國際電信聯盟釋出的一個國際標準的多通道會議協議T.120 的一個擴充套件。
windows從NT開始提供終端服務,它是微軟買來的網路協議技術(Citrix),伺服器端要安裝、配置,客戶端要連線程式。終端服務使任何一臺有許可權的終端機,用已知的賬號登入伺服器,可以使用賬號內的資源,包括軟體,硬體資源;同時,在協議升級後,客戶端連線後可以使用本地的資源,包括本地印表機、聲音本地回放,本地磁碟資源和本地硬體介面。所有的計算都在伺服器端進行,客戶端只需要處理網路連線、接收資料、介面顯示和裝置資料輸出。
二、概述
1 版本功能說明:
RDP協議在終端服務推出後已有四個版本,4.0、5.0、5.1、5.2。一般來說,版本是根據windows的版本確定的。
從客戶端的角度來說,5.X版本間提供的功能差別不是很大,相對於4.0版本,它提供了使用者帶密碼直接登入、客戶端驅動器資源對映、客戶端音訊回放、最高24位色顯示和符合FIPS加密級別連線。
另外,從4.0協議開始變提供的客戶羰功能有:高、中、低三種資料加密級別,客戶端自定義初始登入環境,客戶端印表機對映,客戶端LPT埠對映,客戶端com埠對映,剪貼簿對映,客戶登入的個性化設定(包括鍵盤、顯示介面大小等)。
7.0版:這是最新的版本,必須要有Windows Server 2008 R2 或 Windows 7。
2、協議層次說明:
通過破解研究,我們掌握了RDP協議的基本層次結構。基本上,RDP協議的每一層次上都標示出其層內的資料長度值。對於層次劃分,主要是指RDP協議網路功能資料傳送時通常都包含的各層次,而對於各層次內所實現的單層次連線等功能將做為單獨的模組來進行闡述。
網路連線層:RDP協議建立在TCP/IP協議之上,由於傳輸的資料量比較大,因此在協議的底層首先定義一層網路連線層。它定義了一個完整的RDP資料邏輯包,以避免由於網路包長度過長而被分割使資料丟失。
ISO資料層:
虛擬通道層:在ISO資料層之上,RDP協議定義一個虛擬通道層,用以拆分標示不同虛擬通道的資料,加快客戶端處理速度,節省佔用網路介面的時間。
加密解密層:在虛擬通道層之上,RDP定義一個數據加密解密層。此層用於對所有的功能資料進行加密、解密處理。
功能資料層:在加密解密層之上是功能資料,畫面資訊,本地資源轉換,聲音資料,列印資料等所有的功能資料資訊都在此層進行處理。另外,根據資料型別的不同,這些資料都有各自不同層次的分割,他們的內部層次結構將在各個功能模組中進行闡述。
3 其它說明:
本協議解析中所提到的各層次結構都是指RDP功能資料正常傳送時的各底層結構,在功能資料傳送前的各層次的建立連線過程及其結構、實現都歸於模組實現來進行說明。對於伺服器端的各種設定以及個版本間的內部實現差異請看RDP幫助文件,以及rdpwin開發文件。
4 連線過程說明:
1) 客戶端連線伺服器
2) ISO資料層建立連線
3) 傳送初始協議相關資訊,接收加密、解密金鑰
4) 虛擬通道申請
5) 加密形式傳送客戶端系統資訊,同時驗證加密協議
6) 平臺軟體證書驗證
7) 各功能建立連線,各功能資料傳輸,功能實現
三、網路層次:
1 網路連線層:
在RDP協議網路實現連線中,本層的資料格式是固定的。
內容 | 協議版本號 | 保留 | 此邏輯包長度 |
位元組數 | 1 | 1 | 2 |
值 | 當前版本皆是3 | 0 | 邏輯長度,從版本號開始到本包結束 |
2 ISO資料層:
在RDP功能資料網路傳輸中,本層的資料格式是固定的。
內容 | 單層資料長度 | ISO包型別 | 標誌 |
位元組數 | 1 | 1 | 1 |
值 | 2,從下位元組開始計算 | 0xf0,表示資料 | 0x80 |
3 虛擬通道層:
虛擬通道層用於在正常的網路連線資料之上,中個虛擬通道的功能資料。此層次的連線另見初始連線模組與通道申請模組,在此只說明正常資料連線時的層次結構。
1) 結構資訊:
內容 | 型別 | 虛擬通道個數 | 虛擬通道號 | 標誌 |
位元組數 | 1 | 2 | 2 | 1 |
值 | 0x64/0x68 | 0x0001 | 0x03eb至0x03ee | 0x70/0xf0 |
2) 型別說明:
0x64:客戶端傳送資料
0x68:客戶端接收資料
3) 使用者號說明:
本次連線的使用者號,伺服器傳送的是0x0001;客戶端所傳送的值是初始連線時請示通道後伺服器同意開通的虛擬個數。
4) 虛擬通道號說明:
虛擬通道號是本層次以上所傳送的功能資料所在的虛擬通道號,其由初始連線通道申請建立時確定。
5) 標誌說明:
客戶端傳送的標誌為0x70;伺服器端傳送的標誌,當功能資料是影象是(由通道號識別),其值為0x70,當功能資料是其它資料時,其值為0xf0。
4 加密解密層:
加密解密層用於對網路連線中所傳送、接收的資料進行加密、解密。為保證資料和系統的安全性,對網路資料進行加密傳輸是比較常用且必然的,RDP協議在此層對實際的功能資料進行加密。
1) 結構資訊:
內容 | 單層及層上資料總長度 | 加密標誌 | 未知標誌 | 數字簽名 |
位元組數 | 1-2 | 2 | 2 | 8 |
值 | 從下位元組開始計算 | 0x0800 | 0x1000/0x0203 | 順序取得 |
5 功能資料層:
功能資料是客戶端與伺服器進行互動的真正資料。他們都有各自固定格式,連線、控制方式,具體情況見各功能模組的說明。
根據當前我們所掌握的資訊,RDP協議將影象資訊、聲音資訊、裝置資訊、剪貼簿內容都各自以單一的虛擬通道進行傳送,而印表機對映,磁碟對映,埠對映都做為裝置資訊的內容進行處理。限於當前左上角工作和專案工作的限度,裝置資訊中只考慮了印表機對映的部分,對於印表機資訊與其他的裝置相關的資訊沒有進行有效隔離區分,而本協議說明中相關的連線資訊、資料傳送都只認為是印表機對映的內容。
四、各連線模組說明:
1 ISO連線模組:
在客戶端與伺服器的網路套介面建立之後,需要首先建立RDP協議底層連線,得到連線確認後才能正常通訊。具體實現如下:
1) 連線過程說明:
初始連線時,在網路套介面TCP連線建立之後中,客戶端首先進行連線請求,當收到連線確認後表示網路連線層連線建立,隨後開始傳送RDP資料。
2) 連線請求通訊資料:
內容 | 層內資料長度 | RDP包型別 | 未知1 | 未知2 | 標誌 | 其它 |
位元組數 | 1 | 1 | 2 | 2 | 1 | 不定 |
值 | 從下一位元組開始計算 | 0xd0或0xe0 | 0x0000 | 另見 | 0x00 | 另見 |
3) RDP包型別說明:
0xe0:客戶端連線請求
0xd0:伺服器確認連線
4) 未知資料2說明:
0x0000:客戶端請求連線的值
0x1234:伺服器確認請求的值
5) 其它資料說明:
win2003客戶端在請求時附帶了如下字元—“Cookie: mstshash=Administrator0x0d0x0e”,目前不知其意。其中Administrator為自動登入名,當其長度超過12位元組時,只保留前12位元組,其它字元都固定不變。
2 協議資訊初始模組:
當基本的RDP連線建立後,需要進行客戶端與伺服器的系統環境、RDP連線環境的資訊交流與連線確認。
2-1) 傳送包結構:
內容 | 位元組數 | 值 |
ISO資料層及以下 | XX | XX |
協議資訊初始傳送標誌 | 2 | 0x7f65 |
其後資料長度 | 3 | 0x82 0xlength |
第一部分未知資料 | 7 | 04 00 04 00 01 01 ff |
第二部分未知資料 | XX | 三組協議引數 |
第三部分未知資料 | XX | 四種連線引數 |
2-1-1) 第一部分未知資料結構:
內容 | 位元組數 | 值 |
Calling domain | 2 | 0x0400 |
Called domain | 2 | 0x0400 |
未知資料 | 2 | 0x0101 |
標誌 | 1 | 0xff |
2-1-2) 第二部分未知資料結構:
內容 | 位元組數 | 值 |
協議適合引數 | 2+4+7*(2+引數值佔位元組數) | 標誌,長度,8個引數值 |
協議最小引數 | 2+4+7*(2+引數值佔位元組數) | 標誌,長度,8個引數值 |
協議最大引數 | 2+4+7*(2+引數值佔位元組數) | 標誌,長度,8個引數值 |
說明:3組引數標誌都是0x30,8個引數值的標誌都是0x20
含義 | 適合值 | 最小值 | 最大值 |
虛擬通道數 | 0x22=34 | 0x01 | 0xffff |
使用者數 | 0x02 | 0x01 | 0xfc17=64535 |
Token值 | 0x00 | 0x01 | 0xffff |
優先數(priorities) | 0x01 | 0x01 | 0x01 |
遍及數(throughput) | 0x00 | 0x00 | 0x00 |
頂點數(height) | 0x01 | 0x01 | 0x01 |
網路邏輯資料包長度 | 0xffff | 0x0420=1056 | 0xffff=65535 |
版本號 | 0x02 | 0x02 | 0x02 |
2-1-3) 第三部分未知資料結構:
內容 | 位元組數 | 值 |
本部分標誌、資料長度 | 4 | 0x04 0x82 0xlength1 |
未知資料1 | 4 | 00 05 00 14 7c 00 01 |
餘下的資料長度 | 2 | 0x8000|length2 |
未知資料2 | 8 | 00 08 00 10 00 01 c0 00 |
未知資料3 | 4 | 44 75 63 61 –“Duca” |
4組資料 | XX | 各功能模組連線資訊 |
2-1-3-1:基本資訊
內容 | 位元組數 | 值(反位元組儲存) |
標誌 | 2 | 0xc001 |
長度 | 2 | 這一組資料的長度 |
Licence版本 | 2 | 1,4,5;lincence標誌升級 |
未知資料1 | 2 | 0x0008 |
視窗寬度、高度 | 4 | 寬度,高度 |
未知資料2 | 4 | 0xca01,0xaa03 |
Keylayout | 4 | 0x00000409 |
客戶端系統元件數 | 4 | 419,2195,2462 |
客戶端機器名 | 32 | 2位元組儲存1個字元 |
未知資料3 | 12 | 0x04,0x00,0x0c各四個位元組 |
未知資料4 | 64 | 都是0 |
未知資料5 | 8 | 01 ca 01 00 00 00 00 00 |
圖形顏色位(最大值) | 2 | 24,16,15,8 |
未知資料6(疑最小位) | 2 | 07 00 |
未知資料7 | 4 | 01 00 00 00 |
基本資訊返回值多少且固定,認為在具體連線時有更多返回資訊。加密資訊需要取回加密級別與金鑰;通道資訊則返回基本圖形資訊的通道號和其他虛擬通道號,需要另行申請。
3 通道申請模組
對於RDP連線,各種功能資料都是通過單獨的虛擬通道傳輸的。初始連線後,在進一步的資訊通訊之前,需要開闢相應的通道。
1) 過程說明
客戶端首先發送一個建立連線獨立空間請求,再發送一個使用者繫結請求,若伺服器同意,將傳送使用者繫結確認,且含有需要申請的虛擬通道總數totalchannel。隨後客戶端申請虛擬通道。虛擬通道號從1001+2=1003開始到1001+totalchannel結束,每次申請都應返回一個申請結果。
2) 建立連線獨立空間請求結構:
內容 | ISO資料層以下 | 請求標示 | 高度值 | 間距 |
位元組數 | XX | 1 | 2 | 2 |
值 | XX | 0x04 | 0x0001 | 0x0001 |
3) 使用者繫結請求結構:
內容 | ISO資料層以下 | 請求標示 |
位元組數 | XX | 1 |
值 | XX | 0x28 |
4) 使用者繫結確認結構:
內容 | ISO資料層以下 | 請求標誌 | 虛擬通道總數 |
位元組數 | XX | 2 | 2 |
值 | XX | 0x2e00 | totalchannel |
5) 申請虛擬通道號結構
內容 | ISO資料層以下 | 申請標誌 | 虛擬通道總數 | 虛擬通道號 |
位元組數 | XX | 1 | 2 | 2 |
值 | XX | 0x38 | totalchannel | Num, |
6) 通道申請確認結:
內容 | ISO資料層以下 | 確認標誌 | 通道總數 | 申請通道 | 申請通道 |
位元組數 | XX | 2 | 2 | 2 | 2 |
值 | XX | 0x3e00 | totall | num | num |
4 系統初始連線模組:
當通道申請各部分通過後,開始系統登入的初始連線。從此資料包開始,所以虛擬通道層以上的網路資料都需要加密,詳細的加密功能實現請參見加密模組。登入的網路資訊結構如下:
內容 | 位元組數 | 值(位元組反存) |
加密層及以下 | XX | XX |
空閒位元組 | 4 | 0x00000000 |
自動登入標誌 | 4 | 正常:0x33,自動:0x28 |
域名長度 | 2 | 若空為0,有值則乘2 |
使用者名稱長度 | 2 | 若空為0,有值則乘2 |
密碼長度 | 2 | 若空為0,有值則乘2 |
登入程式長度 | 2 | 若空為0,有值則乘2 |
登入路徑長度 | 2 | 若空為0,有值則乘2 |
域名值 | 域名長度+2 | 2位元組反存1字元,最後為2位元組為0x0000 |
使用者名稱值 | 使用者名稱長度+2 | 2位元組反存1字元,最後為2位元組為0x0000 |
密碼字元值 | 密碼長度+2 | 2位元組反存1字元,最後為2位元組為0x0000 |
登入程式名稱 | 登入程式長度+2 | 2位元組反存1字元,最後為2位元組為0x0000 |
登入路徑值 | 登入路徑長度+2 | 2位元組反存1字元,最後為2位元組為0x0000 |
5 圖形連線模組:
在圖形資料傳送之前,伺服器需要對此功能模組驗證,驗證內容是所有與圖形相關的資訊,包括滑鼠設定、鍵盤輸入、字型型別、畫圖命令格式、圖形顯示的各種型別。
根據已破解的資訊顯示,RDESKTOP原來並沒有正確的賦值,因為它的返回值是沒有固定的,對於伺服器傳送來的資訊沒有處理,而伺服器在其關於圖形方面的引數設定詢問沒有得到正確的回答時,則以固定的伺服器端的引數進行設定。
連線過程說明:伺服器端首先發送關於圖形方面的基本引數設定,客戶端應該對這些設定進行反饋。此後rdesktop的處理是順序傳送同步資訊,兩個控制資訊包,一個輸入資訊包,兩個字型資訊包;同時順序接收一個同步資訊包,兩控制資訊包,一個未知資訊包;但redsktop並沒有對接2收的資訊包進行處理。
5-2)基本引數設2置資訊包結構:
內容 | 位元組數 | 值(位元組反存) |
加密層及以下 | XX | XX |
層後資料長度 | 2 | XX |
資料型別標誌 | 2 | 11 00,表示是圖形資訊連線確認 |
基本通道號 | 2 | ea 03,固定 |
基本通道號 | 2 | ea 03,固定(share?) |
未知資料1 | 2 | 01 00 |
ASCII資訊長度 | 2 | XX |
基本引數長度 | 2 | XX |
ASCII資訊 | 長度值+1 | 52 44 50 00,r->“RDP”,s->“MSTSC” |
引數資訊 | 2 | r->0b 00,s->0d |
空位 | 2 | 30或00 |
詳細各組引數 | 組數 | 內容XX |
5-3) 詳細引數資訊組類別:
每個型別的資料前2位元組為型別,然後是長度,資料。以接收到優先作例介紹。
型別值 | 說明 |
01r | 通用型別(general) |
02r | 點陣圖型別(bitmap) |
03r | 命令(order) |
04 | 點陣圖快取(bitmap cache) |
05 | 控制(control) |
07 | 活動(active) |
08r | 指標(pointer) |
09r | 共享(share) |
0ar | 顏色快取(color cache) |
0c | 未知 |
0dr | 未知 |
0e | 未知 |
10 | 未知 |
12r | 未知 |
14r | 未知 |
16r | 未知 |
40 | 未知 |
00r | 未知 |
5-3-1) 通用型別(general->01)
內容 | 位元組數 | 值(位元組反存) |
系統主型別 | 2 | 01 00,OS major type |
系統次型別 | 2 | 03 00,OS minor type |
協議版本號 | 2 | 02 00,protocol version |
空資料1 | 2 | 00 00 |
壓縮型別 | 2 | 00 00不壓縮 |
空資料2 | 2 | 1d 04 |
更新屬性 | 2 | 00 00 |
共享屬性 | 2 | 00 00 |
壓縮級別 | 2 | 00 00 |
空資料3 | 2 | 01 01 |
6印表機對映連線模組:
RDP協議當前提供對映5個裝置,在我們破解過程中並沒有區分出他們的區別,在此視為單一處理。印表機的連線在系統登入前完成,以配置作業系統資訊。
6-1) 連線過程說明
包序號 | 接收發送 | 字元 | 含義 |
1 | R | InDr | 裝置初始連線通知,說明可以連線申請 |
2 | S | CCDr | 客戶端連線申請 |
3 | S | CNDr | 客戶端名稱註冊 |
4 | R | SPDr | 伺服器提供的裝置介面說明 |
5 | R | CCDr | 伺服器裝置申請確認 |
6 | S | CPDr | 客戶端裝置提供的介面說明 |
7 | S | DADr | 客戶端印表機對映申請 |
8 | R | drDr | 伺服器印表機裝置對映成功確認 |
6-2) 裝置初始連線通知:
內容 | 位元組數 | 值(位元組反存) |
層內資料長度 | 4 | 0x0000000c |
標誌 | 4 | 03 00 00 00,表示控制資訊 |
ASCII資訊 | 4 | InDr |
未知資料1 | 2 | 01 00,可能是最少個數 |
未知資料2 | 2 | 05 00,可能是最多個數 |
未知資料3 | 2 | ff ff |
未知資料4 | ff ff |
6-3) 客戶端連線申請:
內容 | 位元組數 | 值(位元組反存) |
層內資料長度 | 4 | 0x0000000c |
標誌 | 4 | 00 00 03 00,表示控制資訊 |
ASCII資訊 | 4 | CCDr |
未知資料1 | 2 | 00 01,申請最少個數 |
未知資料2 | 2 | 00 05,申請最多個數 |
未知資料3 | 2 | ff ff |
6-4) 客戶端名稱註冊:
內容 |