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

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章
下一篇: