CVE-2016-0059 IE資訊洩露漏洞分析

wyzsk發表於2020-08-19
作者: netwind · 2016/04/20 10:10

From:http://blog.fortinet.com/post/analysis-of-cve-2016-0059-microsoft-ie-information-disclosure-vulnerability-discovered-by-fortinet#st_refDomain=t.co&st_refQuery=/tXFSU1a0eW

0x00 概要


本文將對CVE-2016-0059進行深度分析,該漏洞是由於微軟超連結物件庫記憶體資料洩露造成的,成功利用該漏洞可以獲得一些資訊從而對使用者系統造成進一步威脅。要利用該漏洞,攻擊者必須誘導使用者點選一個email裡的或者一個office文件裡的超連結。

起初是把該漏洞作為Microsoft Office Excel 堆溢位漏洞報告給微軟的 ,但是該漏洞實際上是由 Internet Explorer物件庫 hlink.dll (微軟超連結物件庫) 引起的,因此微軟把該漏洞定義為 Internet Explorer資訊洩露漏洞。本文將仍然用Microsoft Office來證明和分析該漏洞。

受影響產品:

  • IE 9
  • IE 10
  • IE 11(包括win10版)

0x01 漏洞驗證


要重現該漏洞,我們可以用 Microsoft Office Excel 2007開啟POC FG-VD-15-073_PoC.xls。然後我們可以到Excel.exe崩潰了,崩潰資訊顯示如下:

#!bash
(3344.1804): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=1a06d0d0 ebx=00000002 ecx=18b22fea edx=00000001 esi=18b23000 edi=18b22fe8
eip=6cd40b40 esp=00b739b4 ebp=00b739c4 iopl=0         nv up ei ng nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010282
hlink!WzDupWzToWz+0x16:
6cd40b40 668b06          mov     ax,word ptr [esi]        ds:002b:18b23000=????
0:000> u
hlink!WzDupWzToWz+0x16:
6cd40b40 668b06          mov     ax,word ptr [esi]
6cd40b43 03f3            add     esi,ebx
6cd40b45 6685c0          test    ax,ax
6cd40b48 75f6            jne     hlink!WzDupWzToWz+0x16 (6cd40b40)
6cd40b4a 2bf1            sub     esi,ecx
6cd40b4c d1fe            sar     esi,1
6cd40b4e 8d5e01          lea     ebx,[esi+1]
6cd40b51 85d2            test    edx,edx
0:000> !heap -p -a esi
    address 18b23000 found in
    _DPH_HEAP_ROOT @ 5601000
    in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize)
                                1a173a5c:         18b22fe8               16 -         18b22000             2000
    5e6d9abc verifier!AVrfDebugPageHeapAllocate+0x0000023c
    77c97ab1 ntdll!RtlDebugAllocateHeap+0x0000003c
    77c4ba4e ntdll!RtlpAllocateHeap+0x0004cfde
    77bfdc26 ntdll!RtlpAllocateHeapInternal+0x00000146
    77bfdab8 ntdll!RtlAllocateHeap+0x00000028
    770f32e6 combase!CRetailMalloc_Alloc+0x00000016 [d:thcomcombaseclassmemapi.cxx @ 641]
    6cd337fd hlink!CMalloc::Alloc+0x0000002d
    6cd40c32 hlink!operator new+0x00000023
    6cd3d50e hlink!HrReadLengthWzStm+0x00000034
    6cd39b2c hlink!HLNK_PersistStm::Load+0x0000010c
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:Program Files (x86)Common FilesMicrosoft Sharedoffice12mso.dll - 
    3280dc07 mso!Ordinal2575+0x00000320
    3280dac1 mso!Ordinal2575+0x000001da
    3280da7a mso!Ordinal2575+0x00000193
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:Program Files (x86)Microsoft OfficeOffice12oart.dll - 
    3a99fb87 oart!Ordinal5476+0x00000709
0:000> dp 18b22fe8               
18b22fe8  00720041 00610072 00440079 006d0075
18b22ff8  00320070 d0d0d000 ???????? ????????
18b23008  ???????? ???????? ???????? ????????
18b23018  ???????? ???????? ???????? ????????
18b23028  ???????? ???????? ???????? ????????
18b23038  ???????? ???????? ???????? ????????
18b23048  ???????? ???????? ???????? ????????
18b23058  ???????? ???????? ???????? ????????
0:000> kb
 # ChildEBP RetAddr  Args to Child              
