<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    原文地址:http://drops.wooyun.org/tips/10901

    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怎么枚舉屬性和方法?有一個通用的方法,詳細表示如下:

    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接口提供了對這個接口中的成員函數、成員變量、通用屬性(是否定義了一個結構體,一個接口等等)。

    由于COMRaider也是開源的,你也可以下載它的代碼,并查看它的具體實現方式。

    97av