欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

手把手教你如何構(gòu)造Office漏洞POC(以CVE-2012-0158為例)

  發(fā)布時(shí)間:2016-09-28 14:36:47   作者:佚名   我要評(píng)論
近年來(lái)APT追蹤盛行,最常見(jiàn)的就是各種以釣魚(yú)開(kāi)始的攻擊,不僅僅有網(wǎng)站掛馬式釣魚(yú),也有魚(yú)叉式郵件釣魚(yú),下面小編就為大家介紹office漏洞CVE-2012-0158,一起來(lái)看看吧

下面小編為大家介紹office漏洞CVE-2012-0158就憑借其經(jīng)典、通用又穩(wěn)定的漏洞利用經(jīng)常出現(xiàn)在各種報(bào)告中,詳細(xì)的講解這個(gè)漏洞的原理,以及如何基于原理手動(dòng)構(gòu)造出可利用的POC樣本。

漏洞原理

關(guān)于本漏洞原理,網(wǎng)上有各種分析文章,一般都基于實(shí)例樣本來(lái)定位漏洞的二進(jìn)制代碼并分析原理,這里不作詳細(xì)的分析過(guò)程,直接給出漏洞成因,后面也有少部分的調(diào)試演示。這個(gè)漏洞發(fā)生在office的一個(gè)組件MSCOMCTL.OCX,多個(gè)版本office的該模塊都存在這個(gè)漏洞,本文的測(cè)試環(huán)境均以WINXP+office2007為例。MSCOMCTL.OCX這個(gè)漏洞模塊是office解析activeX控件用到的一個(gè)動(dòng)態(tài)庫(kù),如果一個(gè)office文檔中包含activeX這類(lèi)控件元素的話,比如按鈕、列表、樹(shù)形控件等,當(dāng)文檔通過(guò)office打開(kāi)時(shí)MSCOMCTL.OCX就會(huì)被自動(dòng)載入office程序的進(jìn)程空間被調(diào)用來(lái)解析和顯示控件。

本漏洞屬于經(jīng)典緩沖區(qū)溢出漏洞里的棧內(nèi)存拷貝溢出漏洞,當(dāng)office解析到一個(gè)被構(gòu)造好的控件(以ListView列表控件為例),會(huì)發(fā)生棧內(nèi)存越界拷貝。以下?;厮菔疽鈭D可以代表本漏洞的發(fā)生過(guò)程:

可以看出,Excel在解析ListView控件的時(shí)候,讀取并加載了控件的數(shù)據(jù)流,加載數(shù)據(jù)流的過(guò)程中會(huì)調(diào)用到一個(gè)內(nèi)部函數(shù)ReadBytesFromStreamPadded,該函數(shù)的功能類(lèi)似于memcpy內(nèi)存拷貝函數(shù),根據(jù)參數(shù)從指定內(nèi)存拷貝指定大小數(shù)據(jù)到目標(biāo)內(nèi)存。但仔細(xì)往上跟蹤就會(huì)發(fā)現(xiàn),漏洞并不是出現(xiàn)在這個(gè)函數(shù)里,而是出現(xiàn)在CObj::load這個(gè)函數(shù),下面分析一下這個(gè)函數(shù)如何出現(xiàn)的漏洞,先貼上IDA關(guān)于這個(gè)函數(shù)的偽代碼:

int __stdcall CObj__Load( int a1, void *lpMem)

{

  int result; // eax@1

  void *v3; // ebx@1

  int v4; // esi@4

  int v5; // [sp+Ch] [bp-14h]@1

  SIZE_T dwBytes; // [sp+14h] [bp-Ch]@3

  int v7; // [sp+18h] [bp-8h]@4

  int v8; // [sp+1Ch] [bp-4h]@8

 

  v3 = lpMem;

 result = ReadBytesFromStreamPadded(&v5, lpMem, 0xCu ); //第一次正??截?,讀取數(shù)據(jù)頭

  if ( result >= 0 )

  {

    if ( v5 == 'jboC' && dwBytes >= 8 ) //漏洞觸發(fā)條件

    {

     v4 = ReadBytesFromStreamPadded(& v7, v3, dwBytes); //第二次拷貝,此處調(diào)用必然越界

     if ( v4 >= 0 )

     {

       if ( ! v7 )

         goto LABEL_8;

       lpMem = 0;

       v4 = ReadBstrFromStreamPadded(( UINT)&lpMem, (int )v3);

       if ( v4 >= 0 )

       {

         CObj__SetKey((BSTR) lpMem);

         SysFreeString((BSTR) lpMem);

LABEL_8:

         if ( v8 )

           v4 = ReadVariantFromStream(( struct tagVARIANT *)(a1 + 20) , (struct IStream *) v3);

         return v4;

       }

     }

     return v4;

    }

   result = 2147549183;

  }

  return result;

}

