精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于Windows 32k內核提權漏洞的攻防對抗

安全 漏洞
漏洞成功利用漏洞觸發、漏洞利用這兩大環節,而漏洞利用又有以下三個階段,分別是堆噴射階段、信息泄露階段、代碼執行階段。下面將結合CVE-2019-0808、CVE-2021-1732進行詳細闡述。

一、產生原因

1.1 Callback機制

Win32k組件最初的設計和編寫是完全建立的用戶層上的,但是微軟在 Windows NT 4.0 的改變中將 Win32k.sys 作為改變的一部分而引入,用以提升圖形繪制性能并減少 Windows 應用程序的內存需求。窗口管理器(User)和圖形設備接口(GDI)在極大程度上被移出客戶端/服務端運行時子系統(CSRSS)并被落實在它自身的一個內核模塊中。

wKg0C2Q1UZKAI9jFAAA8HhChBCU732.pngwKg0C2Q1UZKAI9jFAAA8HhChBCU732.png

這樣的設計無疑是為內核增添了一部分壓力,win32k.sys需要處理大量的用戶層回調,在這之后國外安全研究人員Tarjei Mandt公開了他對Win32k User-Mode Callback機制的研究成果,從此User-Mode Callback的攻擊面得到廣泛關注,UAF的漏洞也不斷的涌現。

下圖代碼為一個經典UAF漏洞,用戶層執行的某個函數通過syscall傳入到內核層,當內核代碼執行到xxxSomeCallback這一句時,用戶層可以在用戶定義的callback函數中獲得代碼執行的機會,如果用戶在callback函數調用了DestroyWindow函數銷毀窗口p,內核層的相應銷毀代碼將會被執行,p的相應內存被釋放,回調執行完畢,NtUserSysCall函數繼續執行,當執行到xxxSetWindowStyle(p)一句時,由于p的內存已經被釋放從而導致UAF漏洞的產生。

wKg0C2Q1UdGAG1l0AAB8AXXrrIM630.pngwKg0C2Q1UdGAG1l0AAB8AXXrrIM630.png

1.2 GDI對象

在TypeIsolation機制的引入之前,windows內核中以bitmap為代表的GDI對象成為內核漏洞利用時的首選,對于WWW漏洞來說,GDI對象就是它的“左膀右臂”,借助GDI對象可以很容易構造出穩定內核內存的任意地址讀寫原語,以此來繞過Windows的安全機制(KALSR、SMEP等)。

二、利用框架

漏洞成功利用漏洞觸發、漏洞利用這兩大環節,而漏洞利用又有以下三個階段,分別是堆噴射階段、信息泄露階段、代碼執行階段。下面將結合CVE-2019-0808、CVE-2021-1732進行詳細闡述。

2.1 漏洞觸發

漏洞的類型雖然五花八門,但基于win32k的內核漏洞是存在者一些共性的,也就是它的用戶層回調,近年來所爆出的win32k的漏洞,其觸發點大多都在用戶層回調被hook。下面將通過兩個案例來進行介紹。

案例1:

在CVE-2021-1732中,攻擊者正是hook xxxClientAllocWindowClassExtraBytes的用戶層回調函數,強行改變窗口對象tagWND的擴展數據的保存位置以及尋址方式,從而觸發一個任意地址覆蓋寫漏洞。

wKg0C2Q1UrqAce6UAACLexflaGQ178.pngwKg0C2Q1UrqAce6UAACLexflaGQ178.png

針對這種觸發方式,我們可以直接對用戶層的usertable進行檢測,usertable存在于PEB+0x58偏移處:

案例2:

CVE-2021-40449 是Win32k 的 NtGdiResetDC 函數中的一個釋放后使用漏洞,在執行其自己的回調期間針對同一句柄第二次執行函數 ResetDC 時觸發UAF漏洞。

wKg0C2Q1UuOAZdTrAACPaTgCZog116.pngwKg0C2Q1UuOAZdTrAACPaTgCZog116.png

針對這種觸發方式,可以通過開啟Driver Virifier進行檢測,UAF的漏洞再此環境下會觸發藍屏。

2.2 漏洞利用

漏洞成功被觸發僅僅是一個好的開端,更重要的是漏洞利用點的尋找過程。筆者將此過程大致劃分為信息泄露、堆噴射、原語構造、代碼執行這四個階段。

1.信息泄露階段

在win32k漏洞利用過程中,內核對象的泄漏是至關重要的。可以說成功利用一個漏洞的大前提就是獲取win32k內核對象的地址。

wKg0C2Q1U3aAYy0iAAEH1E9EANQ917.pngwKg0C2Q1U3aAYy0iAAEH1E9EANQ917.png

上圖是對Windows內核地址泄漏的總結(來自GitHub),表格中包含截止目前泄漏內核對象的各種技巧。下面也是拿兩個demo來闡述內核對象泄露的細節:

  • Demo1,通過GdiSharedHandleTable去泄露bitmap對象:

在R3通過CreateBitmap創建位圖成功后會得到一個hBitmap,如果要在R3去泄露該對象在內核中的地址可以通過GdiSharedHandleTable獲取。GdiSharedHandleTable位于PEB+0x94的位置。

wKg0C2Q1U5CAaWhkAAAepg2jbsk966.pngwKg0C2Q1U5CAaWhkAAAepg2jbsk966.png

GdiSharedHandleTable的本質是一個指向GDICELL結構體數組的指針。

wKg0C2Q1U6KAT7J1AAA0SxX9GE617.pngwKg0C2Q1U6KAT7J1AAA0SxX9GE617.png

同 CreateFile 類似,其實Windows 都用句柄(Handle)來標識用戶態對內核對象的引用。這個句柄低 16 位其實是數組索引。

wKg0C2Q1VAWAfZUXAAANNlwfltw725.pngwKg0C2Q1VAWAfZUXAAANNlwfltw725.png

通過上文,就可以計算出bitmap在內核中的地址。

