前言
Hello, 歡迎來到windows-kernel-exploit第六篇, 這是從windows 7擼到windows 10的下篇, 這一篇我們主要討論在RS1, RS2和RS3(RS4和RS5有相應的思路, 我還沒有去做驗證)的利用 希望您能夠喜歡 :)
回顧
在上一篇當中, 我們看到了利用write-what-where在windows 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才能執行后面的操作. 所以我們來對比1503和1607來看一下我們前一篇的思路為什么失效了.
windows RS1的緩解措施
首先, 我們來看一下windows 1511的GdiShreadHandleTable.

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

我們可以看到在RS1的版本下, GdiShreadHanldleTable指向的已經不是一個真正的指針了. 所以我們無法完成后續的操作.
緩解措施(圖片來源: blackhat):

在windows RS1上面實現利用
泄露bitmap地址
So, 眾所周知, 有防范就一定有繞過. 我們先來看分代碼.

這是它的運行結果:

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

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


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

look, 其中指向了該handle的內核地址. 后面的代碼計算內核地址我們的第四章的內容一樣. 相信你一定可以理解.
如何泄露bitmap
通過這個方法, 我們可以通過句柄去泄露一些對象(user object)的地址. 能夠泄露的對象(user object)在微軟的官網上只有這些.

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

我把結果dump到一個文件.

其中CreateAcceleratorTable是創建一個pool, Delete是釋放一個DestroyAcceleratorTable. 代碼做的過程是不斷地分配一個pool和不斷地釋放一個pool.
我們把看到我們dump出來的地址每次都是一樣的, 可以看到我們的地址已經穩定了. Bingo!
讓我們來看看這個對象的pool 信息. paged pool sesssion. 在第四章中我們總結bitmap的時侯我們的bitmap也是同樣的大小. 那么. 如果我們分配同樣大小的bitmap. 是不是就能夠有機會把bitmap的地址泄露出來呢. 答案是肯定的. 所以有了下面的代碼.

驗證結果:

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

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

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

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

在windows RS2上面實現利用.
You know, 事情總會越來越難, 在RS2上面的時候, 發生了啥. 讓我們運行一下原來我們用于泄露的代碼.
可以發現一切都是好好的, 但是就是獲取不到內核地址. 于是為了簡單. 這是由于上面說的HADNLE_ENRTY結構體的pkernel被微軟給禁掉了. 于是, 我們gShreadInfo泄露bitmap的地址失效了.
所以前輩們他們又繼續開動了他們的腦洞. 用了我在第四章中提到的tagCLS對象及lpszMenuName. 有興趣的話你可以順著第四章的思路和上面做同樣的實驗進行驗證. 由于第四章的找tagCLS講的足夠詳細了, 在這里我就不再贅述. 詳細的你可以在這里找到.
code

在windows RS3上面實現利用
好了, 微軟終于意識到了bitmap的pvScan0是一個異常不安全的東西. 于是在RS3上面, 微軟做了下面的事.
圖片來源(blackhat):

可以看到在RS3版本上面, 微軟把pvScan0和pvBits(如果你仔細的看我以前截的圖的話, 你會發現這兩個是出奇的一致的)指向的對象放到了heap里面.(我曾經做過一個猜想, 上面使用的是pool, 堆噴如果可控的話是不是可以泄露呢. 但是HMvalidate函數在windows rs4版本失去了效果, 我暫時還沒有找到其他的方案可以幫我泄露堆來驗證這個觀點, 所以這里就省去不提). 導致了我們的bitmap技術失效.
Howerver, 事情總是有曙光的, bitmap掛了的話, 我們的思路可以轉換為其他的對象.
platte的閃亮登場
我們先來看個圖, 接著再討論其他的事:

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

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

總結
關于項目
bitmap的利用和我當時做DDCTF有關, 我一度陷入微軟的各個API里面, 然后我開始陷入了深深的思考. 我自己做的方向是不是做錯了. 因為我學習的過程中, 更在乎的是怎么利用. 碰到這個利用覺得哇, 這個思路(??????)??. nice那種, 但是分析呢. 所以我覺得分析的能力我很弱. 于是我當時選擇了DDCTF放一放, 就在github上面做了這個項目. 我想保證我在windows 7 到 windows 10的各個版本都有可利用的方法和手段. 借助于閱讀paper+調試+閱讀源碼, 我完成了這個目標. 在做完了這個項目之后, 我后期的好幾個利用編寫都是直接COPY代碼, 然后專注于WWW的構造. 所以應該對我的學習幫助還是很大的.
關于緩解措施的探討
緩解措施我不知道自己的結論是否正確, 如果你仔細的推論, 那么你會發現如果你學會了最新的版本的繞過, 那么好像也適用于前面的版本. 是不是前面的那些麻煩的結論就不用學習了呢. 我的結論是, 是的, 作為工業性的開發確實如此. 但是這種思想會有一種小小的問題. 感覺自己在乞食. 比如說現在, RS4和RS5我自己并沒有找到有效的paper, 那么我們只能選擇等待么. 等待明年的blackhat介紹新的方法? 我個人的想法是不是的. 其實比起怎么利用, 我更在意的是, blakhat的原作者是怎么想到這里的. 總結一下繞過思路.
[+] 可以使用bitmap(GDISHAREDHANDLETABLE)
[+] 不可以使用GDISHAREDTABLE
==> 那我換一個gShredInfo
[+] 不可以使用gSharedInfo
==> 那我換一個 fengshui 預判
[+] 不可以使用bitmap
==> 那我換一個palatte
所以你可以看到它的你用思路其實說到底都是思維的逃逸. 如果我們能逃過微軟的限制, 那么我們就能開發出新的思路. 但是, 沒有舊的思路就沒有新的思路, 所以我個人覺得這一部分的學習還是相當重要的.
關于RS4和RS5
在HmValidateHanldle失去效果之后, 我失去了所有泄露GDI對象的思路. 就在前天睡覺的時候, 發現有一種新的思路可能具有可行性, Howerver, 這幾天我一直在準備面試, 所以還沒有來得及實驗驗證他. 在后期的學習道路上, 我會把失敗(我覺得失敗的可能性比較大)或者成功的結果同步更新到這里, 敬請期待.
相關鏈接
- sakura師父博客: http://eternalsakura13.com/
- 小刀師傅博客: https://xiaodaozhi.com/
- 濫用GDI: https://sensepost.com/blog/2017/exploiting-ms16-098-rgnobj-integer-overflow-on-windows-8.1-x64-bit-by-abusing-gdi-objects/
- 我的個人博客: http://www.redog.me/
- 我的github地址: https://github.com/redogwu
- 本文相關的pdf下載: https://github.com/redogwu/study-pdf
- 本文的代碼: https://github.com/redogwu/windows_kernel_exploit
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.jmbmsq.com/877/
暫無評論