公開個(gè)Nday(圖)
發(fā)布日期:2021-12-16 18:03 | 文章來源:腳本之家
08046估計(jì)國(guó)內(nèi)很多小牛大牛搞出來了.最早知道有這么個(gè)洞大約是在今年三四月份,聽某牛man說有個(gè)系統(tǒng)默認(rèn)支持的圖片格式的洞,結(jié)果四月份出了個(gè)MS08-021,POC也有公開的,當(dāng)時(shí)以為傳言指的就是這兩個(gè)"雞肋".沒想到8月份MS又出了MS08-046,分析過程如下:
先認(rèn)真看了一遍MS的公告,從公告中可以知道文件格式是EMF,出錯(cuò)模塊是MSCMS,具體有漏洞的地方和ICC文件有關(guān)系.這樣看來PoC應(yīng)該和MS08-021有點(diǎn)類似.
然后是補(bǔ)丁比較,由于MSCMS模塊只有80KB,很快就可以找到出錯(cuò)函數(shù)名為OpenColorProfileW,分析出錯(cuò)函數(shù)雖然我沒有看出有明顯的溢出,但知道了該函數(shù)主要是通過一個(gè)傳遞過來的文件名(文件名長(zhǎng)度要小于104h),在文件名前面補(bǔ)上一個(gè)系統(tǒng)目錄后再打開這個(gè)文件.同時(shí)補(bǔ)丁后的功能在處理文件名的時(shí)候?qū)﹂L(zhǎng)度做了一些處理,所以估計(jì)為ICC文件名長(zhǎng)度超長(zhǎng)所造成的溢出.
第三步構(gòu)造POC,由于有分析MS08-021的經(jīng)驗(yàn),我知道在EMF文件中與ICC文件名相關(guān)的Recoder只有幾個(gè),在MSDN中都可以搜到,于是寫了個(gè)GUI程序,然后依次調(diào)用GetDC,GetClientRect,CreateEnhMetaFile,SetICMProfileA,CloseEnhMetaFile,ReleaseDC等API構(gòu)造了一個(gè)模版,然后在OpenColorProfileW入口處下斷點(diǎn),就發(fā)現(xiàn)在處理SetICMProfileA這個(gè)API函數(shù)所生成的EMR_SETICMPROFILEA記錄時(shí)可以走到斷點(diǎn)處.但是并不會(huì)走到出錯(cuò)的代碼塊,分析了一下代碼流層原來所傳入的文件名一是不能超過104h二是文件名的開頭必須要以http://開頭(怪不得分析08021的時(shí)候沒找到這個(gè)洞).
該寫EXP了,由于構(gòu)造出了POC,也就很容易的發(fā)現(xiàn)了出錯(cuò)原理為:在分配存放文件名和路徑的內(nèi)存的時(shí)候計(jì)算長(zhǎng)度是用的lstrlenW,所以造成分配的內(nèi)存空間只有實(shí)際COPY數(shù)據(jù)的一半,這樣就覆蓋了后面的堆管理結(jié)構(gòu)及其它一些數(shù)據(jù).到這兒漏洞已經(jīng)可以定性了,就是一個(gè)比較標(biāo)準(zhǔn)的堆溢出,在后面的釋放或是合并這個(gè)堆的時(shí)候會(huì)造出指針互寫的錯(cuò)誤,當(dāng)然由于XPSP2所增加的安全機(jī)制,造成這個(gè)洞很難利用.不過在IE中有時(shí)異常會(huì)發(fā)生在call [ecx xx]或是mov ecx,[eax](后面是call [ecx xx]),而ECX,EAX為我們傳入的文件名轉(zhuǎn)換為UNICODE后的值.再次調(diào)試分析后發(fā)現(xiàn):超長(zhǎng)串所覆蓋的數(shù)據(jù)中有時(shí)會(huì)是一個(gè)函數(shù)指針,而在這個(gè)堆釋放或是合并之前就會(huì)引用這個(gè)函數(shù)指針.所以一種可能的利用方法就是在IE中用HEAP SPRAY的方法和該漏洞結(jié)合.EMF文件中填充的字符串為0040007X(另外為了增大覆蓋函數(shù)指針的機(jī)率你還可以多加幾個(gè)有超長(zhǎng)文件名的記錄),或是用JAVA分配內(nèi)存填充數(shù)據(jù)為2xXXXXXX.
POC附圖:
先認(rèn)真看了一遍MS的公告,從公告中可以知道文件格式是EMF,出錯(cuò)模塊是MSCMS,具體有漏洞的地方和ICC文件有關(guān)系.這樣看來PoC應(yīng)該和MS08-021有點(diǎn)類似.
然后是補(bǔ)丁比較,由于MSCMS模塊只有80KB,很快就可以找到出錯(cuò)函數(shù)名為OpenColorProfileW,分析出錯(cuò)函數(shù)雖然我沒有看出有明顯的溢出,但知道了該函數(shù)主要是通過一個(gè)傳遞過來的文件名(文件名長(zhǎng)度要小于104h),在文件名前面補(bǔ)上一個(gè)系統(tǒng)目錄后再打開這個(gè)文件.同時(shí)補(bǔ)丁后的功能在處理文件名的時(shí)候?qū)﹂L(zhǎng)度做了一些處理,所以估計(jì)為ICC文件名長(zhǎng)度超長(zhǎng)所造成的溢出.
第三步構(gòu)造POC,由于有分析MS08-021的經(jīng)驗(yàn),我知道在EMF文件中與ICC文件名相關(guān)的Recoder只有幾個(gè),在MSDN中都可以搜到,于是寫了個(gè)GUI程序,然后依次調(diào)用GetDC,GetClientRect,CreateEnhMetaFile,SetICMProfileA,CloseEnhMetaFile,ReleaseDC等API構(gòu)造了一個(gè)模版,然后在OpenColorProfileW入口處下斷點(diǎn),就發(fā)現(xiàn)在處理SetICMProfileA這個(gè)API函數(shù)所生成的EMR_SETICMPROFILEA記錄時(shí)可以走到斷點(diǎn)處.但是并不會(huì)走到出錯(cuò)的代碼塊,分析了一下代碼流層原來所傳入的文件名一是不能超過104h二是文件名的開頭必須要以http://開頭(怪不得分析08021的時(shí)候沒找到這個(gè)洞).
該寫EXP了,由于構(gòu)造出了POC,也就很容易的發(fā)現(xiàn)了出錯(cuò)原理為:在分配存放文件名和路徑的內(nèi)存的時(shí)候計(jì)算長(zhǎng)度是用的lstrlenW,所以造成分配的內(nèi)存空間只有實(shí)際COPY數(shù)據(jù)的一半,這樣就覆蓋了后面的堆管理結(jié)構(gòu)及其它一些數(shù)據(jù).到這兒漏洞已經(jīng)可以定性了,就是一個(gè)比較標(biāo)準(zhǔn)的堆溢出,在后面的釋放或是合并這個(gè)堆的時(shí)候會(huì)造出指針互寫的錯(cuò)誤,當(dāng)然由于XPSP2所增加的安全機(jī)制,造成這個(gè)洞很難利用.不過在IE中有時(shí)異常會(huì)發(fā)生在call [ecx xx]或是mov ecx,[eax](后面是call [ecx xx]),而ECX,EAX為我們傳入的文件名轉(zhuǎn)換為UNICODE后的值.再次調(diào)試分析后發(fā)現(xiàn):超長(zhǎng)串所覆蓋的數(shù)據(jù)中有時(shí)會(huì)是一個(gè)函數(shù)指針,而在這個(gè)堆釋放或是合并之前就會(huì)引用這個(gè)函數(shù)指針.所以一種可能的利用方法就是在IE中用HEAP SPRAY的方法和該漏洞結(jié)合.EMF文件中填充的字符串為0040007X(另外為了增大覆蓋函數(shù)指針的機(jī)率你還可以多加幾個(gè)有超長(zhǎng)文件名的記錄),或是用JAVA分配內(nèi)存填充數(shù)據(jù)為2xXXXXXX.
POC附圖:
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章
下一篇:
關(guān)注官方微信