CObj::Load,顧名思義,是CObj對(duì)象加載的方法,需要從內(nèi)存里讀取對(duì)象數(shù)據(jù),所以一開(kāi)始便從數(shù)據(jù)流里讀取了0x0c個(gè)字節(jié)到臨時(shí)變量v5中。接著判斷v5的前4個(gè)字節(jié)是否為”Cobj”來(lái)檢測(cè)是否為要加載的對(duì)象類(lèi)型,并且dwBytes這個(gè)變量如果大于8才進(jìn)行下一步的加載。注意到,dwBytes 這個(gè)變量是讀取那0x0c個(gè)字節(jié)的時(shí)候一起讀取進(jìn)來(lái)的,因?yàn)閺腎DA的變量備注中可以看出dwBytes =[bp-0x0c]落在v5=[bp-0x14]和v5+0x0c=[bp-0x08]的內(nèi)存區(qū)間中,所以這里的一個(gè)關(guān)鍵是dwBytes的值可以通過(guò)修改數(shù)據(jù)流被控制。

再看下一步,同樣從原來(lái)的數(shù)據(jù)流讀取dwBytes個(gè)字節(jié)到臨時(shí)變量v7中,v7=[bp-0x08],而dwBytes此時(shí)卻大于8,所以這個(gè)讀取拷貝必然會(huì)覆蓋ebp,發(fā)生越界拷貝,形成棧溢出漏洞。根據(jù)此分析可以推測(cè),正常情況從控件數(shù)據(jù)讀取出來(lái)dwBytes值不會(huì)大于8,因?yàn)槿绻笥?的話必然導(dǎo)致??截惍惓#敲催@個(gè)漏洞早就被測(cè)試出來(lái)了。而且通過(guò)IDA里查看此函數(shù)的交叉引用會(huì)發(fā)現(xiàn),這個(gè)函數(shù)似乎作用并不大,都是在加載特定幾個(gè)控件的開(kāi)頭被調(diào)用了一下。所以,我懷疑這個(gè)漏洞不是所謂的嚴(yán)重的失誤,把本來(lái)的小于8寫(xiě)成了大于8,就是微軟故意留下來(lái)的后門(mén)漏洞。

構(gòu)造觸發(fā)漏洞的POC

經(jīng)過(guò)上面的原理分析,office在解析ListView控件時(shí)調(diào)用了漏洞函數(shù)CObj::Load,該函數(shù)在加載CObj對(duì)象時(shí)根據(jù)可被篡改的dwBytes讀取指定大小的內(nèi)存數(shù)據(jù)到8字節(jié)的臨時(shí)變量,且校驗(yàn)大小時(shí)存在后門(mén)嫌疑,導(dǎo)致可被利用的緩沖區(qū)溢出漏洞。為了檢驗(yàn)我們的分析是否正確,下面我們參考上面的?;厮穲D構(gòu)造可觸發(fā)此漏洞的Excel文檔。

首先Excel文檔里需要存在一個(gè)ListView控件,可以通過(guò)Excel軟件里面的開(kāi)發(fā)者工具添加,添加完后相當(dāng)于文檔里嵌入了一個(gè)空的ListView對(duì)象。

接著,還需要往這個(gè)對(duì)象里面添加ListItems以及ListItem子對(duì)象,這樣就能使Excel程序調(diào)用到CObj::Load函數(shù)。但是這里有個(gè)問(wèn)題,ListItem對(duì)象無(wú)法直接通過(guò)Excel操作添加,Excel只能通過(guò)ListView控件的屬性添加列表標(biāo)題,沒(méi)有直接辦法添加列表內(nèi)容。解決辦法是通過(guò)編寫(xiě)Excel支持的VBA程序代碼,編譯生成一個(gè)ListItem對(duì)象。

但是這樣帶來(lái)另外一個(gè)問(wèn)題,就是如果文檔里邊存在VBA這類(lèi)宏代碼,Excel會(huì)默認(rèn)禁止代碼執(zhí)行,這樣依舊解析不到ListView控件里的ListItem對(duì)象,一個(gè)簡(jiǎn)單的解決辦法就是先寫(xiě)好代碼編譯運(yùn)行后生成了初始化好的ListView控件,再把所有的生成代碼刪除后保存即可,因?yàn)楹甏a會(huì)被阻止執(zhí)行而控件對(duì)象不會(huì)被阻止解析。