00 00b739c4 6cd3590d 00000000 00b73a88 00b73a1c hlink!WzDupWzToWz+0x16
01 00b739e0 6cd331cf 1a068f28 00000000 00b73a1c hlink!CExtensionService::Release+0x105d
02 00b73a28 3280da8e 1a068f28 00000000 00b73a88 hlink!HLNK::GetStringReference+0x5f
WARNING: Stack unwind information not available. Following frames may be wrong.
03 00b73a58 3a99fb87 08f74fd0 00000000 00b73a88 mso!Ordinal2575+0x1a7
04 00b73d70 77bf6d70 77cc74a8 19cd6ff0 00000000 oart!Ordinal5476+0x709
05 00b73d98 77c91c3a 000df3e0 00000060 14b90fa0 ntdll!RtlpPopEntrySListLockedAlt+0x20
06 00b73de8 32c8de4f 32195748 2fc48b8c 00000000 ntdll!RtlpStdLockRelease+0x14
07 00b73dec 32195748 2fc48b8c 00000000 00000000 mso!Ordinal1743+0x2f43
08 00b73df0 2fc48b8c 00000000 00000000 00000000 mso!MsoPvAllocCore+0x36
09 00b73df4 00000000 00000000 00000000 00b73c90 Excel!Ordinal40+0x108b8c

0x02 漏洞分析


由於輸入字串缺失結尾標誌符,從而導致讀取字串時讀取到了字串以外的記憶體資料,最終導致了該漏洞的產生。這個漏洞發生在hlink!WzDupWzToWz() 函式里,當該函式進行字串複製的時候產生了漏洞,成功利用該漏洞可導致資訊洩露。

首先我們看一下這個特製的XLS檔案,在偏移0x66C 和 0x140DC處分別不同,POC檔案和正常檔案在這兩處對比如圖:

p1 圖1 正常檔案和POC檔案在偏移0x66c處對比

p2 圖2 正常檔案和POC檔案在偏移0x140dc處對比

然後我們用工具Offvis來解析POC檔案如圖:

p3 圖3 POC檔案0x66c處解析

p4 圖4 POC檔案0x140dc處解析

從圖3我們看到,0x66C處對應的是ModifyTime域,實際上它不會導致漏洞產生,這裡我們忽略它。從圖4可以看到0x140dc處的 位元組D0對應complexData域。並且complexData是fopt (OfficeArtRGFOPTE)結構的一部分,OfficeArtRGFOPTE結構被微軟定義為:

p5 圖5 OfficeArtRGFOPTE結構

從上面的定義中,我們看不到complexData域包含特定的結構。

然後我們在windbg用如下方式設定斷點:

#!bash
bu hlink!HLNK::GetMonikerReference " .printf "GetMonikerReference:\n"; db poi(poi(esp+4)+0x4c);"

該斷點被斷幾次後你會看到如下除錯資訊:

p6

從上面除錯資訊可以看到,堆緩衝區0x16c52fe8處包含了complexData域的一部分。它指向一個沒有結束標誌符的寬位元組字串。

下面是hlink!HLNK::GetMonikerReference函式的部分程式碼,它呼叫 hlink!WzDupWzToWz() 函式來處理這個寬位元組字串。

p7

下圖是對函式hlink!WzDupWzToWz()的分析

p8 圖6 hlink!WzDupWzToWz()函式分析

總的來說,該問題是由於讀取輸入字串的時候,該字串沒有結束識別符號,從而讀取到了該字串記憶體以外的資料造成的。這個過程是 hlink!WzDupWzToWz() 函式進行字串複製操作的時候發生的。

庫檔案hlink.dll時用來處理超連結物件的。我們可以透過如下方式建立一個超連結來構造POC檔案:

p9 圖7 在XLS 檔案裡建立超連結

我們把它儲存為 test.xls,然後用 Offvis解析如下:

p10 圖8 新構造的EXCEL檔案解析

從上圖可以清楚第看到我們建立的超連結被儲存在了HLink 結構中,HLink結構被微軟定義如下:

p11

Hyperlink結構定義如下:

p12

p13

根據上面的定義,我們可以透過與HLink結構進行對比,來推斷complexData域的資料結構。上面構造的test.xls裡HLink結構如下:

p14

由此推斷complexData域資料內部結構如下(譯者注:這裡紅框中00 D0,可能應該是 00 00):

p15

我們修改hyperlinkBitFields欄位的值為 |08 00 00 00| ,修改HyperlinkString欄位的字串結束符NULL 為 |00 D0| 如圖:

p16

儲存後在WIN7 和WIN10裡測試,可以觸發漏洞。下圖是在WIN10裡的截圖:

p17

如上圖所示,開啟修改後的test.xls,可以看到hlink.dll並沒有被載入。然後點選超連結"test",這時候hlink.dll被載入,並觸發了漏洞,如圖:

p18

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章