乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

京東科技開發者發表於2019-12-24
乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析
2019年8月,微軟釋出了一套針對遠端桌面服務的修復程式,其中包括兩個關鍵的遠端執行程式碼(RCE)漏洞,CVE-2019-1181和CVE-2019-1182。與之前修復的“BlueKeep”漏洞(CVE-2019-0708)類似,也具有蠕蟲特性,即利用這些漏洞的惡意軟體可能會在無需使用者互動的情況下在易受攻擊的機器間進行傳播。 本文主要透過對CVE-2019-1182漏洞進行分析,讓大家對於漏洞的成因及漏洞修復有一個更加全面的認識。
系統版本 :Windows 10 1903
補丁 :windows10.0-kb4512508-x64_1893edc9a11d760be11e49d2500170ceee8026d7

漏洞危害

公網開放RDP服務的主機數量巨大,影響面極大。危險等級:嚴重,請使用者儘快升級更新。

成因分析

分別提取補丁前和補丁後rds(Remote Desktop Service)程式相關bin檔案及相關驅動模組,經過ida和bindiff分析後定位到rdpbase.dll。該模組改動很少(只有一處函式差異),可以很快定位到問題函式,如下圖所示。

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

分析差異函式DecompressUnchopper::Decompress發現存在一處整型溢位漏洞。

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

上圖左邊是patch之後的程式碼,右邊是patch之前的程式碼,可以看到pcach之前指令eax+0x2000作為函式new的引數使用,patch後增加了對size的校驗,會判斷edx+0x2000是否大於edx,什麼情況下一個值加上0x2000會大於之前的值呢?對於無符號整數來說當0xffffe000<size<0xffffffff時,size+0x2000將位於(0,0x2000)這個區間,size style="font-size: inherit;color: inherit;line-height: inherit;">size+0x2000.補丁後的反編譯程式碼如下</size<0xffffffff時,size+0x2000將位於(0,0x2000)這個區間,size>

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

patch的思路很簡單,當size>size+0x2000時,new(-1)後續邏輯函式直接return。
下面我們根據DecompressUnchopper::Decompress的邏輯梳理一下該漏洞可能的利用思路。

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

如上圖所示,可以看到函式尾部呼叫了memcpy,第一個引數dest指向的記憶體為前面new分配的記憶體空間。如果我們把decompressedSize設定為[0xffffe000,0xffffffff]的一個值,當加上0x2000後decompressedSize小於原值,此時如果buff還是原來的大小,會導致memcpy的操作覆蓋掉dest後面buff-(decompressedSize+0x2000)個位元組,如果後面的地址空間儲存有虛表指標之類的地址則可以導致控制流劫持。

poc構造

以上的分析基於對相關模組的逆向分析及靠經驗猜測,為了驗證思路是否正確首先需要能夠有觸達漏洞函式的rdp包。下面的敘述基於對CVE-2019-0708 poc的理解以及微軟官方提供的rdp協議文件。
首先看一下微軟的官方公告[1]:

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

從公告的描述來看這個漏洞跟CVE-2019-0708類似,都可以造成蠕蟲傳播的效果,所以也是不需要進行登入認證即可利用該漏洞遠端程式碼執行,感覺大部分程式碼可以複用所以決定在CVE-2019-0708的poc [2]基礎上構造CVE-2019-1182的poc。
透過研究CVE-2019-0708的poc和微軟官方文件[3]可以瞭解到rdp協議的通訊流程,如下圖所示:

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

至此找不到觸達漏洞函式的任何線索,思路還是要回到逆向漏洞函式週圍的處理邏輯上。交叉引用並沒有發現對DecompressUnchopper::Decompress的靜態呼叫,搜尋一下DecompressUnchopper這個類相關的函式:

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

經過分析發現是DecompressRdp8__CreateInstance這個函式建立了DecompressUnchopper物件,繼續檢視DecompressRdp8__CreateInstance沒有找到對此函式的靜態呼叫,發現這個函式是個匯出函式,最後經過搜尋發現該函式在rdpserverbase.dll中進行了匯入,交叉引用發現有兩處呼叫:

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

上圖中可以看到是在CRdpDynVC這個類的成員函式中進行了呼叫,因此猜測可能和rdp的dvc(Dynamic Virtual Channel)通道有關,關於dvc通道的詳細資訊可參考微軟官方文件[4]。透過查閱官方文件初步定位到透過dvc通道傳送加密資料可能會觸達漏洞函式。
dvc通道的建立流程如下:
(1) dvc init.

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

(2) dvc open

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

(3) dvc send&recv data

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

dvc通道可分片傳輸超大資料(最大不超過2^32-1位元組),並支援非加密和加密資料傳輸。

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

(4) dvc close

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

基於以上的研究,下面嘗試構造一個可觸達漏洞函式的dvc pdu。加密的dvc pdu結構如下圖所示,詳細資訊參見官方文件。

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

傳送的資料包:
dvc_send = ( #pdu header "0300004002F08064000503EC70322A00000003000000" #1st byte cid length "68" + channel_id[-2:] + "01110000" #data "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" "414141414141414141414141414141414141414141414141414141" ) tls.sendall(Packer(dvc_send).bin_unpack()) 

對DecompressUnchopper::Decompress下斷,執行指令碼,觸發斷電,證明之前的猜測是正確的。

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

透過除錯分析及參考官方文件,構造如下資料包可導致crash:
dvc_send2 = ( "0300004002F08064000503EC70322A00000003000000" "68" + channel_id[-2:] + "01E0FFFF" "e122550e0ffff080000002690ce0a2b9f6401070000002630d2b4fc0402" ) tls.sendall(Packer(dvc_send).bin_unpack()) 

崩潰現場:

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

除錯分析導致crash的原因如下: DecompressedSize為0xffffe001,加0x2000之後為1,new(1)分配了一個位元組的堆空間,memcpy多次像new分配的記憶體複製資料,導致資料一直向後覆蓋,圖中覆蓋到了RdpBoundsAccumulator物件,當執行clear操作時訪問無效地址造成memory corruption。
關於利用的一些思考:精準控制memcpy複製長度,覆蓋到某物件的虛表指標或其他可劫持控制流的記憶體單元,可導致任意程式碼執行,需要考慮cfg等漏洞利用緩解措施的bypass。
點選 閱讀 ,獲取更多資訊~
References:
[1] https://msrc-blog.microsoft.com/2019/08/13/patch-new-wormable-vulnerabilities-in-remote-desktop-services-cve-2019-1181-1182/
[2]
[3]
[4]

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析

乾貨|微軟遠端桌面服務蠕蟲漏洞(CVE-2019-1182)分析


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2670228/,如需轉載,請註明出處,否則將追究法律責任。

相關文章