十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么進(jìn)行Metasploit BlueKeep漏洞利用的簡要分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)伊吾,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
*嚴(yán)正聲明:本文僅限于技術(shù)討論與分享,嚴(yán)禁用于非法途徑。
9月7日,Metasploit發(fā)布了BlueKeep遠(yuǎn)程桌面命令執(zhí)行漏洞利用模塊和分析博客。工具適用于64位Win7系統(tǒng)及打開啟用桌面音頻播放功能的64位2008系統(tǒng),本文將結(jié)合rdp相關(guān)實(shí)現(xiàn)對(duì)利用模塊進(jìn)行簡要分析。
BlueKeep是一個(gè)釋放后使用(Use After Free)漏洞。存在漏洞的遠(yuǎn)程桌面服務(wù)器,在接收到特殊數(shù)據(jù)包時(shí)會(huì)釋放一個(gè)內(nèi)部信道MS_T120的控制結(jié)構(gòu)體,但并未將指向該結(jié)構(gòu)體的指針刪除,而且在遠(yuǎn)程桌面連接結(jié)束之后還會(huì)調(diào)用MS_T120結(jié)構(gòu)體內(nèi)的一個(gè)函數(shù)指針,若攻擊者可通過遠(yuǎn)程發(fā)送數(shù)據(jù)重新占據(jù)被釋放的MS_T120,并為結(jié)構(gòu)體內(nèi)的函數(shù)指針賦恰當(dāng)?shù)闹?,即可?shí)現(xiàn)遠(yuǎn)程命令執(zhí)行。 關(guān)于漏洞利用的詳細(xì)分析可參看雪安全峰會(huì)講座的相關(guān)內(nèi)容,安全研究員Hutchins的 分析和github用戶0xeb-bp的write-up
基于cve_2019_0708_bluekeep_rce.rb文件進(jìn)行分析。利用模塊啟動(dòng)后,會(huì)先掃描目標(biāo)是否存在BlueKeep漏洞(掃描原理),存在漏洞則開始漏洞利用流程,先建立rdp連接并注冊MS_T120(觸發(fā)漏洞)和RDPSND(內(nèi)核池噴射)兩個(gè)虛擬信道。 wiresharkRDPDR信道會(huì)在rdp連接建立后與客戶端進(jìn)行握手,相關(guān)協(xié)議可見微軟文檔。在接收到來自RDPDR信道的CLIENTID_CONFIRM消息后,程序便認(rèn)為rdp連接已建立完成,開始進(jìn)行下一漏洞利用步驟。
先介紹MS_T120結(jié)構(gòu)體和利用RDPSND在內(nèi)核非分頁池中分配數(shù)據(jù)。 MS_T120結(jié)構(gòu)體由rdp組件termdd.sys分配,用于控制rdp連接中的虛擬信道MS_T120。 微軟的一篇rdp驅(qū)動(dòng)開發(fā)文檔中公開了這類結(jié)構(gòu)體的定義,雖然其中大部分字段名是保留的,但再結(jié)合termdd.sys可分析出其中數(shù)據(jù)代表的意義。
termdd!IcaAllocateChannel中創(chuàng)建了信道控制結(jié)構(gòu)體并分配內(nèi)存空間,可看出分配的內(nèi)存位于內(nèi)核非分頁池,大小為0x160字節(jié)。則要在內(nèi)核非分頁池中分配大量相同大小的可控?cái)?shù)據(jù),方可在MS_T120被釋放后重新占據(jù)并控制關(guān)鍵字段的值。這就需求利用rdp協(xié)議進(jìn)行內(nèi)核池噴射(Pool Spray)(當(dāng)然非rdp的池噴同樣可以達(dá)到相同目的,BlueKeep利用模塊主要貢獻(xiàn)者zerosum0x0分享了一份利用SMBLoris和IP分片進(jìn)行池噴的 BlueKeep Exp,但要求目標(biāo)啟用額外服務(wù)無疑增加了漏洞利用條件。)。這一點(diǎn)可以利用向特殊虛擬信道中發(fā)送數(shù)據(jù)實(shí)現(xiàn)(虛擬信道數(shù)據(jù)包格式文檔 見此)。同樣在termdd.sys中的IcaChannelInputInternal用于處理發(fā)往虛擬信道的數(shù)據(jù),在接收到數(shù)據(jù)后,IcaChannelInputInternal會(huì)根據(jù)虛擬信道的狀態(tài)執(zhí)行不同的操作。關(guān)鍵代碼如下:
注意第154行的判斷,IrpList是虛擬信道結(jié)構(gòu)體中用于存放正在排隊(duì)的Irp讀取請(qǐng)求的鏈表。若該鏈表不空,則IcaChannelInputInternal會(huì)取出一個(gè)Irp并將接收的數(shù)據(jù)復(fù)制過去,此時(shí)不會(huì)在內(nèi)核非分頁池中分配數(shù)據(jù)。若鏈表為空,則IcaChannelInputInternal會(huì)將接收到的數(shù)據(jù)緩存在內(nèi)核非分頁池中,此時(shí)便可進(jìn)行池噴射,代碼如下:
可以看到此時(shí)接收的數(shù)據(jù)被完全儲(chǔ)存在內(nèi)核非分頁池中,但需要注意的是分配大小會(huì)比數(shù)據(jù)多0x38字節(jié)的不可控制區(qū)域,此部分用于儲(chǔ)存緩存數(shù)據(jù)的長度、位置、前后緩存塊等元數(shù)據(jù)。Metasploit BlueKeep利用模塊選取的RDPSND虛擬信道便滿足IrpList鏈表為空的要求,內(nèi)核調(diào)試可驗(yàn)證這一點(diǎn)。
但RDPSND信道是用于完成遠(yuǎn)程桌面音頻播放相關(guān)功能的,若此功能被禁用則RDPSND會(huì)在rdp連接建立前被關(guān)閉。Win7系統(tǒng)是默認(rèn)啟用遠(yuǎn)程桌面音頻播放功能的,2008系統(tǒng)是默認(rèn)禁用的,必須通過通過遠(yuǎn)程桌面會(huì)話主機(jī)配置相關(guān)選項(xiàng)才可啟用(也可通過注冊表操作)
向RDPSND信道發(fā)送Size大小字節(jié)數(shù)據(jù)會(huì)被保存在Size+0x38大小的內(nèi)核非分頁池中,可以用此來占據(jù)被釋放的MS_T120結(jié)構(gòu)體和寫入shellcode。經(jīng)計(jì)算可知需要發(fā)送0x128的數(shù)據(jù),這樣便會(huì)在內(nèi)核非分頁池中分配0x160大小的數(shù)據(jù),與MS_T120結(jié)構(gòu)體大小相同。Metasploit BlueKeep利用模塊先發(fā)送大量大小為0x128的數(shù)據(jù),這樣便會(huì)在內(nèi)核非分頁池中占據(jù)大量0x160字節(jié)內(nèi)存空間,再發(fā)送會(huì)觸發(fā)MS_T120釋放的數(shù)據(jù)包,緊接著再次發(fā)送大小為0x128的數(shù)據(jù)。由于此前已經(jīng)在內(nèi)核中占據(jù)了大量0x160大小的空間,剛剛被釋放的MS_T120結(jié)構(gòu)體原來所占據(jù)的0x160字節(jié)內(nèi)存空間就極有可能被這批新發(fā)送數(shù)據(jù)中的一個(gè)所占據(jù)。
成功占據(jù)被釋放的MS_T120結(jié)構(gòu)體后,利用模塊繼續(xù)利用RDPSND向內(nèi)核中大量寫入shellcode。
最后BlueKeep利用模塊將rdp連接斷開,觸發(fā)shellcode執(zhí)行。
這一步并不是絕對(duì)穩(wěn)定的,利用模塊在控制MS_T120結(jié)構(gòu)體后,將結(jié)構(gòu)體內(nèi)函數(shù)指針(偏移0x100處)設(shè)置為一個(gè)內(nèi)核非分頁池地址范圍中的值(參考Windows x64系統(tǒng)內(nèi)核虛擬地址空間布局),并期望向內(nèi)核中寫入的shellcode能占據(jù)這個(gè)值,如果成功占據(jù)則可順利觸發(fā)遠(yuǎn)程命令執(zhí)行,若不能占據(jù)則會(huì)造成目標(biāo)藍(lán)屏崩潰。Metasploit BlueKeep利用模塊針對(duì)不同場景預(yù)設(shè)了不同地址,可在利用漏洞前通過target選項(xiàng)選擇。
如果漏洞利用成功,則在termdd!IcaChannelInputInternal+17d處觸發(fā)shellcode執(zhí)行。
由于漏洞觸發(fā)點(diǎn)在termdd.sys中,shellcode執(zhí)行時(shí)IRQL為DISPATCH_LEVEL,需要進(jìn)行特殊的處理。BlueKeep利用模塊的shellcode實(shí)現(xiàn)邏輯與 永恒之藍(lán)基本一致,均是先hook syscall再利用APC注入完成R0到R3的轉(zhuǎn)移。有一點(diǎn)不同之處在于BlueKeep是在shellcode運(yùn)行過程中用egg hunter的方式搜尋并復(fù)制用戶態(tài)payload(出于虛擬信道單次發(fā)送數(shù)據(jù)大小有限的考慮),而永恒之藍(lán)用戶態(tài)payload偏移位置是固定的。BlueKeep
EternalBlue
而且BlueKeep的shellcode為避免返回到IcaChannelInputInternal函數(shù)的麻煩,選擇直接在hook syscall之后返回到IcaChannelInputInternal的上層函數(shù)。
這部分代碼與IcaChannelInputInternal結(jié)束返回部分功能是一致的。
但這也造成了一點(diǎn)小問題,IcaChannelInputInternal在之前獲取了信道結(jié)構(gòu)體中的同步鎖,這里直接退出了IcaChannelInputInternal而鎖并沒有釋放。
上述就是小編為大家分享的怎么進(jìn)行Metasploit BlueKeep漏洞利用的簡要分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。