wKg0C2Q1VBGAQck3AAAUsLBZxA641.pngwKg0C2Q1VBGAQck3AAAUsLBZxA641.png

  • Demo2,通過HMValidateHandle函數泄漏內核對象:

HMValidateHandle是微軟未公開的一個函數,憑借此函數可以通過傳入句柄獲取對于內核對象的地址(win32k對象)。HMAllocObject創建了桌面堆類型句柄后,會把tagWND對象放入到內核模式到用戶模式內存映射地址里。 為了驗證句柄的有效性,窗口管理器會調用User32!HMValidateHandle函數讀取這個表。函數將句柄和句柄類型作為參數,并在句柄表中查找對應的項。如果查找到對象, 會返回tagWND只讀映射的對象指針,通過tagWND這個對象我們可以獲取到句柄等一系列窗口信息。

該函數地址是通過R3的user32.dll!IsMenu函數獲取到的。

wKg0C2Q1VDaAOEifAABK7i13EFg646.pngwKg0C2Q1VDaAOEifAABK7i13EFg646.png

具體獲取方式如下:

wKg0C2Q1VEOAQ8crAADZGjJrmGw662.pngwKg0C2Q1VEOAQ8crAADZGjJrmGw662.png

2.堆(池)噴射階段

堆(池)噴射是進行內存布局的常用手段, 通過在分配關鍵的內核對象之前,首先分配和釋放特定長度和數量的其他對象,使內核內存首先處于一個確定的狀態,來確保在分配關鍵的內核對象時,能夠被系統內存管模塊分配到我們所希望其分配到的某些位置,例如接近某些可控對象的位置。攻擊者可利用此種方法構造完美的內存布局從而達到自己的目的。此技術沒有固定的方法(“因地制宜”),但是所要達成的目的比較一致--執行shellcode以及信息泄露。

案例1:

Bitmap對象的地址在RS1中是通過AcceleratorTable獲取到的。先申請大量的AcceleratorTable對象然后釋放其中一個,接著申請大小相等的bitmap對象。通過泄漏AcceleratorTable對象的地址,即可等到bitmap的內核地址。(內存大小計算方式將在下一章節進行詳細闡述)

wKg0C2Q1VFiAatRuAABZb8ZW9wQ135.pngwKg0C2Q1VFiAatRuAABZb8ZW9wQ135.png

代碼框架如下

wKg0C2Q1VGGAC6cqAACw29G8S0A729.pngwKg0C2Q1VGGAC6cqAACw29G8S0A729.png

3.RW原語構造階段

在win32k內核漏洞利用中,RW原語同樣扮演著重要角色。它可以對所分配的關鍵內核對象后面的內存區域進行操作,以控制原本不能控制的相鄰對象的成員數據,這些數據將作為后續利用操作的重要節點。

下面將對win32k漏洞常用到的讀寫原語進行介紹:

  • Bitmap系列:SetBitmapBits/GetBitmapBits可對內核對象bitmap的pvScan0指向的像素數據內存進行修改。

wKg0C2Q1VJ2AUPU9AAE36tbfPzk258.pngwKg0C2Q1VJ2AUPU9AAE36tbfPzk258.png

此系列一直到RS3微軟把Bitmap header與Bitmap data分離后,徹底失效。

  • Palette系列:GetPaletteEntries/SetPaletteEntries可對內核對象Palette的成員pFirstColor(指向4個bytes的數組PALETTENTRY)修改構造RW原語。

wKg0C2Q1VNWAAeetAAB4GMR5X8A958.pngwKg0C2Q1VNWAAeetAAB4GMR5X8A958.png

wKg0C2Q1VNqAACqeAACfThupnU170.pngwKg0C2Q1VNqAACqeAACfThupnU170.png

  • Wnd系列:SetWindowLog/SetWindowLogPtr對wnd(tagWnd)內核對象的修改能力。

應用場景1:

Wnd->StrName 字段是指向窗?標題名的指針,通過修改此變量,再借助?戶態下 的 InternalGetWindowText 和 NtUserDefSetText 函數則可實現任意內核地址讀寫

wKg0C2Q1VPWAP7o8AABRuCzwQr0810.pngwKg0C2Q1VPWAP7o8AABRuCzwQr0810.png

應用場景2:

a)申請兩個連續的Wnd對象(Spray),Wnd0與Wnd1

b)通過漏洞能力將Wnd0的pExtraBytes字段變為可越界讀寫的。

c)通過Wnd0.的越界寫入能力,修改tagWND1.pExtraBytes到指定地址

d)借助SetWindowLongPtr的修改能力,最后使Wnd1獲得任意地址寫入能力。

wKg0C2Q1VSeAbZPuAAAwYN3HNgQ077.pngwKg0C2Q1VSeAbZPuAAAwYN3HNgQ077.png

  • Menu系列(最新):GetMenuBarInfo,當其第二參數、第三參數分別設置成-3,1的時候,可以借助menu bar info獲取16字節的讀取能力。

wKg0C2Q1VTWATycRAACFCy5ktlM232.pngwKg0C2Q1VTWATycRAACFCy5ktlM232.png

一般僅需tagMenuBarInfo.rcBar.left 和 tagMenuBarInfo.rcBar.top讀取指定地址的8個字節的數據。

wKg0C2Q1VUCAPhNuAACdn1vLEPQ467.pngwKg0C2Q1VUCAPhNuAACdn1vLEPQ467.png

另外,通過GetMenuBarInfo構造Read Primitive時,需要提前構造Fake Menu(用戶層),再通過SetWindowLongPtr對Target Wnd的Menu(內核層)進行替換,以達到讀取地址可控的目的。

wKg0C2Q1VUuAd8KAACqSW0mBns734.pngwKg0C2Q1VUuAd8KAACqSW0mBns734.png

4.代碼執行階段

對于win32k內核漏洞,其最終利用方式就是本地提權,而提升權限的主要手法就是進行Token替換,共以下兩種方式:

  • Token指針替換(_EX_FAST_REF替換)

wKg0C2Q1VWKASYr9AAA52Kc5NjM556.pngwKg0C2Q1VWKASYr9AAA52Kc5NjM556.png

