Windows原理深入學習系列-Windows核心提權

信安成長計劃發表於2022-03-15

這是[信安成長計劃]的第 22 篇文章

0x00 目錄

0x01 介紹

0x02 替換 Token

0x03 編輯 ACL

0x04 修改 Privileges

0x05 參考文章

繼續糾正網上文章中那些奇怪的情況和問題

0x01 介紹

雖然主題是 Windows 核心提權,但實際上還是對之前文章的一個總結,這篇文章中所用到的東西全都是前幾篇文章所提到的知識點,所有的操作都是之前文章中所講述過的,以下所有的實驗都是在 Win10_x64_20H2 上進行的。

0x02 替換 Token

主要原理就是將 System 程式的 Token 替換到我們當前程式的 Token 中

先新起一個 cmd,可以看到當前是普通使用者

圖片

根據之前的方法找到 Token 位置所儲存的值

圖片

讓 Windbg 自己來解析一下是這樣子的

圖片

之後以同樣的方法取到 System 程式的 Token 位置的內容

可以看到 User 是 S-1-5-18,代表了當前就是 System 賬戶

圖片

然後進行 Token 的替換

圖片

再回來執行一下 whoami 可以看到許可權已經是 System 許可權了

圖片

0x03 編輯 ACL

在之前分析 ACL 的時候,我們提到過,如果安全描述符中沒有 DACL,即 DACL 為 NULL,Windows 會允許任何使用者的完全訪問許可權。

如果我們對 winlogon 程式的 ACL 進行修改,這樣我們就可以用任意程式對其進行注入了,然後派生出來一個 System 許可權的程式

首先檢視 winlogon 程式的安全描述符

圖片

注意這裡使用的結構是 _SECURITY_DESCRIPTOR_RELATIVE,而不是 _SECURITY_DESCRIPTOR

圖片

然後對其進行修改

圖片

可以發現,已經沒有了 ACL 的驗證,任何人都擁有所有權

圖片

然後來嘗試注入一下,但是發現並沒有成功

圖片

這是因為程式的完整性等級檢查所導致的,接下來我們對我們自己的 Token 進行修改

圖片

在 TOKEN 當中有一個值 MandatoryPolicy,在微軟文件中可以看到解釋

圖片

我們當前的值是 3,然後將其改為 0

圖片

然後再次來進行注入,成功了,許可權是 System

圖片

再插句題外話,在網上找到的資料都是直接幹掉了安全描述符,將整個安全描述符都置 NULL 了,說是在低版本的時候還可以,在高版本 Windows 增加了判斷的驗證,直接修改的話會藍屏。

這裡他們選擇直接抹安全描述符的操作我沒有理解,按照微軟文件所描述的,這些操作是對 DACL 有效的,為什麼要直接幹安全描述符呢?

圖片

所以,一定要自己查資料自己實踐,一定要自己查資料自己實踐,一定要自己查資料自己實踐。

為了能夠實現提權操作,就有了第二種方案,直接對 ACE 進行修改,對於查詢等各種細節,我們在前面也分析過了,這裡直接來進行操作

圖片

接下來對其進行修改

圖片

這樣 SID 就從原來的 S-1-5-18 變成了 S-1-5-11

圖片

可以看到已經發生了變化

圖片

然後對當前程式的 Token 進行修改

圖片

接著再來進行注入,可以發現已經是 System 許可權了

圖片

0x04 修改 Privileges

其實這個操作在上一篇文章中也已經用到過了

先取出來 System 的 Privileges

圖片

再取出我們當前的 cmd 程式的 Privileges

圖片

然後將 System 的許可權位都直接替換到我們的上面

圖片

在修改完成後可以看到許可權都已經有了

圖片

可以看到有 SeDebugPrivilege 的許可權,所以就跟上一篇文章中所提到的是一樣的了,可以來注入 winlogon 程式來獲得 System 許可權

圖片

0x05 參考文章

1.https://mp.weixin.qq.com/s/s_3fQYe9rHLYaOuXUqJCgg

2.https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-token_mandatory_policy

3.https://docs.microsoft.com/en-us/windows/win32/secauthz/access-control-lists

相關文章