<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址: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也是開源的,你也可以下載它的代碼,并查看它的具體實現方式。

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线