基于RDP的SSL中間人攻擊
本文通過演示在RDP會話期間劫持的按鍵發送信息,向讀者演示了為什么用戶忽略那些基于SSL的RDP連接的證書警告可能導致中間人(MiTM)攻擊,并總結了一些關于如何避免成為這種攻擊的受害者的建議。
RDP連接的類型
在開始之前,首先明確本文討論了三種類型的RDP連接,包括:
- RDP安全層(RDPSecurity Layer)
- SSL(TLS 1.0)
- CredSSP (SSL with NLA)
本文要演示的是中間的那個類型,即SSL(TLS 1.0)。在終端服務器上,SSL一般會如下配置(不選中任意NLA復選框):
RDP使用的配置
如果服務器被設置“Negotiate”,某些連接可能包含比較容易受到攻擊,因為其安全層可能使用SSL。
SSL證書警告
如果有用戶在每次連接時經常不重視類型如下的警告提示,本文恰好就是針對這些用戶的:
經常被習慣性忽視的SSL警告
攻擊簡介
在較高的層面,攻擊與其它的SSL中間人攻擊類似:
1. 想辦法使受害者連接到我們系統上的PoC工具(rdp-ssl-mitm.py),而不是其要連接的RDP服務器。
2. 該工具使用RDP協議,通過協商使其在交互過程中使用SSL。
3. 一旦連接被協商使用SSL,我們的工具就會用其自己(不可信的)SSL證書與RDP客戶端協商一次SSL連接。這樣就使欺騙工具有機會訪問RDP客戶端發送的信息明文。
4. 該工具也需要與正常的RDP服務器創建SSL連接,將RDP客戶端的數據發送到該服務器。
這種攻擊的唯一缺點是在創建所需的SSL連接之前,我們的欺騙工具必須通過RDP協議與客戶端有一個簡短的交互。
1、使受害者連接到我們這里
在真實的攻擊過程中,我們需要使RDP客戶端連接到我們的系統,而不是其目標服務器。因此會用到ARP欺騙、DNS欺騙或一些其它方法,為簡便起見,本文不再演示這些細節,假設已經成功欺騙受害者的RDP客戶端使其連接攻擊者的系統。
在我們的攻擊系統上(192.168.190.170),啟動PoC工具,告訴它與正常的RDP服務器192.168.2.96連接:
$ ./rdp-ssl-mitm.py -r192.168.2.96:3389
[+] Listening forconnections on 0.0.0.0:3389
這里我們只需要簡單地將攻擊系統的IP地址輸入到RDP客戶端(客戶端從192.168.190.1連接):
直接輸入攻擊者的IP,略過ARP欺騙步驟
2、與RDP客戶端交互協商使用SSL
SSL的協商在RDP協議內非常短:
Message #1: Client >MiTM > Server
03 00 00 13 0e e0 00 00 00 00 00 01 00 0800 *03*
00 00 00
這段消息是靜態不變的,我們的欺騙工具直接將其傳遞給服務器,不做修改。*03*表示客戶端支持RDP安全層、SSL與CredSSP。
Message #2: Server >MiTM > Client
03 00 00 13 0e d0 00 00 12 34 00 02 00 0800 *01*
00 00 00
接下來的消息表示服務器選擇使用的協議,*01*表示服務器已經選擇使用SSL(*02*表示CredSSP)。我們也將這條消息不加修改地傳遞給客戶端。
注意如果服務器如果選擇了CredSSP(*02*),本次演示會失敗,因為這里只是攻擊SSL,不是CredSSP。
3、與RDP客戶端創建SSL連接
Message #3: Client >MiTM
第三條消息用來開始創建一條SSL連接。這里SSL客戶端的消息從*16 0301*開始(03 01表示SSL使用的版本:SSL 3.1AKA TLS 1.0)
*16 03 01* 00 5a 01 00 00 56 03 01 52 21 acbe 63
20 ce de 4b a5 90 18 f0 66 97 ee 9d 54 14e3 1c
... snip ...
欺騙工具不會將這些數據直接發給服務器,而是直接向服務器發送創建連接的請求,同時與客戶端完成SSL連接的建立。
這里我們使用的SSL證書會被RDP客戶端認為非法,并在mstsc中向用戶顯示SSL警告:
因PoC工具使用的證書產生的安全警告
如果用戶仔細檢查就會發現,這里使用的SSL證書與正常證書是存在區別的。要改進攻擊的質量,我們需要不斷改進證書使其無限接近真實的證書,但我們永遠無法得到與正常證書相同的簽名,因此總會有些不同。
4、與RDP服務器創建SSL連接
同時,我們的工具也向RDP服務器發起創建連接的消息,并與其創建第二條SSL連接。
顯示按鍵信息
至些,我們的欺騙工具就可以明文顯示RDP客戶端發給服務器所有按鍵操作了。很容易確定發送的是哪種類型的消息,以下兩個4字節的消息就是按‘p’鍵時發送的。
44 04 00 19 44 04 01 19
第三個字節表示按鍵的方向(00表示鍵被按下,01表示鍵彈起)。第四個字節是鍵的掃描碼(scancode),通過查詢可以發現0×19恰好對應字母“p”鍵。
通常情況下,與字符對應的掃描碼取決于所使用的鍵盤。我所使用的PoC工具中,已經實現了對QWERTY鍵盤的映射,所以如果讀者使用的是UK/US鍵盤,該工具可以直接將大部分掃描碼轉換成對應的字符。注意我們無法知道字符是大寫的還是小寫的,需要根據CAPSLock鍵和SHIFT鍵的狀態的狀態確定。
話不多說,直接上例子。以下是PoC工具的一些輸出,顯示了記錄的按鍵,同時也記錄下了登錄的用戶名為Administrator,密碼為Password:
$ ./rdp-ssl-mitm.py -r 192.168.2.96:3389
[+] Listening for connections on0.0.0.0:3389
[+] Incoming connection from192.168.190.1:60370
[+] New outgoing request to192.168.2.96:3389 (SSL: 0)
[+] Connected
[+] Detected incoming SSL connection.Turning self into SSL socket
[+] Incoming connection from192.168.190.1:60374
[+] New outgoing request to192.168.2.96:3389 (SSL: 0)
[+] Connected
[+] Detected incoming SSL connection.Turning self into SSL socket
<LShift-down>A<LShift-up>DMINISTRATOR<Tab><LShift-down>P<LShift-up>ASSWORD<Enter>
總結
習慣性忽略RDP連接中的SSL認證警告提示可能造成與忽視HTTPS網站的證書同樣的后果:用戶可以輕而易舉受到中間人攻擊。這種攻擊可以截獲到用戶的用戶名、密碼、按鍵信息及其它敏感信息。
使用RDP客戶端可信的、由認證授權機構簽名的SSL證書,正常情況下是沒有警告提示的,因此本文也強烈推薦用戶注意這一點。
如果服務器授權了NLA,這種攻擊也會失效,所以我們也強烈推薦使用NLA。
不過需要知道的是,這并不是RDP客戶端或服務器軟件的漏洞,這種利用方法也不是新發現。這只是RDP使用過程中的一些脆弱特性,在用戶忽略安全警告時可能產生,在技術層面只是一個普通的SSL中間人攻擊。
這種攻擊中一個比較有趣的擴展就是可以記錄屏幕畫面,也有機會攻擊任意RDP客戶端映射的驅動器,更多細節可以參考《Attacking the RDP Clients》,不過這種攻擊需要攻擊有一定的編碼基礎。
[via portcullis]