錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務,錦州廣廈維修電腦,公司IT外包服務
topFlag1 設為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務項目 服務報價 維修流程 IT外包服務 服務器維護 技術文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務技術文章
實戰VMware虛擬機逃逸漏洞

作者: 佚名  日期:2017-07-25 20:59:48   來源: 本站整理

 最近長亭把Pwn2Own中遺憾的在比賽前一天被補上的漏洞利用發了出來,Amat大佬的博客有這篇文章,同時在長亭知乎專欄有楊博士發的中文版。 但是并沒有公開的exp,如何真正實現呢?自己花了十幾天才寫出exp,其中踩坑無數,本著分享精神,于是就有了本文。
0x01 Backdoor
backdoor是vmware實現的一套Guest和Host通信的機制,我們不需要去深入研究這種機制如何實現的,只需要大概了解一下這個機制的實現。 先看通信的代碼,這部分代碼在open-vm-tools的github上也有,鏈接在此。由于需要在VS中編譯,所以需要先轉換成為intel的asm格式。

在正常操作系統中直接執行in指令會導致出錯,因為這是特權指令。但是在Guest中這個錯誤會被vmware捕獲,然后傳給vmware-vmx.exe進程內部進行通信。 
而后面我們需要操作的message,全部通過backdoor通信方式來通信。 關于message的操作,open-vm-tools里面也有相關實現,鏈接在此。直接拿過來用就行了。 有了Message_Send和Message_Recv這些函數,我們就可以直接在Guest里面與Host進程進行通信。 需要注意的是Backdoor通信在Guest內部不需要管理員權限,所以此bug可在普通用戶觸發。
0x02 Drag and Drop RPCI
RPCI是基于backdoor實現的通信方式。open-vm-tools相關實現在此。可以直接使用這個發送RPC的函數。 這個漏洞存在在DnD操作的v3版本代碼中,對應bug代碼在此。
ida中更加明顯: 

由于沒有realloc或者totalsize的判斷,導致第二個包的totalsize可以改成一個大值,payloadsize因此也可以變大導致一個堆溢出。
 順帶一提,發送DnD操作的命令在dndCPTransportGuestRpc.hpp中。 通過閱讀open-vm-tools的代碼,可以得出RPC的發送對應路徑: 
rpcv3util::SendMsg->DnDCPTransportGuestRpc::SendPacket->RpcChannel_Send->Message_Send->backdoor
0x03逆向分析
看完相關的open-vm-tools的代碼之后,開始逆向vmware-vmx.exe,我的版本是12.5.2.13578,workstation是12.5.2-build4638234版本。 
首先很容易通過字符串“tools.capability.dnd_version”的xref找到對應的處理函數。 

bindfun只是把對應的參數值寫入了全局變量,其實是一個表。bindfun參數4就是對應rpc命令的處理函數,而rpc命令函數的參數3和參數4分別是我們發送的RPC原始request和RPCrequest的長度。參數5和參數6是我們得到的 reply的地址和reply的長度。 

可以看出這個命令有一個參數,也就是版本號。
其他的RPC命令類似,在發送“vmx.capability.dnd_version”命令的時候,對應的處理函數中如果發現當前版本和設置的版本不一致,就會調用函數創建新的 object,把原來的版本的object銷毀。
 

 

DnD和CP的Object的size都是一樣的,都是0xa8大小。
 

0x04 漏洞利用
Amat大佬的文章中推薦用info-set和info-get來操作堆,其中info-set對應的handle函數內部很復雜,通過windbg動態調試,可以發現我們發送“info-set guestinfo.test1 “+’a'*0xa7可以創建一個0xa8大小的buffer。實際測試我在malloc和free下斷點,整個info-set過程大概有10-13次malloc(size=0xa8),也有 接近10次的free操作,最終剩下一個buffer。也就是說整個info-set過程干擾很大。
 info-get可以讀取剛剛set的值,這就沒什么好說。 關于windows的LFH的風水,由于info-set中有多次malloc 0xa8操作,所以比較困難。我沒有什么好的辦法,目前我exp成功率還是比較低。 
思路大概就是把內存變成這個樣子:

如果一旦沒有布局成功。。vmware-vmx就會崩潰。。。 
如果你正好掛了windbg調試器。。那么整個host就會其卡無比。。未知bug。只能緩慢的對windbg調試器按q退出調試。 
推薦安裝windbg的pykd插件,大愛python。 我寫了個小腳本用來輔助調試:(其實就是打印rax)
from pykd import *
import sys
s=''
if len(sys.argv)>1:
s=sys.argv[1]+' '
print s+'Object at '+hex(reg('rax'))
所以就可以在attach上vmx進程的時候這么輸入:bp 7FF7E394C4D8 "!py dumprax DnD;gc;";bp 7FF7E394BF68 "!py dumprax 
CP;gc;";bp 7FF7E3DA05AB "!py dumprax vuln;gc;";bp 7FF7E3DA05DB;bp 
7ff7e38c1b2d;bp 7ff7`e38f1dc2;g
第一個地址是DnD Object malloc完畢后的下一條指令,第二個地址是CP Object的,第三個是vuln的,第四個地址是memcpy觸發的地方,后面兩個是gadget地址。
因為windows中進程重啟后基地址還是不會變,所以只要你不重啟電腦,可以一直用。
通過一些布局(運氣)變成了如上的內存之后,就可以開始leak了。
主要是通過覆蓋info-set的value buffer,修改value buffer內部的值,如果此時info-get讀取的valuebuffer值不同,那就說明被覆蓋了。
而如果溢出到了Object頭部,從info-get讀取的信息就會包含vtable的地址,從而泄露出程序基地址。
當然這個過程中有可能觸發RtlHeapFree等堆函數然。。因為堆chunk頭被覆蓋,理所當然崩潰。。。
0x05 DnD Object 覆蓋
如果覆蓋的是DnD Object,那么在DnD_TransportBufAppendPacket函數結束之后的上層函數會立刻發生調用。

所以在這之前,需要先在一塊內存布局好vtable,原文推薦使用“unity.window.contents.chunk” 命令,這個RPC命令會把我們的參數復制進去data段上一個堆指針內部。
這個全局變量指針由命令“unity.window.contents.start” 創建。
這兩個unity的命令。。有反序列化操作而且沒有官方文檔可以看,只能自己慢慢debug,摸索出對應的結構。。具體的結構請看文章末尾的Github代碼。
call之后,首先需要一個stack pivot到堆上,然后就是愉快的ROP。
需要說明的是,vmware中的data段居然是rwx的。。直接復制shellcode上去就能執行了。 

具體的ROP見文章末尾的Github代碼。
0x06 CopyPaste Object 覆蓋
如果覆蓋的是CP Object,那么覆蓋掉vtable之后,vmx進程不會崩潰,原文推薦使用cp命令觸發vtable調用,而我用了這個Object的destructor。也就是再把版本設 置回4的話,程序會調用vtable中對應的destructor. 
通過上面提到的”unity.window.contents.start“命令可以設置一個qword大小的gadget在程序的數據段上,而之前已經通過leak得到了程序的基地址,所 以可以得到這個gadget的指針的地址。
這個點不是特別好用,寄存器的值不是很方便,但最終依然找到了合適的gadget來利用。詳細ROP見文章末尾Github 代碼。
0x07 最后說兩句
這個漏洞能不能穩定利用,關鍵在于堆布局做的怎么樣,這個方面我研究不多。。以后還得繼續看。長亭在這種情況能達到60-80%的成功率,太厲害了。 
該漏洞在VMware Workstation 12.5.5之后被修補。
如果文章中有任何錯誤請在評論指出,謝謝各位表哥。



熱門文章
  • 機械革命S1 PRO-02 開機不顯示 黑...
  • 聯想ThinkPad NM-C641上電掉電點不...
  • 三星一體激光打印機SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數和判...
  • IIS 8 開啟 GZIP壓縮來減少網絡請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機始終停留在開機界面...
  • 常見打印機清零步驟
  • 安裝驅動時提示不包含數字簽名的解...
  • 共享打印機需要密碼的解決方法
  • 圖解Windows 7系統快速共享打印機的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務區域: 遼寧錦州市區
    主要業務: 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網設置,IT服務外包,局域網組建,ADSL共享上網,路由器設置,數據恢復,密碼破解,光盤刻錄制作等服務

    技術支持:微軟等
    主站蜘蛛池模板: 精品乱码一区内射人妻无码| 亚洲Av永久无码精品三区在线 | 99精品人妻无码专区在线视频区 | 人妻无码一区二区视频| 本免费AV无码专区一区| 日韩免费无码一区二区三区 | 日韩A无码AV一区二区三区| 高清无码视频直接看| 少妇特殊按摩高潮惨叫无码| 亚洲va无码专区国产乱码| 尤物永久免费AV无码网站| 久久亚洲AV成人无码软件| 人妻丰满熟妇AV无码区HD| 久久久精品天堂无码中文字幕 | 无码人妻AⅤ一区二区三区 | 精品无码久久久久久尤物| 亚洲色偷拍区另类无码专区| JAVA性无码HD中文| 伊人久久无码中文字幕| 无码人妻丰满熟妇啪啪| 精品少妇人妻AV无码专区不卡| 国产AV无码专区亚洲AVJULIA| 精品久久久久久无码中文字幕一区 | 亚洲中文字幕无码一区二区三区| 九九无码人妻一区二区三区| 亚洲色av性色在线观无码| 中文有无人妻vs无码人妻激烈 | 亚洲一本到无码av中文字幕| 亚洲精品中文字幕无码蜜桃| 极品粉嫩嫩模大尺度无码视频| 亚洲欧洲AV无码专区| 无码国内精品久久综合88| 亚洲av日韩av无码| 无码午夜成人1000部免费视频 | 免费无码又爽又黄又刺激网站| 亚洲AV无码一区二区三区牲色| 亚洲毛片无码专区亚洲乱| 亚洲一区二区三区无码国产| 亚洲精品无码成人片久久不卡| 亚洲av午夜精品无码专区| 亚洲精品无码少妇30P|