作者:wjllz
來源:先知安全技術社區

前言

Hello, 歡迎來到windows-kernel-exploit第六篇, 這是從windows 7擼到windows 10的下篇, 這一篇我們主要討論在RS1, RS2RS3(RS4和RS5有相應的思路, 我還沒有去做驗證)的利用 希望您能夠喜歡 :)

回顧

在上一篇當中, 我們看到了利用write-what-wherewindows 7, 8, 8.1 1503的利用, 是不是感覺有些奇怪. 為什么我們的出的結論是這些操作版本呢. 讓我們先來看下如果在上一篇當中利用bitmap的思路.

[+] 泄露hmanager bitmap和 hworker bitmap地址
[+] 從而泄露出hmanager bitmap和hworker bitmap的pvScan0地址
[+] 利用write-what-wher將hmanager的pvScan0改為hworker pvScan0的地址.
[+] readOOB:
        ==> 先對hmanager setbitmapbits使worker得pvScan0變為任意地址
        ==> 使用hworker getbitmapbits對任意地址進行讀操作
[+] writeOOB:
        ==> 先對hmanager setbitmapbits使worker得pvScan0變為任意地址
        ==> 使用hworker getbitmapbits對任意地址進行寫操作

第一點尤其重要, 我們必須要泄露出bitmap才能執行后面的操作. 所以我們來對比15031607來看一下我們前一篇的思路為什么失效了.

windows RS1的緩解措施

首先, 我們來看一下windows 1511GdiShreadHandleTable.

blog_1.png

接著我們來看一下在window 1607GdiShreaddHandleTable.

blog_2.png

我們可以看到在RS1的版本下, GdiShreadHanldleTable指向的已經不是一個真正的指針了. 所以我們無法完成后續的操作.

緩解措施(圖片來源: blackhat):

img

在windows RS1上面實現利用

泄露bitmap地址

So, 眾所周知, 有防范就一定有繞過. 我們先來看分代碼.

img

這是它的運行結果:

img

先不管三七二十一, 是不是興奮的想擦鼻血. 那種FFF開頭的, 總感覺有什么東西的內核地址被泄露了. 有內核泄露就很舒服. 讓我們看看他是怎么泄露的.

gSharedInfo

img

調試器里面我們獲取到了gSharedinfo. 他有什么用呢.

img

img

標黃的指向ahelist, 這是一張表. 存放一些與handle關聯的信息. 其中的Entry是.

img

look, 其中指向了該handle的內核地址. 后面的代碼計算內核地址我們的第四章的內容一樣. 相信你一定可以理解.

如何泄露bitmap

通過這個方法, 我們可以通過句柄去泄露一些對象(user object)的地址. 能夠泄露的對象(user object)在微軟的官網上只有這些.

img

你會發現好像和我們的bitmap無關. 真的無關么. 先來看我寫的一個小小的c++代碼.

img

我把結果dump到一個文件.

img

其中CreateAcceleratorTable是創建一個pool, Delete是釋放一個DestroyAcceleratorTable. 代碼做的過程是不斷地分配一個pool和不斷地釋放一個pool.

我們把看到我們dump出來的地址每次都是一樣的, 可以看到我們的地址已經穩定了. Bingo!

讓我們來看看這個對象的pool 信息. paged pool sesssion. 在第四章中我們總結bitmap的時侯我們的bitmap也是同樣的大小. 那么. 如果我們分配同樣大小的bitmap. 是不是就能夠有機會把bitmap的地址泄露出來呢. 答案是肯定的. 所以有了下面的代碼.

img

驗證結果:

img img

但是, 可能比較疑惑, 傳入的參數為什么是700. 我的思路是用第四章的思路傳入0x10, 0x100, 0x700. 來驗證重用的穩定性, 這里就不再贅述. 而abuse gdi里面的ppt有提到當分配到pool過大的時候, 會降低隨機性.

img

泄露基地址

泄露基地址和在第四章不太一樣, 原因起源于github的項目我是抱著學習的思路去做的. 所以寫代碼的過程是讀paper+調試+copy別人代碼, 所以也獲取了很多的額外的知識.

img

利用NtQuerySystemInformation可以獲取一些關于內核的信息. 重要的是第二個參數.

img

用數字來標明我們想查找的是有關內核模塊的信息. 在這里你可以找到更詳細的解釋.

img

在windows RS2上面實現利用.

You know, 事情總會越來越難, 在RS2上面的時候, 發生了啥. 讓我們運行一下原來我們用于泄露的代碼.

可以發現一切都是好好的, 但是就是獲取不到內核地址. 于是為了簡單. 這是由于上面說的HADNLE_ENRTY結構體的pkernel被微軟給禁掉了. 于是, 我們gShreadInfo泄露bitmap的地址失效了.