下一步,只要將保存好的文檔通過(guò)十六進(jìn)制編輯器打開(kāi),定位到CObj對(duì)象的數(shù)據(jù),修改偏移量為8的dwBytes值為大于8的數(shù)值就能觸發(fā)漏洞。事實(shí)上只修改那一個(gè)值還無(wú)法看到漏洞觸發(fā)的效果,原因是拷貝函數(shù)ReadBytesFromStreamPadded還會(huì)接著校驗(yàn)dwBytes的值,幸運(yùn)的是該校驗(yàn)只是從要拷貝的數(shù)據(jù)頭部讀取另一個(gè)dwBytes的值,檢驗(yàn)兩個(gè)值是否相等,所以我們只需要把對(duì)象數(shù)據(jù)里的那個(gè)數(shù)值也修改成相應(yīng)的大小就可以通過(guò)校驗(yàn)從而觸發(fā)漏洞。

觸發(fā)漏洞后,由于我們只是簡(jiǎn)單的用一些隨機(jī)數(shù)據(jù)覆蓋ebp和相關(guān)函數(shù)返回地址,所以Excel最終優(yōu)雅的返回一個(gè)我們想要看到的程序錯(cuò)誤提示框。

漏洞利用

現(xiàn)在,我們得到了一個(gè)可以觸發(fā)的棧緩沖區(qū)溢出漏洞,下面要怎么利用這個(gè)漏洞來(lái)做一些事情就各顯神通了,本文還是給大家彈個(gè)計(jì)算器來(lái)拋磚引玉。

通過(guò)上面構(gòu)造的POC,我們可以修改兩個(gè)dwBytes的值和后面的數(shù)據(jù)來(lái)控制運(yùn)行棧的內(nèi)存布局。為了更好的編排數(shù)據(jù),最好通過(guò)調(diào)試樣本去動(dòng)態(tài)修改數(shù)據(jù)以達(dá)到目的,最后只要將內(nèi)存里編排好的數(shù)據(jù)拷貝到文檔對(duì)應(yīng)的部分即可。而調(diào)試過(guò)程中,我們的第一目標(biāo)自然是獲取程序控制器,控制eip,這里一般是通過(guò)覆蓋函數(shù)返回值或SEH鏈指針來(lái)實(shí)現(xiàn)。由于MSCOMCTRL.DLL沒(méi)有開(kāi)啟GS保護(hù),我們采取最簡(jiǎn)單的覆蓋函數(shù)返回值即可控制eip。然而,為了使程序順利的走到返回值,我們還需要修改數(shù)據(jù),滿足一些返回條件,控制程序流程,使之不進(jìn)入復(fù)雜的函數(shù)或指令操作集,避免因棧被破壞導(dǎo)致一些異常的發(fā)生。

一旦程序順利到達(dá)返回地址,我們便可以根據(jù)運(yùn)行環(huán)境做各種事情,比如構(gòu)造一個(gè)rop鏈繞過(guò)dep保護(hù),或者直接跳轉(zhuǎn)到??臻g執(zhí)行代碼,這些對(duì)于一個(gè)熟悉漏洞利用的人來(lái)說(shuō)都是輕車(chē)熟路了。這里有個(gè)需求,就是棧內(nèi)存數(shù)據(jù)需要有足夠大小的空間來(lái)容納無(wú)論是rop鏈還是shellcode,所以需要增加一下ListView控件的數(shù)據(jù)規(guī)模,簡(jiǎn)單的方法就是添加ListItem的時(shí)候把字符串寫(xiě)的足夠長(zhǎng)。

當(dāng)所有的必要條件都具備的時(shí)候,我們的代碼就可以放進(jìn)棧里執(zhí)行了,這里我簡(jiǎn)單使用一個(gè)通用的跳轉(zhuǎn)地址直接跳轉(zhuǎn)至棧內(nèi)存代碼執(zhí)行,由于XP+office 2007默認(rèn)不開(kāi)啟dep保護(hù),所以我的環(huán)境可以順利彈出計(jì)算器。

關(guān)于更多的需求比如如何編寫(xiě)rop鏈繞過(guò)office2010以上默認(rèn)開(kāi)啟的dep保護(hù),我將會(huì)在接下去其他的漏洞分享中陸續(xù)展開(kāi)。另外,限于本文是文稿形式,更詳細(xì)的視頻演示也可以訪問(wèn)本人的博客地址(搜索維一零小站)進(jìn)行參考。

總結(jié)

通過(guò)本文詳細(xì)的分析,我們了解到這個(gè)漏洞的原理和危害性,由于MSCOMCTL.OCX是基礎(chǔ)動(dòng)態(tài)庫(kù),影響的應(yīng)用軟件自然比較多,除了office全套裝外,sql和其他第三方應(yīng)用軟件,只要存在使用該漏洞庫(kù)的地方,都有可能被利用。而利用的方法和本文一樣,都離不開(kāi)漏洞的原理,構(gòu)造的“畸形”數(shù)據(jù)必須要通過(guò)漏洞函數(shù)的檢驗(yàn)流程,才能最終繞過(guò)程序本身的限制,奪取程序的控制權(quán)。

相關(guān)文章

最新評(píng)論