將當前進程 EPROCESS 中存儲的 Token 指針替換為 System 進程的 Token 指針。

wKg0C2Q1VW2AA6MzAACv5Wa8u5Q094.pngwKg0C2Q1VW2AA6MzAACv5Wa8u5Q094.png

wKg0C2Q1VXKALdlUAAEJvY13O8519.pngwKg0C2Q1VXKALdlUAAEJvY13O8519.png

  • Token中的成員替換

將當前進程 EPROCESS 的成員 Token 指針指向的 Token 塊中的數據替換成 System 進程擁有的 Token 塊的數據

wKg0C2Q1VYSAWQaSAABAUD69sOQ973.pngwKg0C2Q1VYSAWQaSAABAUD69sOQ973.png

將Present和Enabled的值更改為SYSTEM進程令牌的所有權限。

wKg0C2Q1VY2AK7OpAAA1U2FkTU378.pngwKg0C2Q1VY2AK7OpAAA1U2FkTU378.png

三、內核對象

3.1 Bitmap

簡介

GDI(Windows Graphics Device Interface),是windows為應用程序提供圖形、文字顯示的 API 接口。

Bitmap是GDI中的圖形對象,用于創建、操作(縮放、滾動、旋轉和繪制)并將圖像作為文件存儲在磁盤上,其實際上為一個二元數組,去存儲像素、顏色、大小等信息。

  • Bitmap關鍵結構體及對象

SURFACE對象(Bitmap在內核中的結構)

wKg0C2Q1VcKAYJpSAAAsz7rKY4c312.pngwKg0C2Q1VcKAYJpSAAAsz7rKY4c312.png

BaseObject,內核 GDI 對象類的基類都是一個稱作 _BASEOBJECT 的結構。對內核對象進行標記,用于描述最基礎的對象信息

wKg0C2Q1VdCASXVAAAlRzvaNM671.pngwKg0C2Q1VdCASXVAAAlRzvaNM671.png

SURFOBJ(Bitmap核心結構),用于控制位圖的大小,像素等信息。

wKg0C2Q1VdABlnSAABTSUqvvrg712.pngwKg0C2Q1VdABlnSAABTSUqvvrg712.png

  • CreateBitmap相關

wKg0C2Q1VgCAbkXoAAApoINYtcc373.pngwKg0C2Q1VgCAbkXoAAApoINYtcc373.png

創建具有指定寬度,高度和顏色格式(顏色平面和位每像素)的位圖,而前文中也提過bitmap在內核中關聯的對象SURACE,由SURACE通過CreateBitamp的前4個參數去精確控制分配的內核內存塊的大小。其調用鏈如下:

wKg0C2Q1VhSAUxAQAAB75owvyTw709.pngwKg0C2Q1VhSAUxAQAAB75owvyTw709.png

在GreCreateBitmap函數中,首先根據傳入的 cPlanes 和 cBitsPerPel參數確定位圖的像素位類型,然后創建一個DEVBITMAPINFO對象,通過CreateBitmap前四個參數去內存塊中申請一片內存并且設置位圖數據掃描線的長度。接著lpBits如果不為0,則通過GreSetBitmapBits去設置像素數據。

wKg0C2Q1Vh6AEDA3AABVoGSJSBo274.pngwKg0C2Q1Vh6AEDA3AABVoGSJSBo274.png

DEVBITMAPINFO的結構:

wKg0C2Q1VieADLBBAABGYsmlzbI562.pngwKg0C2Q1VieADLBBAABGYsmlzbI562.png

  • 掃描線

在 Windows 內核中處理位圖像素數據時,通常是以一行作為單位進行的,像素的一行被稱為掃描線,而掃描線的長度就表示的是在位圖數據中向下移動一行所需的字節數。

位圖數據掃描線的長度被存儲在SURFACE+0x34 字節偏移的成員(即 SURFACE->so.lDelta 成員)中。這樣一來,成員 pvScan0 將指向當前位圖 SURFACE 對象的像素點數據緩沖區的起始位置。在后續對位圖像素點進行讀寫訪問時,系統位圖解析模塊將以該對象的 pvScan0 成員存儲的地址作為像素點數據區域起始地址。

wKg0C2Q1VkiADXVeAABsg3IFe0151.pngwKg0C2Q1VkiADXVeAABsg3IFe0151.png

3.2 Palette

簡介

調色板是一個數組,其中包含標識當前可以在輸出設備上顯示或繪制的顏色的顏色值。調色板由能夠生成多種顏色但在任何給定時間只能顯示或繪制這些顏色的子集的設備使用。

Palette關鍵結構體及對象

PALETTE對象

wKg0C2Q1VuCAO8nAAE5zXPcDuQ249.pngwKg0C2Q1VuCAO8nAAE5zXPcDuQ249.png

PALETTE結構中,有三個成員是值得我們關注的分別是cEntries、pFirstColor、apalColors。cEntries指定當前調色板的項數,pFirstColor指向調色板列表起始表項(apalColors)的地址,apalColors是一個結構體數組存儲調色板列表數據。

PALETTEENTRY (調色板列表)

結構體 PALETTEENTRY 大小為 4 字節,其各個成員用于定義調色板表項對應的 24 位 RGB 顏色值等信息

wKg0C2Q1Vu6AZ8bAAApmXRjvG0967.pngwKg0C2Q1Vu6AZ8bAAApmXRjvG0967.png

Createpalette相關

wKg0C2Q1Vx2AOGL7AAAZ8CsH2YM553.pngwKg0C2Q1Vx2AOGL7AAAZ8CsH2YM553.png

Createpalette函數用來創建調色板對象,其只有一個參數lplgpl是指向LOFGPALETTE類型結構體對象的指針。定義如下:

wKg0C2Q1V4SACU02AABEui0D474872.pngwKg0C2Q1V4SACU02AABEui0D474872.png

