<sub id="dfg0s"></sub><wbr id="dfg0s"></wbr>
<sub id="dfg0s"><listing id="dfg0s"></listing></sub>
<sub id="dfg0s"></sub>
<dd id="dfg0s"><address id="dfg0s"></address></dd>
  • <sub id="dfg0s"><table id="dfg0s"></table></sub>

    <nav id="dfg0s"></nav>

    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,被拷貝到了應用層申請的可執行的代碼內存中??梢钥吹綄οD號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/

    標簽: 漏洞分析

    作者:pig 來源:黑客視界 瀏覽量:5268 時間: 2018-05-22

    加入墨者學院可立即獲得20墨幣

    可免費開啟靶場環境

    點擊注冊領取

    已有賬號,立即登錄

    你是不是好久没有被C了_少妇找技师做性按摩视频在线观看_午夜福利电影_777766香港开奖结果 7777