<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>

    使用偽造對象繞過Intel CET

    VSole2022-10-18 11:04:37

    雖然數據執行保護(DEP)旨在阻止來自特定內存區域的純代碼注入攻擊,但道高一尺魔高一丈,攻擊者已經不再注入整個代碼的有效負載了,而是重新利用DEP允許的內存頁面中的多個代碼塊,稱為ROP gadget。這些代碼塊取自目標應用程序中現有的代碼,并鏈接在一起,以形成所需的攻擊者有效負載,或僅按頁禁用DEP,以允許運行現有代碼有效負載。

    為了永久阻止ROP攻擊,Intel開發了一種新的硬件強制控制流完整性緩解措施,稱為控制強制技術(CET),大約兩年前首次在Windows系統上發布。

    我們會在本文中簡要介紹CFI緩解措施的工作原理,包括CET,以及如何利用Counterfeit Object-Oriented Programming (COOP) 在最新Windows版本上有效繞過Intel CET。

    Forward-Edge和Backward-Edge CFI

    控制流完整性機制可以分為兩大類:Forward-Edge和Backward-Edge。

    與Microsoft CFG4一樣,Forward-EdgeCFI通過使用經過驗證的函數地址來保護間接函數調用。例如,如果我們用ROPgadget地址重寫CALL [rax]指令中解引用的指針,CFG將通過發出異常來阻止我們的攻擊。

    相反,像Intel的CET5這樣的Backward-EdgeCFI通過將函數的返回地址與存儲在Shadow Stack上的以前保存的地址版本進行比較來保護函數的返回地址。如果原始返回地址在內存被攻擊期間被重寫了,則地址對照( address comparison)將不可避免地失敗,應用程序將被終止。考慮到基于ROP的攻擊在沒有“CALL”指令的情況下執行“RET”指令,運行線程的堆棧和影子堆棧(shadow stack )值不匹配,因此像CET這樣的Backward-EdgeCFI有效地阻止了這種攻擊技術。

    Intel CET旨在通過間接分支跟蹤(IBT)通過影子堆棧和COP/JOP緩解ROP攻擊。然而,由于后一種技術尚未在Windows上實現,因此在本文中,我們將把“Intel CET”作為僅啟用影子堆棧的實現。

    CET當前的實現方式非常無效,因為渲染器進程通常會被利用。盡管CET在瀏覽器上還沒有得到廣泛的執行,但我們應該期待它在未來的每一個進程中都得到執行。

    偽造對象

    Felix Schuster在2015年提出了一種名為偽面向對象編程(COOP)的新代碼重用技術。不過該技術尚未在野外或公開利用被發現。我們寫這篇博文的目的是試圖利用這種理論方法,并在概念驗證中加以實現,以繞過Intel CET。

    該技術背后的主要思想是偽造,即用攻擊者控制的有效負載在內存中生成新的對象,并通過目標應用程序或加載庫中已經存在的虛擬函數將它們鏈接在一起。

    偽對象中包含的每個虛擬函數稱為vfgadget,負責執行一個小任務。與ROP類似,vfgadget可以執行諸如將值填充到寄存器中之類的任務。然而,當組合在一起時,多個vfgadget可以執行更高級的操作。

    由于目前沒有專門的工具可以發現vfgadget,所以可以通過自定義腳本(如idpython)找到它們,使用類似于ROP gadget發現的過程。

    由于vfgadget是從CFG有效函數池中選取的,我們可以將它們標記為合法的,一旦我們劫持了其中一個函數的間接調用,它們的執行就不會被CFG阻止。

    此外,一個有趣的推論是Intel CET不會被觸發,因為我們不會在順序調用vfgadget的過程中損壞任何函數返回地址。

    一個典型的COOP有效載荷從一個充當COOP主要功能的基本vfgadget開始。我們在本文稱之為Looper。一旦攻擊者在內存中集成了偽造對象,Looper vfgadget就會遍歷由攻擊者精心安排的其他vfgadget數組,這些vfgadget將被逐個調用。通過以這種方式對齊偽對象中的vfgadget,我們將能夠以可控的方式調用有效的虛擬函數。

    Looper運行后,它可以調用其他負責執行特定操作的vfgadget,如Argument Loaders Invoker和Collector。這些vfgadget將定期存儲在Looper訪問的數組中。

    Argument Loader vfgadget通過將值加載到給定寄存器中來填充該寄存器。要加載的值將存儲在偽對象中,位于假對象開始處的偏移位置。

    一旦寄存器被一個或多個參數加載器填充,就可以調用Invoker vfgadget來簡單地執行目標API的函數指針。

    Collector是一種gadget,用于檢索寄存器中已存在的值,并將其保存回攻擊者的偽造對象即作為從調用的API返回的值。

    下圖總結了迄今為止討論的COOP攻擊策略。

    COOP攻擊流

    我們可以根據不同的vfgadget的可用性和想要執行的API來安排和混合它們。

    為了更好地理解COOP攻擊,讓我們從分析主vfgadget Looper開始。以下匯編代碼提供了Looper COOP vfgadget的簡化版本:

    Looper Gadget相關的ASM代碼

    在第一行中,RCX持有this9指針,我們將偽對象的開頭加載到RBX中,該偽對象位于RCX的偏移量0x40處。由于偽對象中的所有項目都將以偏離此指針的偏移量為準,因此我們需要確保在劫持程序流之前保存其值(即通過破壞vtable)。

    然后,COOP有效負載基址被解引用到RAX中,RAX指向被調用的第一個vfgadget。一旦調用返回,一個新的vfgadget將從前一個gadget的偏移量0x20處加載,如果RBX的內容不為零,則會進行新的循環迭代。

    當在內存中寫入偽造對象時,我們需要預先對齊每個vfgadget以匹配Looper偏移量,類似于下面的布局:

    內存中的COOP緩沖區

    這樣,00000227`26cd8900是COOP有效負載的基址,它存儲在‘this’指針(RCX)的偏移量0x40處。從前面的代碼清單中,我們注意到在_loopstart例程的第一行,指針被解引用到RAX中,而RAX又指向第一個vfgadget。在下一次循環迭代中,Looper通過在前一個循環的偏移量0x20處加載指針來重復相同的任務,并最終調用第二個vfgadget。

    當利用真實的目標瀏覽器時,建議依賴Looper vfgadget,因為它比其他vfgadget提供了更多的控制和穩定性。但是,為了簡潔起見,我們在編寫易受攻擊的應用程序時只使用了一個Invoker vfgadget,它只接受一個參數。

    在介紹了COOP的基本理論之后,讓我們繼續開發一個由CET編譯的概念驗證應用程序,該應用程序是我們為展示COOP攻擊而開發的。

    與COOP繞過CET影子堆棧

    我們編寫的易受攻擊的應用程序是用CET和CFG以及默認啟用的DEP編譯的。

    首先,為了驗證CET是否真的被強制執行,我們在printf上放置一個斷點,檢查調用堆棧,覆蓋返回地址并恢復執行。

    驗證CET的執行

    當收到一個涉及無效返回地址的Shadow Stack異常提示,就代表CET被啟用了。

    由于CET是一種硬件強制緩解,為了觸發上述漏洞,我們至少需要一個英特爾虎湖( Tiger Lake )十一代酷睿 CPU。

    為了模擬瀏覽器漏洞,我們可以利用執行應用程序時自動觸發的應用程序中的類型混淆漏洞來獲得RIP控制。

    當我們點擊該漏洞的觸發器時,vtable指針會被我們的輸入損壞,導致我們可以控制的間接調用。然后我們劫持vtable,使其指向第一個(也是唯一一個)vfgadget所在的COOP緩沖區。如上所述,為了簡潔起見,我們沒有使用帶有嵌套vfgadget的Looper,而是選擇使用一個同時具有Invoker和Argument Loader組件的gadget。

    作為該漏洞自動利用的一部分,為了獲取vfgadget的‘this’指針,我們泄漏了堆棧指針,并將‘this’指針作為堆棧的靜態偏移量進行檢索。

    一旦我們獲得了‘this’指針地址,我們就準備好要調用的WindowsAPI的地址及其參數。這是通過在偽對象內以所需偏移量寫入Windows API地址和參數來實現的。

    在更詳細地研究COOP有效負載之前,讓我們先通過不帶任何參數運行PoC來理解它的語法。

    獲取PoC的語法

    應用程序接受四個參數:一個指向偽造對象(COOP)緩沖區的指針、vfgadget地址、Windows API地址及其參數。該助手顯示了兩個簡單的用例,但可以將其擴展為調用任何CFG允許的API(如果應用程序是用它編譯的)。

    由于Windows DLL將在隨機基址加載,因此需要預先計算所需的API地址。

    讓我們首先檢查與vfgadget相關的對象的C++代碼,然后從編譯的二進制文件探索其相應的程序集:

    我們從中派生vfgadget的' trigger '方法

    項目中的OffSec類包含一個觸發器方法,它充當一個C風格的函數指針,我們可以使用它來調用任何我們喜歡的API。然后,在主程序例程中實例化“OffSec”類,以便將其與方法一起加載到內存中。

    仔細查看反匯編程序中的Invoker可以發現一些有趣的方面。

    調用程序vfgadget

    從第二行到第四行,RCX引用的‘this’指針首先存儲在堆棧中,然后移動到RAX中。接下來,從RAX偏移量0x10處的值被解引用并移動到RAX中。此值將是駐留在偽對象中的API函數指針。然后,在第7行和第8行,第一個函數參數從‘this’指針偏移量0x8處解引用,并移到RCX中。

    我們很快就會發現,一旦我們從命令行提交了參數,易受攻擊的應用程序就會處理這些偏移。

    在介紹了攻擊鏈的主要構建塊之后,讓我們嘗試通過傳遞四個參數來運行PoC,以獲得代碼執行:

    運行帶有所有參數的PoC應用程序

    通過上述命令,我們提供了以下參數:00001e000000作為偽對象的存儲緩沖區,5086014001000000作為Invoker vfgadget,40610fecfb7f0000是WinExec內存地址。作為最后一個參數,我們傳遞WinExec字符串參數。請注意,所有內存地址都是以little-endian格式傳遞的。

    一旦啟動,應用程序立即停止,允許我們將調試器附加到它。在這樣做之前,我們啟動Process Explorer以驗證二進制文件實際上在啟用Intel CET的情況下運行。

    驗證是否已使用Process Explorer啟用CET

    在“堆棧保護”欄下,Process Explorer確認僅對CET兼容模塊強制執行CET,這意味著將對使用CET編譯的任何模塊強制執行緩解。附加調試器后,我們將斷點放置到主函數中唯一的間接調用,然后繼續執行。

    間接調用時中斷

    我們在main+0x3d2處放置了一個斷點,并驗證了在該地址確實有一個間接調用。接下來,我們將轉儲位于靜態地址0x1e0000的偽造對象的內容,該地址包含指向位于0000000 1400186a0的vfgadget的指針。

    在main+0x3d2是類型混淆錯誤引發的地方,允許我們控制RIP。一旦到達斷點,我們就檢查駐留在COOP緩沖區中的值,它應該是第一個Invoker vfgadget。我們讓應用程序繼續運行,并驗證我們確實達到了斷點。

    登錄第一個COOP vfgadget

    在跟蹤到CFG ldrpdispatchusercalltarget例程之后,我們跳轉到Invoker vfgadget ' OffSec::trigger ',證明我們已經控制了程序的執行流。然后我們繼續在vfgadget中進行跟蹤:

    將 ‘this’ 指針移動到RAX中

    在上面的清單中,Invoker首先將‘this’指針從RCX保存到堆棧中,我們還驗證它是否指向COOP緩沖區的底部。在最后一條指令中, ‘this’ 指針被加載到RAX中,RAX將用作調用API及其參數的引用:

    通過‘this’ 指針加載WinExec參數

    首先,在偏移量0x10處,我們可以看到WinExec地址被加載到RAX中,然后,在三條指令之后,命令參數被檢索到偏移量0x8處。

    如果執行繼續,我們將再次調用LdrpDispatchUserCallTarget,它依次將執行分派給WinExec。

    成功調用WinExec

    這就完成了我們的簡單概念證明,我們介紹了通過調用CFG允許的函數,同時避免損壞任何返回地址,可以繞過Intel CET Shadow Stack并通過COOP攻擊獲得任意代碼執行。

    此PoC應用程序的Visual Studio項目可以在這個URL中找到。

    總結

    Intel CET提供了另一種強大的防御機制,盡管如此,攻擊者可以采用新的攻擊途徑,如COOP來繞過這種緩解措施。

    偏移量函數指針
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    TP-LINK 型號為 TL-WR841N V10 的路由器設備上的漏洞被分配 ID CVE-2020-8423。該漏洞允許經過身份驗證的攻擊者通過向 wifi 網絡配置發送 GET 請求來遠程執行設備上的任意代碼。
    C和C++向來以“let the programmer do what he wants to do”的貼近底層而為廣大開發者所喜愛。
    shellcode loader的編寫
    2023-04-17 11:15:39
    改變加載方式指針執行#include?參數1:分配的內存的起始地址,如果為NULL則由系統決定。參數2:分配的內存大小,以字節為單位。參數3:分配的內存類型,MEM_COMMIT表示將分配的內存立即提交給物理內存,MEM_RESERVE表示保留內存但不提交。參數4:分配的內存保護屬性,PAGE_READWRITE可讀可寫,PAGE_EXECUTE_READ可執行可讀。結構體的指針,用于指定新線程的安全屬性,NULL表示默認安全屬性
    可在其中找受影響的版本復現,在受影響版本的系統中找到win32k.sys導入IDA。漏洞函數位于win32k.sys的SetImeInfoEx()函數,該函數在使用一個內核對象的字段之前并沒有進行是否為空的判斷,當該值為空時,函數直接讀取零地址內存。如果在當前進程環境中沒有映射零頁面,該函數將觸發頁面錯誤異常,導致系統藍屏發生。tagWINDOWSTATIONspklList對象的結構為:漏洞觸發驗證查看SSDT表dd KeServiceDescriptorTabledds Address L11C 顯示地址里面值指向的地址. 以4個字節顯示。
    CET當前的實現方式非常無效,因為渲染器進程通常會被利用。不過該技術尚未在野外或公開利用被發現。偽對象中包含的每個虛擬函數稱為vfgadget,負責執行一個小任務。一個典型的COOP有效載荷從一個充當COOP主要功能的基本vfgadget開始。我們在本文稱之為Looper。驗證CET的執行當收到一個涉及無效返回地址的Shadow Stack異常提示,就代表CET被啟用了。
    BEServer - BattlEye服務器,收集上傳的信息,并判定作弊行為。本次分析的是BEDaisy,也就是BE內核驅動中的各種檢測。上傳的內容主要是一些黑名單特征,這些特征應該是從服務器下發的,因此可以在不重新編譯驅動的情況下,動態調整檢測的特征。沒有給定偏移量的特征,BE在檢測時會按子串匹配的方式嘗試所有位置進行匹配。
    關于MIPS架構的寄存器及指令集請自行查閱資料,這里就不多作介紹了。,則也會在prologue處保存下來,并在epilogue處取出。流水線指令集相關特性MIPS架構存在“流水線效應”,簡單來說,就是本應該順序執行的幾條命令卻同時執行了,其還存在緩存不一致性(cache
    前言本文主要著眼于glibc下的一些漏洞及利用技巧和IO調用鏈,由淺入深,分為 “基礎堆利用漏洞及基本IO攻擊” 與 “高版本glibc下的利用” 兩部分來進行講解,前者主要包括了一些glibc相關的基礎知識,以及低版本glibc下常見的漏洞利用方式,后者主要涉及到一些較新的glibc下的IO調用鏈。
    目前Linux內核代碼已經達到了2700萬行量級[2],僅每年通報的Linux內核漏洞就多達數十個。Linux內核主要使用C語言編寫,由于C語言不是類型安全語言,而且偏底層,所以各種內存破壞類漏洞層出不窮。攻擊者利用內核漏洞可以達到本地提權的目的。容器技術本身依賴于Linux內核提供的Namespaces和Cgroups機制,利用內核漏洞,攻擊者可以繞過Namespaces對資源的隔離,達到逃逸的
    攔截Windows關機消息
    2023-03-20 10:08:53
    因為winlogon進程是system級別進程,所以要讓注入進程已管理員方式啟動,并使能SeDebugPrivilege權限,這樣才可以注入system進程。 而在 Windows 10 1809 x64中,winlogon進程是在延遲導入表中引用了User32模塊的ExitWindowsEx函數。所有進程都處理完成后,第一次調用的ExitWindowsEx函數就返回TRUE了,否則返回FALSE。通過上面的知識,我們可以選擇在Winlogon進程第二次調用ExitWindowsEx前,進行攔截,可以彈窗提示告知用戶即將關機,或者顯示其它消息。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类