這里我們僅需要關注第二個和第三個參數,palPalEntry是可變長度的 PALETTEENTRY 結構體類型數組,而palNumEntries來決定PALETTEENTRY 的個數。也就是說palette對象的大小是由palNumEntries控制的。

wKg0C2Q1V4ABNCAAAD39Rl4gy4172.pngwKg0C2Q1V4ABNCAAAD39Rl4gy4172.png

顯然,我們可以得出palette對象大小的計算方式:4 * cEntries + 0x90/PALETTE/

3.3Wnd

簡介

Windows是對象,它們同時具有代碼和數據,但它們不是C++ 類。 相反,程序通過使用名為句柄 的值來引用窗口。句柄是不透明類型。實質上它只是操作系統用來標識對象的數字。可以想象Windows創建的所有窗口都有一個大表。它使用此表按其句柄查找窗口。 (它內部的工作方式是否完全相同都很重要。) 窗口句柄的數據類型是 HWND, 這通常發音為"aitch-wind"。 窗口句柄由創建窗口的函數返回 :CreateWindow 和CreateWindowEx。

關鍵結構體及對象

這里只介紹tagWnd常用的字段,分別是tagwnd.cbwndextra和tagWND.ExtraBytes。當使用CreateWindowEx創建窗口時,可以在注冊窗口類時通過WNDCLASSEXA結構體中的cbWndExtra字段直接在內存中的tagWND對象之后請求額外的內存字節。

wKg0C2Q1ViAJvcjAAC9fUTdNWI133.pngwKg0C2Q1ViAJvcjAAC9fUTdNWI133.png

關鍵函數分析

  • CreateWindowEx

CreateWindowEx是用來創建窗口,在漏洞利用的世界中,Wnd地位是非常高的,可被用來進行堆spray,越界寫的容器等等。此次我們僅介紹Wnd的pExtraByte字段,分析它在內核中生成的過程。

wKg0C2Q1WEKAMR2AACNvR70g8412.pngwKg0C2Q1WEKAMR2AACNvR70g8412.png

上圖時CreateWindowEx到內核真正調用xxxCreateWindowEx函數的過程,xxxCreateWindowEx中回到tagWND的cbWndExtra字段進行判斷。

wKg0C2Q1WEyAUfiMAABVSsYn8w305.pngwKg0C2Q1WEyAUfiMAABVSsYn8w305.png

如果cbWndExtra不為0,則將其作為參數傳入xxxClientAllocWindowClassExtraBytes,在xxxClientAllocWindowClassExtraBytes中通過KeUserModeCallback進入到R3,最后調用RtlAllocateHeap為其在用戶層的桌面堆上申請一塊內存。

wKg0C2Q1WF6AaVL0AABDDmtkyk581.pngwKg0C2Q1WF6AaVL0AABDDmtkyk581.png

SetWindowLongPtr

對于SetWindowLongPtr函數,最重要的就是其對Wnd的修改能力,下圖xxxSetWindowLongPtr函數的部分反匯編代碼,可以看到當dwExtraFlag被設置為800后,可以直接對位于內核桌面堆的pExtraBytes+Index處的數據進行修改。

wKg0C2Q1WHCALoOMAABs2i1UgSE515.pngwKg0C2Q1WHCALoOMAABs2i1UgSE515.png

xxxSetWindowData

xxxSetWindowData函數可以對Wnd的spMenu進行替換,這是我們能夠利用Menu構造Read Primitive的先決條件。

wKg0C2Q1WIaAJ1E1AABtmMOgRZA040.pngwKg0C2Q1WIaAJ1E1AABtmMOgRZA040.png

獲取相鄰Wnd

相鄰的窗口中相差的只是一個tagWNDk結構體的大小

3.4Menu

簡介

菜單是為應用程序指定選項或選項組(子菜單)的項目列表。單擊菜單項打開子菜單或使應用程序執行命令。菜單管理也是win32k中最復雜得組件之一,其整體依賴多種十分復雜的函數和結構體。

Menu關鍵結構體及對象

tagMENU,

wKg0C2Q1WTOABfwBAADqVmnN14o150.pngwKg0C2Q1WTOABfwBAADqVmnN14o150.png

tagPOPUPMENU,

wKg0C2Q1WTyAWWZAADxjkmL5X8350.pngwKg0C2Q1WTyAWWZAADxjkmL5X8350.png

信息泄露能力

通過spMenu泄漏EPROCESS內核地址,用于尋找SYSTEM進程以及Token替換。

wKg0C2Q1WVeAdGtAABRE7Pewxc086.pngwKg0C2Q1WVeAdGtAABRE7Pewxc086.png

四、攻防進化史

漏洞只有能夠被成功利用,才可以體現出它的價值。而對于win32k內核漏洞,最經典也是利用率最高的類型就是“任意地址任意寫(WWW)”漏洞。本章節將圍繞“ArbitraryOverwrite”,對win32k提權利用方式的進化史以及微軟相應的緩解措施進行詳細闡述。

4.1 Win7下的利用模式

緩解措施

個人認為Win7是Win32k內核漏洞利用最理想的環境,因其具有以下幾點特征:

  • Win32k.sys未分離
  • 信息泄露的方式最多(目前已知技術均兼容win7)
  • 0頁內存機制未被緩解
  • Win32k 內核對象公開(成員偏移清晰)

綜上,可以更加確認一個win32k內核漏洞在win7的利用率是極高的。

利用思路

我們以“Bitmap”為例,介紹內核提權漏洞在win7上的利用方式:

前提:Arbitrary Memory Write漏洞

  • 創建兩個bitmap對象分別為hManager、hWorker,通過GdiSharedHandleTable泄露內核地址。
  • 利用任意地址覆蓋寫漏洞,將hManager的pvScan0修改為指向hWorker成員pvScan0的地址。

wKg0C2Q1Wa6AOjwRAAAOHNIDfM234.pngwKg0C2Q1Wa6AOjwRAAAOHNIDfM234.png

  • 構造對內核任意地址的RW原語(GetBitmapBits/SetBitmapBits)

