IE安全系列之——IE中的ActiveX(II)

wyzsk發表於2020-08-19
作者: blast · 2015/12/04 10:21

0x00 使用Fuzz工具


ActiveX的Fuzzer相當之多,本次我們暫時使用一個老牌但是效能較弱的開源Fuzzer:COMRaider。選擇它的原因是它是一個圖形化的Fuzzer,介面元素簡單。但是說弱則是因為它的測試用例實在太少,而且比較陳舊(但是你可以手動新增)。比它強悍的工具還有很多,例如AxMan Fuzzer,但是AxMan的介面實在是沒法截圖,所以我還是用這個來演示好了……

COMRaider可以在https://github.com/dzzie/COMRaider下載到。安裝開啟後COMRaider的介面如下圖所示。開始按鈕完美地隱藏到了右邊,和背景融為一色。

p1

點選Start之後即可開始Fuzz的第一步——選擇ActiveX。在這裡我們選擇“Choose from controls that should be loadable from IE”。

p2

然後右鍵選擇Scan New。在列表裡面挑選一個你看不順眼的外掛,然後點選“Select”按鈕即可檢視到該外掛的詳細資訊。

p3

新彈出的視窗中可以檢視到該ActiveX的所有方法和屬性。記得點選“Show only fuzzable”,把它前面的勾去掉。在列表左邊顯示的灰色內容是不能fuzz的,黑色內容是可以fuzz的。可以看得出來:凡是無引數傳入的方法,COMRaider均Fuzz不了。

p4

新彈出的視窗中可以檢視到該ActiveX的所有方法和屬性。記得點選“Show only fuzzable”,把它前面的勾去掉。在列表左邊顯示的灰色內容是不能fuzz的,黑色內容是可以fuzz的。可以看得出來:凡是無引數傳入的方法,COMRaider均Fuzz不了。

p5

是的,你編輯的檔案是VBScript檔案,所以一切請遵守VBS的語法。至於為什麼要用VBS,COMRaider釋出第一版的時候(時代的眼淚)VB還是很流行的,以至於COMRaider都是VB寫的。

例如,我們向Long Args加入parent.lngs.add 65535,這樣在Fuzz Long型別的引數的時候65535就會作為一個testcase被使用。

p6

0x01 如何測試邏輯問題


本節我們只介紹使用COMRaider來挖掘邏輯漏洞並編寫PoC。以此控制元件為例。

Loaded File: F:\Windows\SysWOW64\QoePlug.ocx
Name:        QOEPLUGLib
Lib GUID:    {15144D65-D22E-4768-8980-7411EF722FDE}
Version:     1.0
Lib Classes: 1  

Class QOEPLUG
GUID: {B2F9A248-3AB5-493F-A7F8-5B7A9D026ED2}
Number of Interfaces: 1
Default Interface: _DQOEPLUG
RegKey Safe for Script: True
RegKey Safe for Init: True
KillBitSet: False

它包含如下方法和屬性:

Interface _DQOEPLUG : IDispatch
Default Interface: True
Members : 43
    strOsName
    strCpuName
    strNetLoad
    strCpuUsage
    strMemSize
    strMemUsage
    strProxyServer
    strDnsServer
    strNumComputer
    strTraceInfo
    strProcessInfo
    strKillPid
    strDnsName
    strConnectIp
    strUrl
    strMultiDownLoadUrl
    strDnsTime
    strConnectTime
    strUrlTime
    strMultiDownLoadResult
    strVersion
    strDownloadUrl
    strDownloadTime
    GetOsName
    GetCpuName
    GetNetLoad
    GetCpuUsage
    GetMemSize
    GetMemUsage
    GetProxyServer
    GetDnsServer
    GetNumComputer
    GetTraceInfo
    GetProcessInfo
    KillProcId
    GetDnsTime
    GetConnectTime
    GetUrlTime
    GetMultiDownLoad
    StartMultiDownLoad
    StopMultiDownLoad
    GetVersion
    GetDownloadTime

點選其中一項可以看到該項的定義。

p7

COMRaider在展示資訊的時候,顯示的方法名也是VB模式的,如果你用過VB那還好,沒用過的話只需要大致記得這樣的模式即可:

Sub 函式名(引數名 As 型別名, 引數名2 As 型別名2 ……) 
Function 函式名(引數名 As 型別名, 引數名2 As 型別名2 ……)  As 返回值型別

Sub對應一個沒有返回值的方法,大致等同於C++裡面的void 函式名(型別名 引數名,型別名2 引數名2……)

Function對應一個有返回值的函式,大致等同於C++裡面的返回型別 函式名(型別名 引數名,型別名2 引數名2……)

如果一項是可以Fuzz的,我們可以右鍵點選選擇Fuzz member,或者直接Fuzz Library,這將會Fuzz它的所有成員。

p8

COMRaider使用Windows Scripting Host來Fuzz,生成的檔案是wsf型別的(WSF是含有XML程式碼的文字文件)。COMRaider生成的testcase結構類似如下,所以如果看到外面某個漏洞PoC的程式碼出現了熟悉的引數名和程式碼風格,那不用想,肯定是COMRaider的功勞:)。

#!xml
<?XML version='1.0' standalone='yes' ?>
<package><job id='DoneInVBS' debug='false' error='true'>
<object classid='clsid:B2F9A248-3AB5-493F-A7F8-5B7A9D026ED2' id='target' />
<script language='vbscript'>    

'File Generated by COMRaider v0.0.134 - http://labs.idefense.com    

'Wscript.echo typename(target)  

'for debugging/custom prolog
targetFile = "F:\Windows\SysWOW64\QoePlug.ocx"
prototype  = "Invoke_Unknown strDownloadTime As String"
memberName = "strDownloadTime"
progid     = "QOEPLUGLib.QOEPLUG"
argCount   = 1  

arg1=String(3092, "A")  

target.strDownloadTime = arg1   

</script></job></package>

透過右鍵點選testcase,然後選擇Test Exploit in IE可以在IE中測試對應程式碼。也可以手動處理生成可在ie載入的程式碼。如上述程式碼,掐頭去尾取中間就可以了:

#!xml
<object classid='clsid:B2F9A248-3AB5-493F-A7F8-5B7A9D026ED2' id='target' />
<script language='vbscript'>
arg1=String(3092, "A")
target.strDownloadTime = arg1
</script>

COMRaider基本不能驗證邏輯漏洞,因此在挖掘的時候需要人工介入。以GetCpuName為例,雖然這是一個無返回值的方法,但是我們同樣看到了這個ActiveX還有一個strCpuName的屬性,讓我們將這兩個串聯起來。

p9

PoC:

#!xml
<object classid='clsid:B2F9A248-3AB5-493F-A7F8-5B7A9D026ED2' id='target' />
<script language='vbscript'>
target.GetCpuName
alert(target.strCpuName)
</script>

在IE中驗證一下,可以發現CPU挺老的了,該換電腦了。

p10

0x02 Fuzzer怎麼知道ActiveX資訊的?


Fuzzer怎麼列舉屬性和方法?有一個通用的方法,詳細表示如下:

  • 先CoCreateInstance建立一個例項,查詢其IObjectSecurity介面;
  • 如果實現了這個介面,查詢是否設定了Safe for init和Safe for script位,這個是它待會兒要寫到測試的配置裡面去的;
  • 呼叫IDispatch中的GetTypeInfo獲取ITypeInfo介面用來展開相關的內容;

MSDN表示: The ITypeInfo interface provides access to the following: The set of function descriptions associated with the type. For interfaces, this contains the set of member functions in the interface. The set of data member descriptions associated with the type. For structures, this contains the set of members of the type. The general attributes of the type, such as whether it describes a structure, an interface, and so on.

簡單的說就是ITypeInfo介面提供了對這個介面中的成員函式、成員變數、通用屬性(是否定義了一個結構體,一個介面等等)。

  • 對TypeInfo呼叫GetDocumentation獲取函式數量,然後對各個函式呼叫GetFuncDesc獲取函式描述,然後這裡就可以獲得函式名,返回值,引數數量和引數。

由於COMRaider也是開源的,你也可以下載它的程式碼,並檢視它的具體實現方式。

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

相關文章