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