wKg0C2Q1WbyAfWQ0AABWPadb8I609.pngwKg0C2Q1WbyAfWQ0AABWPadb8I609.png

  • 本地提權—令牌替換

操作第一個 hManager,可以替換第二個 hWorker->pvScan0地址,再通過第二個 hWorker來將system進程的token寫入當前進程。

wKg0C2Q1WdWAP4PiAAEcglZL8Y656.pngwKg0C2Q1WdWAP4PiAAEcglZL8Y656.png

4.2 RS1下的利用模式

緩解措施

GdiSharedHandleTable泄露bitmap的方式被緩解,GdiSharedHandleTable的pKernelAddress 指向一塊無意義的地址。

wKg0C2Q1WkSAW8wyAAGbgyaOwdY153.pngwKg0C2Q1WkSAW8wyAAGbgyaOwdY153.png

利用思路

結合網上資料,Windows 中存在著 3 種類型的對象,分別為 User object、GDI object、Kernel object,一共有 40 多種對象。

wKg0C2Q1WmaAJkNLAACzMzaa3VU995.pngwKg0C2Q1WmaAJkNLAACzMzaa3VU995.png

而bitmap屬于GDI object其存在于換頁會話池中,由于GDI object泄露地址方式在RS1版本中被緩解,因此我們需要從另外兩種類型對象中去尋找替代方案。此次我們使用的是Accelerator table其屬于User object并且也存在于分頁會話池中。

wKg0C2Q1WnKAdfZAAAidc8gxcU837.pngwKg0C2Q1WnKAdfZAAAidc8gxcU837.png

Tips:非分頁池的虛擬地址被物理地址分配,而分頁池對應的虛擬地址和物理地址不存在一一映射,只保證在當前執行會話有效,其余內核操作時,并不要求這些對象必須在內存中。

  • User Object地址獲取

在user32.dll中有一個全局變量gSharedInfo,其成員aheList為一個USER_HANDLE_ENTRY的句柄表。

wKg0C2Q1WoOACfYZAABH840fs30887.pngwKg0C2Q1WoOACfYZAABH840fs30887.png

該句柄表的具體結構如下所示,其第一個成員為pKernel作用GdiSharedHandleTable 中的 pKernel 一致,均指向object在內核中的位置(KernelAddress)。

wKg0C2Q1WoyAb2hWAAAOnVvZ8c916.pngwKg0C2Q1WoyAb2hWAAAOnVvZ8c916.png

因此可通過USER_HANDLE_ENTRY去泄露Accelerator table的內核對象地址。

KernelAddress= SHAREDINFO->USER_HANDLE_ENTRY->pKernel + handle&0xffff

  • Accelerator table 對象創建

函數 CreateAcceleratorTable 用來在內核中創建快捷鍵對應表。

wKg0C2Q1Wp2ATnvAAAXHn4ybg394.pngwKg0C2Q1Wp2ATnvAAAXHn4ybg394.png

該函數存在 LPACCEL lpaccl 和 int cAccel 兩個參數。參數 lpaccl 作為指向 ACCEL 結構體類型數組的指針,cAccel 表示數組的元素個數。結構體 ACCEL (szie=6)的定義如下:

wKg0C2Q1WqeARsSAAAA5BM3aN0c314.pngwKg0C2Q1WqeARsSAAAA5BM3aN0c314.png

  • 堆分水

通過1)、2)我們肯定可以想到通過內存分水技術去泄露bitmap內核對象的地址,經筆者分析得出可以控制CreateAcceleratorTable 的參數,來控制其到內核所申請內存的大小。

wKg0C2Q1WxKAGITMAABN5EuR2U269.pngwKg0C2Q1WxKAGITMAABN5EuR2U269.png

現在,bitmap和AcceleratorTable內核對象的大小均可控,可以進行內存布局。過程如下:

wKg0C2Q1Wx2AOixGAACSUNu5bg788.pngwKg0C2Q1Wx2AOixGAACSUNu5bg788.png

至此,我們就可以成功泄露bitmap內核對象的地址啦!

wKg0C2Q1W0iAdWGnAACTFPUjts242.pngwKg0C2Q1W0iAdWGnAACTFPUjts242.png

后續提權過程與win7一致。

4.3 RS2 下的利用模式

緩解措施

在RS2中pKernel指向異常地址, AcceleratorTable + 池風水泄露pvScan0的方式失效

利用思路

新的替代方案—桌面堆,更準確一點就在桌面堆上的lpszMenuName。lpszMenuName就是我們創建窗口時wndclass的成員,同bitmap一樣它也存于換頁內存池。

另外,我們還需知道桌面堆是有兩份分別存于用戶態和內核態。

wKg0C2Q1W4SAfnL5AABHHHDvfzk145.pngwKg0C2Q1W4SAfnL5AABHHHDvfzk145.png

上圖,在網上流傳的比較火,應該是國外某位大神逆出來,再此稍稍瞻仰一下。有了這個我們就可以通過桌面堆來泄露bitmap的內核地址啦。

  • 獲取lpszMenuName的地址.

首先,我們要得到內核態桌面堆到用戶態桌面堆的偏移值ulClientDelta。

wKg0C2Q1W52ATszxAAB0SOVOLXg150.pngwKg0C2Q1W52ATszxAAB0SOVOLXg150.png

通過HMValidateHandle泄露Wnd的內核地址,然后通過用戶態的tagCLS獲取lpszMenuName(0x98)的地址。

wKg0C2Q1W8OAL3mkAACdFHYmuE332.pngwKg0C2Q1W8OAL3mkAACdFHYmuE332.png

泄露結果如下所示:

wKg0C2Q1W86AKpsnAABZVdDesEE087.pngwKg0C2Q1W86AKpsnAABZVdDesEE087.png

  • 堆風水

到這,相信大家都知道可以通過桌面堆對象進行占坑,并控制lpszMenuName的大小與bitmap大小一致。即可成功泄露bitmap的內核地址。lpszMenuName申請內存過程堆棧如下,其大小為實際申請大小。

