1. 程式人生 > >CVE-2018-8120 漏洞分析

CVE-2018-8120 漏洞分析

CVE-2018-8120

詳細分析漏洞描述

Microsoft Windows 7 SP1、Windows Server 2008 SP2和Windows Server 2008 R2 SP1都是美國微軟(Microsoft)公司的產品。Microsoft Windows 7 SP1是一套供個人電腦使用的操作系統;Windows Server 2008 SP2是一套服務器操作系統。R2 SP1是它的升級版。

Microsoft Windows中存在提權漏洞,該漏洞源於Win32k組件NtUserSetImeInfoEx函數內部SetImeInfoEx函數的沒有正確的處理內存中的空指針對象。攻擊者可利用該空指針漏洞在內核模式下以提升的權限執行任意代碼。

技術分析分配零頁內存技術

平時用malloc、new之類的函數會在RtlAllocateHeap已經分配好的堆中申請一塊出來,內存不夠的時候才會使用ZwAllocateVirualMemory,使用ZwAllocateVirualMemory分配內存的時候參數BaseAdress指定為0時系統會尋找第一個未使用的內存,並且指定參數為0時會分配失敗,但參數AllocateType可以指定MEM_TOP_DOWN類型,表示從上向下分配內存。如果指定參數BaseAddress為1,同時指定分配的內存頁大小小於一個內存頁的長度(如小於8192),分配成功之後地址範圍就是 0xFFFFE001(-8191) 到 1把0地址包含在內。如果現在直接向0xFFFFE001寫入數據會發生異常,因為從0x80000000-0xffffffff是供系統內核空間使用的內存,但是可以直接向0指針地址寫入數據。POC首先創建了一個零頁內存地址用來存放數據結構。

技術分享圖片

HMValidateHandle 內核對象tagWND地址泄露技術

攻擊者可以使用HMValidateHandle 功能來泄漏一個內核結構tagWND在內核中的地址,這種技術應該屬於內核信息泄漏範圍。接著創建了一個窗口,然後使用HMValidateHandle 功能查找tagWND在內核中的地址。其接收變量類型PTHRDESKHEAD(tagWND的第一個參數)在下面講。

技術分享圖片

構造NtUserSetImeInfoEx帶有攻擊性的參數

NtUserSetImeInfoEx有一個參數,是一個tagIMEINFOEX結構,這個結構是輸入法的擴展信息。這個參數是通過把前面泄漏的tagWND的內核對象覆蓋到構造的帶攻擊性的tagIMEINFOEX參數。tagWND參數有0xB0的字節,tagIMEINFOEX有0x158的字節,覆蓋過程中為了避免拷貝與tagWND對象無關的越界內存中,使用RegisterClassExW註冊窗口時指定總長度超過tagIMEINFOEX長度的大小。

技術分享圖片

內核對象tagWND的第一個參數是THRDESKHEAD類型變量head,head->pSelf指向一個在內核全局存在的窗口對象。tagWND->THRDESKHEAD的成員h指定了所屬進程的窗口句柄。

技術分享圖片

tagWND->lpfnWindowProc包含了與該窗口相關聯的窗口消息處理。為了在用戶的上下文中執行該函數,內核會選擇降低權限,也能提升權限,這個行為由tagWND->bServerSideProc標記。下面是NtUserSetImeInfoEx函數內部對參數進行拷貝,並展示了各種結構對應的關系。

技術分享圖片

tagWND->_THRDESKHEAD的成員head,_THRDESKHEAD->h指向窗口對象句柄,偏移0x14的成員bServerSideProc被標記,意味著提權。

技術分享圖片

tagIMEINFOEX的hkl指向輸入法的窗口對象句柄,第二個成員為tagIMEINFO。

技術分享圖片

tagIMEINFO接著上面的對象展示,與tagWND類型一致。

技術分享圖片

tagWND的消息過程的成員lpfnWndProc在偏移0x60的地方,指向了由用戶層VirtualAlloc分配的一段可讀可寫可執行的地址。

技術分享圖片

看下這個地方對消息的處理,lpfnWndProc指向的消息處理函數是一段shellcode,被拷貝到了應用層申請的可執行的代碼內存中。可以看到對消息ID號0x9F9F進行了處理,也就是用戶層使用函數SendMessage對窗口發送一個消息ID為0x9F9F,並且經過標記前面的bServerSideProc提權之後這段shellcode將在內核執行。

技術分享圖片

NtUserSetImeInfoEx函數內部調用了GetProcessWindowStation函數,得到當前進程所在窗口站的句柄。

技術分享圖片

窗口站句柄是應用層使用CreateWindowStation創建了一個窗口站,並將窗口站與當前進程相關聯。

技術分享圖片

最後NtUserSetImeInfoEx在內部調用了SetImeInfoEx函數,SetImeInfoEx是這個樣子。

技術分享圖片

CVE-2018-8120漏洞的原因就在NtUserSetImeInfoEx內部的SetImeInfoEx函數。SetImeInfoEx漏洞的原因就是沒對窗口站對象tagWINDOWSTATION的成員spklList做空指針判斷,使其指向了攻擊者分配的零頁內存,同時spklList指向一個tagKL對象。並把零頁內存的對象tagKL的成員hkl與NtUserSetImeInfoEx第一個參數指向同一個窗口對象句柄,那麽就跳過了鏈表的循環邏輯。

技術分享圖片

這部分的攻擊代碼,因為類型是DWORD,使用偏移×4就是相關結構的偏移地址。

技術分享圖片

經過一段精心構造之後,最後把輸入法擴展拷貝到了系統內核的處理列表。

技術分享圖片

零頁內存相關數據。

技術分享圖片

最後使用SendMessage發送了一個消息,成功提權進入了內核執行任意代碼,並把4號進程的Token拷貝到當前進程成功的進行了提權操作。

技術分享圖片

提權操作使用了EPROCESS等一些內核結構的偏移地址。

技術分享圖片

從Win8開始,對零頁內存分配做了緩解措施,讓用戶進程無法對零頁內存分配成功。以後的零頁內存防護也只是保證了不會在零頁內存分配空間,緩解分配零頁內存空間來利用漏洞。用零頁內存分配導致的空指針漏洞也只是眾多空指針漏洞類型中的一種。通過零頁內存保護機制並不能緩解所有的空指針漏洞。

技術分享圖片

小結

動手能力又增加了一點,技術知識也增長了一點。感謝各位大大的參考資料以及做的安全貢獻。

參考

https://xiaodaozhi.com/exploit/149.html

http://www.freebuf.com/articles/network/134351.html

http://blog.nsfocus.net/null-pointer-vulnerability-defense/

原文地址:https://mozhe.cn/news/detail/290

CVE-2018-8120 漏洞分析