Windows原理深入學習系列-Windows核心提權
這是[信安成長計劃]的第 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