wKg0C2Q1WCAI0bvAAB69JVUyuc773.pngwKg0C2Q1WCAI0bvAAB69JVUyuc773.png

另外,BitMap的SurFace結構 在RS2上比RS1增大了10。

內存布局如下,申請等大小的lpszMenuName和bitmap。利用UAF技術確保泄露lpszMenuName的地址穩定之后使用bitmap占坑。

wKg0C2Q1WCALEPyAACLaCzLK00651.pngwKg0C2Q1WCALEPyAACLaCzLK00651.png

下圖來自fuzzySecurity的blog,精確的展現出通過lpszMenuName進行UAF后泄露bitmap的過程。

wKg0C2Q1WAWHyrAADIeqoA8bM878.pngwKg0C2Q1WAWHyrAADIeqoA8bM878.png

4.4 RS3 下的利用模式

緩解措施

微軟引入了 TypeIsolation 功能將Bitmap header與Bitmap data分離,無法通過Bitmap header取得pvscan0指針的內核地址。

利用思路

在第三章節介紹過另一個用于WWW漏洞利用的內核對象—Palette,它和bitmap有著異曲同工之妙,palette對象的0x90處是一個4字節的數組apalColors,相當于BitMap里的pixel data,pFirstColor是一個指針,指向apalColors,相當于BitMap里的pvScan0。

wKg0C2Q1XCaAB5nYAAATtJzGCek419.pngwKg0C2Q1XCaAB5nYAAATtJzGCek419.png

因此,我們完全可以按照在RS2中的利用思路,完成在RS3中的提權。

  • 創建兩個palette對象分別為hManager、hWorker,并通過桌面堆泄露內核地址。

wKg0C2Q1XLaAOI9AAAx7y9av8004.pngwKg0C2Q1XLaAOI9AAAx7y9av8004.png

泄露的方法還是采用池分水技術,利用lpszMenuName為palette占坑。

Palette大小的計算方式:LOGPALETTE->palNumEntries進行控制的,具體如下:

  • 利用任意地址覆蓋寫漏洞,將hManager的pFirstColor修改為指向hWorker成員pFirstColor的地址。

wKg0C2Q1XO6AR2yHAACUl66GW9A717.pngwKg0C2Q1XO6AR2yHAACUl66GW9A717.png

  • 構造對內核任意地址的RW原語(GetPaletteEntries/ SetPaletteEntries)

wKg0C2Q1XPyAWPaJAACkIwPXv2o616.pngwKg0C2Q1XPyAWPaJAACkIwPXv2o616.png

  • 提權-令牌替換(與bitmap方式一致)

wKg0C2Q1XReAP7maAADQpi2kHrQ470.pngwKg0C2Q1XReAP7maAADQpi2kHrQ470.png

4.5 攻防現狀

緩解措施

RS4:

HMValidateHandle泄露內核方法失效

Palette同樣被TypeIsolation進行header和body分離

RS5:

微軟修改大量API,桌面堆泄露的方法被緩解 。

2.新的思路

到這,已有的所有泄露GDI對象的方法均以被緩解。但車到山前必有路,這也正體現了攻防對抗的魅力,直到2021年CVE-2021-1732的漏洞被爆出,不同于傳統的內核漏洞,需借助“溢出”來完成漏洞利用,該漏洞是由于窗口類型混淆而導致的,通過spMenu的信息泄漏能力和借助GetMenuBarInfo/SetWindowLong函數構造讀寫原語(RW Primitive),最后通過純數據攻擊(DataOnlyAttack,特點不需要執行原語,只操縱操作系統使用的數據結構以實現提權)實現內核提權。

wKg0C2Q1XTAMRovAABXU0wGazI800.pngwKg0C2Q1XTAMRovAABXU0wGazI800.png

五、附錄

5.1參考鏈接

https://www.anquanke.com/post/id/235716#h3-4

https://mp.weixi2n.qq.com/s/6mT0O9eur5-VEs0rbV0-mg

https://github.com/gdabah/win32k-bugs/

http://fuzzysecurity.com/tutorials/expDev/21.html

https://www.wangan.com/p/7fygf309c52e2678

5.2環境介紹

靶場

HEVD的一個Windows Kernel Exploition訓練項目--HackSysExtremeVulnerableDriver

https://github.com/hacksysteam/HackSysExtremeVulnerableDriver

wKg0C2Q1XXiAPjCQAACoYoHRIJY361.pngwKg0C2Q1XXiAPjCQAACoYoHRIJY361.png

責任編輯:武曉燕 來源: ?FreeBuf.COM
相關推薦

2015-03-13 10:06:55

2022-03-10 09:41:15

漏洞Linux內核

2013-04-24 09:51:34

2020-11-16 10:55:41

Windows

2025-11-13 09:39:01

2013-11-29 15:34:00

2023-06-11 17:24:26

2021-05-01 20:52:30

漏洞網絡安全網絡攻擊

2022-03-09 13:25:21

臟管道Linux 內核漏洞

2017-04-17 20:08:19

2021-01-13 08:14:36

Windows提權漏洞攻擊

2010-12-10 15:23:49

Linux漏洞

2020-10-06 13:58:25

漏洞

2016-12-12 09:11:20

2025-04-18 10:17:47

2016-05-17 09:42:16

2014-06-09 09:19:10

2025-05-14 18:12:33

零日漏洞漏洞網絡攻擊

2018-07-05 10:44:09

Windows提權漏洞

2023-10-09 18:22:35

點贊
收藏

51CTO技術棧公眾號

