自ms11-080和ms11-046exploit利用程式放出來後,很多人都利用源碼進行編譯和測試,甚至是拿到實戰中進行提權。剛放出來那會,我也編譯並測試通過,但始終沒去分析漏洞的形成原理和利用的技巧,今天有時間先Google了一下,漏洞原理網上已經很多人分析了,至於利用的整個流程,我也簡單分析一下,也許對有些同學有幫助。
借用網上名言:如有雷同,純屬抄襲,請勿拍磚!
PsInitialSystemProcess是內核匯出的指向System進程的EPROCEESS結構體的指標。
因為PsReferencePrimaryToken包含了從EPROCESS中取Token的操作,而針對不同的系統進程Token相對EPROCESS的偏移是不一樣的,因此可以通過此函數來確定Token相對EPROCESS的偏移。本系統System進程Token相對EPROCESS的偏移為0xc8。前面的一點分析主要是如何完成通用內核提權shellcode的編寫。
至於在內核提權中為什麼經常覆蓋的地址為HalDispatchTable+4處的位址,而通過調用NtQueryIntervalProfile函數來執行我們的shellcode,我們可以仔細分析一下看看NtQueryIntervalProfile函數的執行流程:
由此可見,在KeQueryIntervalProfile函數內部調用了HalDispatchTable+0x4,因此只要在內核利用shellcode去覆蓋掉這個位址,然後再調用NtQueryIntervalProfile,shellcode將會在內核以系統許可權被執行,此時你就是系統許可權了,至於想在shellcode中做些什麼,就看你自己的發揮了。
MS11-080
exploit完整提權過程分析:
此處省略n多,漏洞的原理。
總之就是在內核寫固定位址到任意位址(此任意位址可由輸入控制)。由此觸發漏洞。
具體代碼為:*(DWORD *)theIrp.UserBuffer =
theIrp.IoStatus.Status;
而此處Status總固定為0xC0000207,用戶不可控。
在MS11-080 exploit利用中,傳入的位址為HalDispatchTable + 4 + 2,可以windbg中看一下此位址是多少:
在exploit執行之前,該位址值為0x7436806e,exploit執行後,將會被修改為0xC0000207,如下圖:
這樣我們再看一下HalDispatchTable + 4的位址被覆蓋成什麼樣了,畢竟這個位址才是最後漏洞觸發後代碼執行入口。
由此可以發現,此時HalDispatchTable + 4位址已經被覆蓋為0x02074bba了。覆蓋的最終結果均會將HalDispatchTable + 4的高四位位址覆蓋為0207,因此咱們只需要在0x02070000起始的位址分配記憶體,然後在0x02080000填充shellcode的代碼,雖然覆蓋目標低四位元位址不可確定,但極限情況下也不會超過FFFF,所以只要call進了HalDispatchTable+ 4,shellcode的代碼肯定能得到執行。
此exploit覆蓋的位址是從HalDispatchTable
+ 4 +2 開始覆蓋,起始從HalDispatchTable + 4 + 1開始覆蓋也是可以的,只是覆蓋成功後,shellcode的起始位址就變成了0x000207xx!!!
總結一下:通過覆蓋HalDispatchTable+4來完成利用只能針對內核任意位址寫固定位址或任意地址的內核漏洞。如有錯誤,還請指教!這樣以後遇到同一類型的內核漏洞就知道該怎麼利用了。
PS:在x86上 HalDispatchTable + 4 偏移為+4
在x64上 因為資料結構改變, HalDispatchTable+ 8 偏移變為+8
PS2:此技術目前work in x86/x64 Win7 ,但因為Win8多了(Supervisor Mode Execution Protection) SMEP,禁止KernelMode 直接存取 ---> UserMode,所以此技術不能直接運用於Win8。
沒有留言:
張貼留言