所以前輩們他們又繼續開動了他們的腦洞. 用了我在第四章中提到的tagCLS對象lpszMenuName. 有興趣的話你可以順著第四章的思路和上面做同樣的實驗進行驗證. 由于第四章的找tagCLS講的足夠詳細了, 在這里我就不再贅述. 詳細的你可以在這里找到.

code

img

在windows RS3上面實現利用

好了, 微軟終于意識到了bitmap的pvScan0是一個異常不安全的東西. 于是在RS3上面, 微軟做了下面的事.

圖片來源(blackhat):

img

可以看到在RS3版本上面, 微軟把pvScan0pvBits(如果你仔細的看我以前截的圖的話, 你會發現這兩個是出奇的一致的)指向的對象放到了heap里面.(我曾經做過一個猜想, 上面使用的是pool, 堆噴如果可控的話是不是可以泄露呢. 但是HMvalidate函數在windows rs4版本失去了效果, 我暫時還沒有找到其他的方案可以幫我泄露堆來驗證這個觀點, 所以這里就省去不提). 導致了我們的bitmap技術失效.

Howerver, 事情總是有曙光的, bitmap掛了的話, 我們的思路可以轉換為其他的對象.

platte的閃亮登場

我們先來看個圖, 接著再討論其他的事:

img

我們可以看到有一個palatte的對象, 含有和bitmap類似的結構. 即使在RS3的版本上.

img

借助于此, 我們可以創建一個palatte對象, 我真心的希望是, 您可以映著第四章的思路. 完成自己的實驗去探討palatte的分配pool大小關系. 在這里, 我并沒有做這個工作, 一方面, 我給姐姐承諾的deadline是今晚. 調試截圖會花費我很多的時間, 另外一方面. 調試器下見真章是我在繞過了無數彎路之后的最大的收獲, 也希望您能夠學會他. 后續的利用思路就和bitmap及其的相似, 這里就不再贅述,讓我們看code.

code

img img

總結

關于項目

bitmap的利用和我當時做DDCTF有關, 我一度陷入微軟的各個API里面, 然后我開始陷入了深深的思考. 我自己做的方向是不是做錯了. 因為我學習的過程中, 更在乎的是怎么利用. 碰到這個利用覺得哇, 這個思路(??????)??. nice那種, 但是分析呢. 所以我覺得分析的能力我很弱. 于是我當時選擇了DDCTF放一放, 就在github上面做了這個項目. 我想保證我在windows 7 到 windows 10的各個版本都有可利用的方法和手段. 借助于閱讀paper+調試+閱讀源碼, 我完成了這個目標. 在做完了這個項目之后, 我后期的好幾個利用編寫都是直接COPY代碼, 然后專注于WWW的構造. 所以應該對我的學習幫助還是很大的.

關于緩解措施的探討

緩解措施我不知道自己的結論是否正確, 如果你仔細的推論, 那么你會發現如果你學會了最新的版本的繞過, 那么好像也適用于前面的版本. 是不是前面的那些麻煩的結論就不用學習了呢. 我的結論是, 是的, 作為工業性的開發確實如此. 但是這種思想會有一種小小的問題. 感覺自己在乞食. 比如說現在, RS4RS5我自己并沒有找到有效的paper, 那么我們只能選擇等待么. 等待明年的blackhat介紹新的方法? 我個人的想法是不是的. 其實比起怎么利用, 我更在意的是, blakhat的原作者是怎么想到這里的. 總結一下繞過思路.

[+] 可以使用bitmap(GDISHAREDHANDLETABLE)
[+] 不可以使用GDISHAREDTABLE
    ==> 那我換一個gShredInfo
[+] 不可以使用gSharedInfo
    ==> 那我換一個 fengshui 預判
[+] 不可以使用bitmap
    ==> 那我換一個palatte

所以你可以看到它的你用思路其實說到底都是思維的逃逸. 如果我們能逃過微軟的限制, 那么我們就能開發出新的思路. 但是, 沒有舊的思路就沒有新的思路, 所以我個人覺得這一部分的學習還是相當重要的.

關于RS4和RS5

HmValidateHanldle失去效果之后, 我失去了所有泄露GDI對象的思路. 就在前天睡覺的時候, 發現有一種新的思路可能具有可行性, Howerver, 這幾天我一直在準備面試, 所以還沒有來得及實驗驗證他. 在后期的學習道路上, 我會把失敗(我覺得失敗的可能性比較大)或者成功的結果同步更新到這里, 敬請期待.

相關鏈接


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.jmbmsq.com/877/