乾貨|微軟遠端桌面服務蠕蟲漏洞(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。該模組改動很少(只有一處函式差異),可以很快定位到問題函式,如下圖所示。
分析差異函式DecompressUnchopper::Decompress發現存在一處整型溢位漏洞。
上圖左邊是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>
patch的思路很簡單,當size>size+0x2000時,new(-1)後續邏輯函式直接return。
下面我們根據DecompressUnchopper::Decompress的邏輯梳理一下該漏洞可能的利用思路。
如上圖所示,可以看到函式尾部呼叫了memcpy,第一個引數dest指向的記憶體為前面new分配的記憶體空間。如果我們把decompressedSize設定為[0xffffe000,0xffffffff]的一個值,當加上0x2000後decompressedSize小於原值,此時如果buff還是原來的大小,會導致memcpy的操作覆蓋掉dest後面buff-(decompressedSize+0x2000)個位元組,如果後面的地址空間儲存有虛表指標之類的地址則可以導致控制流劫持。
poc構造
以上的分析基於對相關模組的逆向分析及靠經驗猜測,為了驗證思路是否正確首先需要能夠有觸達漏洞函式的rdp包。下面的敘述基於對CVE-2019-0708 poc的理解以及微軟官方提供的rdp協議文件。
首先看一下微軟的官方公告[1]:
從公告的描述來看這個漏洞跟CVE-2019-0708類似,都可以造成蠕蟲傳播的效果,所以也是不需要進行登入認證即可利用該漏洞遠端程式碼執行,感覺大部分程式碼可以複用所以決定在CVE-2019-0708的poc [2]基礎上構造CVE-2019-1182的poc。
透過研究CVE-2019-0708的poc和微軟官方文件[3]可以瞭解到rdp協議的通訊流程,如下圖所示:
至此找不到觸達漏洞函式的任何線索,思路還是要回到逆向漏洞函式週圍的處理邏輯上。交叉引用並沒有發現對DecompressUnchopper::Decompress的靜態呼叫,搜尋一下DecompressUnchopper這個類相關的函式:
經過分析發現是DecompressRdp8__CreateInstance這個函式建立了DecompressUnchopper物件,繼續檢視DecompressRdp8__CreateInstance沒有找到對此函式的靜態呼叫,發現這個函式是個匯出函式,最後經過搜尋發現該函式在rdpserverbase.dll中進行了匯入,交叉引用發現有兩處呼叫:
上圖中可以看到是在CRdpDynVC這個類的成員函式中進行了呼叫,因此猜測可能和rdp的dvc(Dynamic Virtual Channel)通道有關,關於dvc通道的詳細資訊可參考微軟官方文件[4]。透過查閱官方文件初步定位到透過dvc通道傳送加密資料可能會觸達漏洞函式。
dvc通道的建立流程如下:
(1) dvc init.
(2) dvc open
(3) dvc send&recv data
dvc通道可分片傳輸超大資料(最大不超過2^32-1位元組),並支援非加密和加密資料傳輸。
(4) dvc close
基於以上的研究,下面嘗試構造一個可觸達漏洞函式的dvc pdu。加密的dvc pdu結構如下圖所示,詳細資訊參見官方文件。
傳送的資料包:
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下斷,執行指令碼,觸發斷電,證明之前的猜測是正確的。
透過除錯分析及參考官方文件,構造如下資料包可導致crash:
dvc_send2 = ( "0300004002F08064000503EC70322A00000003000000" "68" + channel_id[-2:] + "01E0FFFF" "e122550e0ffff080000002690ce0a2b9f6401070000002630d2b4fc0402" ) tls.sendall(Packer(dvc_send).bin_unpack())
崩潰現場:
除錯分析導致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]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2670228/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Windows遠端桌面服務漏洞預警通告Windows
- 命令列重啟遠端桌面服務命令列
- 遭遇Tomcat遠端拒絕服務漏洞Tomcat
- Centos7安裝Xrdp遠端桌面服務CentOS
- 快速開啟服務或者IIS或者遠端桌面
- Win Server 2019遠端桌面服務部署Server
- 微軟認證:遠端開啟遠端計算機的遠端桌面微軟計算機
- windows10開啟遠端桌面的步驟_win10如何開啟遠端桌面服務WindowsWin10
- bbossaop遠端服務介紹-遠端服務呼叫例項
- Ubuntu 20.04 VNC服務開啟-遠端桌面設定UbuntuVNC
- 微軟遠端桌面工具:Microsoft Remote Desktop微軟ROSREM
- bbossaop遠端服務介紹-遠端服務id定義規則
- 最簡潔內網穿透教程一鍵穿透 3389 遠端桌面-純乾貨內網穿透
- redhat6.5 企業環境使用vnc服務遠端桌面RedhatVNC
- 批次遠端桌面連線 批次遠端桌面
- 遠端桌面
- win10神州網信政府版開啟遠端桌面服務Win10
- 微軟釋出補丁:修復了遠端桌面元件中存在的兩個高危漏洞微軟元件
- 全球再迎超級颶風,黑客可利用微軟“蠕蟲級”高危漏洞暴擊全球黑客微軟
- 批次遠端桌面管理軟體 批次遠端桌面
- rd遠端桌面 如何連線rd遠端桌面
- Microsoft Remote Desktop for Mac(微軟遠端桌面軟體)ROSREMMac微軟
- 本地除錯遠端服務除錯
- 《遠端控制》-服務端實現(一)服務端
- WinXP控制遠端桌面中的“雕蟲小技”(轉)
- Joomla遠端程式碼執行漏洞分析OOM
- bbossaop遠端服務介紹-點對點遠端服務呼叫和組播服務呼叫的區別
- vnc遠端桌面,4款vnc遠端桌面介紹。VNC
- 乾貨 | 攜程圖片服務架構架構
- 遠端桌面卡
- Xmanager遠端桌面
- dubbo 遠端服務無法呼叫
- spring 的遠端服務是?Spring
- 什麼是rdp遠端桌面?如何使用rdp遠端桌面?
- 什麼是rd遠端桌面?如何使用rd遠端桌面?
- 批次遠端桌面管理軟體下載 批次遠端桌面
- 分析一個linux下的蠕蟲 (轉)Linux
- XP空間遠端桌面中的“雕蟲小技”(轉)