日韩精品高清视频| 欧美性猛交xxxx黑人猛交| 91牛牛免费视频| 久久久久久久久久久网| 日韩欧美美女在线观看| 欧美日韩一区二区三区在线 | 国产精品一区二区99| 欧美日韩国产a| 无码粉嫩虎白一线天在线观看 | 国产黄色小视频在线观看| 亚洲久久一区| 久久九九亚洲综合| 在线免费观看日韩av| 日韩精品一级| 欧美日韩综合色| 俄罗斯av网站| 在线电影福利片| 国产三级三级三级精品8ⅰ区| 北条麻妃高清一区| 一区不卡在线观看| 鲁大师影院一区二区三区| 欧美xxxx综合视频| 五月激情四射婷婷| 亚欧日韩另类中文欧美| 日韩三级视频中文字幕| 午夜国产一区二区三区| 天天综合av| 一区二区三区在线观看国产| 亚洲人体一区| 成人高潮成人免费观看| 26uuu另类欧美| 岛国视频一区| av中文字幕免费在线观看| 日本亚洲三级在线| 欧美专区在线观看| 国产精品500部| 韩日精品在线| 久久在线视频在线| 国产免费美女视频| 久久综合电影| 最近2019年日本中文免费字幕| 无码人妻精品一区二区三区温州| 澳门成人av| 日韩一区二区免费高清| 精品亚洲视频在线| 免费视频观看成人| 欧美日韩一区成人| 少妇一级淫免费播放| 色天使综合视频| 色老汉一区二区三区| 亚洲色成人一区二区三区小说| 国产后进白嫩翘臀在线观看视频| 一区二区三区日本| 免费特级黄色片| 久久一卡二卡| 欧美日韩国产中文字幕| 久久精品免费一区二区| www.com.cn成人| 日韩欧美国产高清91| 日本成人在线免费视频| 日韩高清中文字幕一区二区| 色视频成人在线观看免| mm1313亚洲国产精品无码试看| 偷拍中文亚洲欧美动漫| 欧美无人高清视频在线观看| 日本中文字幕精品—区二区| 免费视频成人| 欧美电影免费提供在线观看| 日本美女视频网站| 亲子伦视频一区二区三区| 精品一区二区三区四区在线| 日韩视频在线观看免费视频| 国产精品国产三级国产在线观看| 久久久久北条麻妃免费看| 美国黄色小视频| 亚洲承认在线| 国产成+人+综合+亚洲欧洲| 一区二区乱子伦在线播放| 精品制服美女丁香| 国产精品免费视频一区二区 | 成人教育av在线| 欧美xxxx黑人又粗又长密月| 91网页在线观看| 亚洲精品日韩一| 国内自拍在线观看| 日韩av黄色| 精品国产一二三区| 国产精品成人无码免费| 欧美一区视频| 全亚洲最色的网站在线观看| 亚洲综合五月天婷婷丁香| 国产成人亚洲精品青草天美| 麻豆精品蜜桃一区二区三区| 午夜在线小视频| 亚洲国产一区二区三区青草影视 | 久久高清无码视频| 久久中文欧美| av一区二区三区四区电影| 日本中文字幕一区二区有码在线 | 国产性xxxx高清| 老司机免费视频一区二区| 国产高清自拍一区| 91高清在线| 午夜精品成人在线视频| 欧美男女交配视频| 日本久久成人网| 久久视频在线视频| 波多野结衣黄色网址| 国产91对白在线观看九色| 色噜噜色狠狠狠狠狠综合色一| 免费在线看污片| 欧美精品 国产精品| 喷水视频在线观看| 国模吧视频一区| 国产日韩欧美黄色| 美丽的姑娘在线观看免费动漫| 亚洲精品高清在线观看| 少妇一级淫免费放| 亚洲国产欧美日韩在线观看第一区| 久久国产精品久久久久久| 中国一级特黄视频| 久久色视频免费观看| 日韩一级片免费视频| 国产精品久久久久久久久久久久久久久| 亚洲欧美成人网| 日韩精品无码一区二区| 国产制服丝袜一区| 一区二区三区免费看| 久久夜夜操妹子| 亚洲精品小视频在线观看| 久久久久亚洲av无码专区 | 精品麻豆一区二区三区| 欧美最新大片在线看| 特级西西人体wwwww| 亚洲美女少妇无套啪啪呻吟| 99视频免费观看| 亚洲性图自拍| 日韩一区二区免费高清| 亚洲色图综合区| 国产乱人伦偷精品视频不卡 | 欧美一区在线视频| 国产白丝一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅 | av av在线| 伊人蜜桃色噜噜激情综合| 成人18视频| 男人添女人下部高潮视频在线观看 | 久久精品久久久久久国产 免费| 欧美日韩a v| 国产亚洲va综合人人澡精品| 精品久久久久久中文字幕2017| 国产一区99| 国产精品久久二区| 91福利在线视频| 欧美日韩国产电影| a级黄色片免费看| 成人永久免费视频| 国自产拍偷拍精品啪啪一区二区| 成人爽a毛片| 26uuu国产精品视频| 三级av在线播放| 在线精品国精品国产尤物884a| 麻豆精品免费视频| 老司机精品视频一区二区三区| 亚洲一区二区三区免费观看| 国产精品1区| 久久久久久久999| 午夜视频免费看| 91豆麻精品91久久久久久| 国产精品视频在| 国产成人在线观看免费网站| 夜夜添无码一区二区三区| 色婷婷精品视频| 国产精品十八以下禁看| 国产精品一区二区三区视频网站| 精品日韩欧美一区二区| 特级做a爱片免费69| 久久蜜桃av一区精品变态类天堂 | 久久综合社区| 国产97色在线|日韩| 黄色国产网站在线播放| 亚洲国产精品推荐| 最近中文字幕av| 亚洲激情成人在线| 精品人妻互换一区二区三区| 日韩精品视频播放| 欧美激情偷拍| 久久青青草原| 成人黄色91| 97超级碰在线看视频免费在线看| 北条麻妃在线| 亚洲精品在线观看视频| 亚洲大尺度在线观看| 亚洲美女区一区| 18禁裸乳无遮挡啪啪无码免费| 九色porny丨国产精品| 免费在线观看视频a| 日韩电影免费网址| 国产日韩欧美一区二区| 免费一级欧美在线观看视频| 97视频在线观看免费高清完整版在线观看 | 久热这里只有精品在线| 久久免费精品国产久精品久久久久| 中文字幕一区二区在线观看视频| 亚洲综合二区| 成人精品网站在线观看| 在线观看特色大片免费视频| 久久亚洲综合国产精品99麻豆精品福利 | 精品综合免费视频观看| 欧美性久久久久| 欧美亚洲不卡| 亚洲精品二区| 免费看成人吃奶视频在线| av一区二区三区免费| 亚洲男男av| 国产精品爽黄69天堂a| 蜜桃视频m3u8在线观看| 欧美另类xxx| 日韩精品成人av| 国产午夜精品视频| 性猛交xxxx| 精品嫩草影院久久| 国产女人18毛片水真多| 欧美三电影在线| 国产第一页在线观看| 午夜不卡av免费| 久久精品国产亚洲av麻豆色欲| 中文字幕一区二区三区在线播放 | 粉嫩av四季av绯色av第一区| 粉嫩一区二区三区在线观看| 国产精品狼人色视频一区| 唐人社导航福利精品| 欧美一区二区三区……| а√天堂中文资源在线bt| 欧美激情国产精品| av免费在线免费| 九九热这里只有精品免费看| 国产成人高清精品| 久久最新资源网| 超碰在线网址| 久久91亚洲精品中文字幕奶水 | 91成人在线视频| 538在线观看| 91干在线观看| 色一区二区三区| 国产成人免费91av在线| 免费成人直播| 国产精品久久久久秋霞鲁丝| 国产在线|日韩| 国产精品视频999| 亚洲18在线| 亚洲aa在线观看| 中文字幕av一区二区三区四区| dy888夜精品国产专区| 亚洲三级av| 韩国成人动漫在线观看| 日韩极品在线| 日本福利一区二区三区| 日韩欧美精品综合| 无码毛片aaa在线| 国产伊人精品| 超碰在线免费观看97| 欧美精品一区二区三区久久久竹菊| 精品无码av无码免费专区| 欧美三级在线| 国产美女三级视频| 免费成人你懂的| 丰满人妻一区二区三区大胸| 成+人+亚洲+综合天堂| 新91视频在线观看| 专区另类欧美日韩| 国产一级视频在线观看| 在线视频欧美精品| 国产免费黄色片| 精品精品欲导航| 国产一级网站视频在线| xvideos国产精品| 金瓶狂野欧美性猛交xxxx| 日本在线精品视频| 欧美.com| 欧美日韩综合网| 亚洲欧美伊人| 老熟妇仑乱视频一区二区| 国内欧美视频一区二区| www.免费av| 亚洲欧美日韩久久| 一级黄色大片视频| 日韩一区二区在线观看视频播放| 亚洲三区在线观看无套内射| 中文字幕日韩高清| 91色在线看| 91网站免费观看| 欧美精美视频| 99er在线视频| 免费成人av资源网| 日韩aaaaa| 亚洲精品中文在线| 国产成人麻豆免费观看| 亚洲成人久久一区| 免费在线你懂的| 日本欧美在线视频| 2020国产精品极品色在线观看| 日韩av一区二区三区在线观看| 狠狠干综合网| 亚洲天堂网2018| 久久久精品免费免费| 久久久久久福利| 欧美日本韩国一区| 四虎成人免费在线| 欧美第一黄网免费网站| 成人精品国产| 欧美日韩免费精品| 亚洲午夜av| 亚洲欧美激情一区二区三区| 中文幕一区二区三区久久蜜桃| 久草精品视频在线观看| 69久久夜色精品国产69蝌蚪网| 国产精品影院在线| 欧美在线视频导航| 牛牛影视一区二区三区免费看| 警花观音坐莲激情销魂小说| 青娱乐精品视频| 国产精品久久久久无码av色戒| 亚洲福利视频一区二区| 国产a级免费视频| 久久天天躁夜夜躁狠狠躁2022| 精品欧美日韩精品| 清纯唯美一区二区三区| 亚洲专区免费| 风间由美一二三区av片| 精品美女久久久久久免费| 后进极品白嫩翘臀在线视频| 欧美成人激情图片网| 精品国产一区二区三区2021| 91社在线播放| 国产综合色视频| 午夜精品一区二区三级视频| 欧美久久免费观看| 欧美成人三区| 91精品在线看| 欧美 日韩 国产精品免费观看| 中文字幕国产高清| 亚洲三级久久久| 午夜久久久久久噜噜噜噜| 欧美福利在线观看| 成人黄色av网址| 337p粉嫩大胆噜噜噜鲁| 91丨九色丨黑人外教| 日本特级黄色片| 国产亚洲精品久久久久久777| 成人日韩在线观看| 热re99久久精品国产99热 | 美女日批在线观看| 亚洲宅男天堂在线观看无病毒| 黄色www视频| 96精品视频在线| 国产99久久| 不卡中文字幕在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 草逼视频免费看| 97视频在线观看免费高清完整版在线观看| 天美av一区二区三区久久| 黄色国产小视频| 亚洲免费av高清| 五月天久久久久久| 国产精品xxx视频| 香蕉视频国产精品| 在线观看亚洲免费视频| 91福利精品视频| gogo在线高清视频| 狠狠色噜噜狠狠狠狠色吗综合| 三级精品在线观看| 成人免费黄色小视频| 亚洲第一男人av| www.成人在线视频| www成人免费| 久久―日本道色综合久久| 亚洲一级视频在线观看| 久久久久久久久久国产精品| 伊人久久大香线蕉综合网蜜芽 | 国产suv精品一区二区33| 日韩在线小视频| 日韩成人一级| 亚洲va在线va天堂va偷拍| 亚洲超碰精品一区二区| 国产在线91| 国产一区二区黄色| 免费在线看一区| xxxx 国产| 正在播放欧美一区| 国产精品xxx在线观看| 日本在线观看免费视频| 性做久久久久久免费观看| 男人在线资源站| 欧美一区二区高清在线观看| 国产精品一区二区久激情瑜伽| 精品人妻一区二区三区潮喷在线| 欧美成人精品激情在线观看| 久操精品在线| 日本精品一二三区|