技術討論 | Windows全版本提權之Win10系列解析
一、 背景介紹
2018 年 8 月 27 日,境外安全研究人員 SandboxEscaper 在其個人主頁上披露了影響 Windows 10 及Windows Server 2016系統的一個安全漏洞。根據描述,該漏洞存在於Windows的計劃任務排程服務中,利用該漏洞攻擊者可以從USER提升至SYSTEM許可權。
天融信阿爾法實驗室第一時間進行跟進,進行漏洞復現和分析。本文將以Windows 10 X64系統平臺為基礎,詳細介紹該漏洞及漏洞利用方法。同時附帶利用該漏洞實現的提權工具及原始碼。
二、漏洞簡介
Windows 計劃任務排程服務的介面函式( schedsvc ! SchRpcSetSecurity ())用於修改計劃任務相關檔案訪問控制屬性,未驗證呼叫者身份。攻擊者可主動呼叫該介面函式,配合“硬連結(HardLink)”,達到修改指定系統檔案訪問控制屬性的目的。當一些系統服務的關鍵模組(EXE/DLL)被篡改,再次呼叫該服務,攻擊者的程式碼將得以執行,且為SYSTEM許可權。
三、相關技術
在具體講解漏洞及其利用方法之前,讓我們首先簡單瞭解一些與之相關的知識。介紹這部分內容是為了讓不熟悉Windows相關特性的讀者對該漏洞有更加清晰的認識,熟悉以下內容的讀者可以跳過這一部分。
Security Descriptor 安全描述符
在Windows系統下,Security Descriptor安全描述符(簡稱SD) 是包含一個核心物件所有關於安全設定的資料結構。SD中包括使用者SID、DACL、SACL。DACL表明了哪些使用者可以訪問該物件、以什麼方式訪問該物件(如CreateFile時指定的訪問許可權)。
系統中每一個檔案、程序等等都有對應的核心物件,其中都有一個SD結構,包括每個使用者對該檔案支援的操作。這裡摘取《Windows 安全程式設計》一書中關於該內容的部分說明,需要詳細瞭解該部分內容的可以讀一下這本書。
SchRpcSetSecurity()漏洞函式支援呼叫者修改部分檔案的安全屬性,其中安全屬性通過SDDL字串描述,Windows會解析SDDL並轉換為SD描述符。有需要了解SDDL詳細資訊的可以參考尾部連線 。
ALPC (Advanced Local Procedure Call)高階過程呼叫
ALPC是一種使用者模式與核心模式通訊的方式,也支援程序間通訊。該方式被Windows系統大量使用。 ALPC 允許在 系統 內執行的客戶端程序要求在同一系統中執行的伺服器程序提供某些資訊或執行某些操作。
其中Windows計劃任務就採用了該方式進行管理,schedsvc模組以服務的方式執行,可以看做一個服務提供者。計劃任務管理程式可以通過ALPC呼叫schedsvc的介面進行一些增刪改查操作。
硬連結(HardLink)
硬連結是通過將多於一個的路徑引用在單個檔案的符號連結。通俗的說,硬連結可以看做特殊的“快捷方式檔案”。我們可以通過mklink在指定位置為指定檔案建立硬連結,這時候就可以通過這2個路徑訪問同一個檔案。
當然硬連結有其他很多限制和特點,這裡不做太多介紹,只介紹與本文相關的內容。
如微軟所描述,硬連結並沒有單獨的SD描述符。更改硬連結的安全描述符,即更改了基礎檔案的安全描述符。
四、漏洞位置
漏洞函式位於Windows計劃任務排程服務中,服務名稱為 Task Scheduler,主模組為schedsvc.dll,依靠svchost.exe程式註冊為系統服務。
該模組介面函式 SchRpcSetSecurity (),用於修改計劃任務有關檔案或目錄的安全屬性。該函式並沒有編碼上的安全問題,產生安全問題的原因是該函式沒有驗證呼叫者的來源及合法性,即任意程式均可以通過ALPC介面呼叫該函式修改檔案屬性。這裡貼一下微軟針對該函式的說明:
指定檔案PATH 和 安全描述SDDL,該函式將為指定的檔案設定對應的安全屬性,當然PATH並不是指定一個檔案全路徑,而是指定一個“任務名稱”,該函式會根據任務名稱補全路徑,具體的後面會介紹。下面是IDA反彙編該函式的內容:
整個流程其實並不複雜,一些常規操作。這裡貼出我們需要了解的相關部分的程式碼,也就是圖中說明的設定檔案安全描述符的函式程式碼:
可見該處為一處虛擬函式呼叫,這時候IDA中沒有很好的描述函式的地址及名稱,只好拿起Windbg進行動態除錯,使用WinDbg附加到svchost.exe程序(系統中有多個svchost程序,可以根據命令列引數或者已載入模組定位目標程序),最終定位到該函式最終呼叫了taskcomp! SetSDNotification ()函式:
tsched!SetJobFileSecurityByName()最終會設定檔案安全屬性,以下是該函式的關鍵流程
最後來看看動態除錯的情況,在WinDbg中單步跟蹤task! SetSDNotification (),該函式接收2個引數。由於是X64彙編環境,函式呼叫的引數傳遞採用X64傳參方式,前四個引數依次通過RCX RDX R8 R9進行傳遞。
至此漏洞函式關鍵流程已完畢,關鍵之處是schedsvc!SchRpcSetSecurity()內部會呼叫taskcomp!SetSDNotification(), 按照傳遞的 任務名稱 引數和SDDL安全描述字串,設定 %systemdir%\\Tasks\\ 任務名稱.job 的安全屬性。
單單能修改該目錄的一個檔案內容和檔案屬性似乎也沒有什麼意義,還是沒有一段以SYSTEM許可權執行的程式碼,無法有效利用。這時候就要提起前面提起過的Windows符號連結之一的“硬連結”,在 %systemdir%\\Tasks目錄建立一個連結到系統程式A的硬連結,這個時候通過修改安全屬性,使得普通使用者也有許可權修改系統程式A的檔案內容,然後通過系統介面啟動篡改後的程式A,讓我們的程式碼以高許可權執行。舉個例子:系統服務均執行在SYSTEM許可權下,查詢一下哪些系統目錄的EXE/DLL被註冊為服務,修改該檔案後啟動該服務,即可獲得SYSTEM許可權。
五、漏洞利用
前文已經介紹過漏洞函式的流程及作用,攻擊者通過SchRpcSetSecurity()介面函式可以設定對系統程式的訪問屬性,使得普通使用者許可權執行的程式可以修改系統程式及其執行程式碼。 筆者完善了SandboxEscaper提供的POC,製作了支援Windows10 x86/x64 及Windows Server2016系統的提權工具 ( ofollow,noindex" target="_blank">GitHub傳送門 ),下面將以此為例介紹該漏洞利用的完整流程。
該EXP通過利用漏洞函式,修改系統服務Microsoft XPS DocumentWriter 服務(該服務為XPS列印服務)的關鍵DLL,然後通過COM介面傳送列印任務,最終系統將會啟動該服務。
以下程式碼是定位檔案路徑以及建立檔案硬連結的過程:
不過有一點需要注意的是,由於硬連結需要在%systemdir%\\tasks目錄建立,普通程式並無法成功建立,所以這個操作需要由有許可權的程式去做。SandboxEscaper的DEMO中選擇了注入程式碼到Notepad程式中,以Notepad程序的執行環境是有許可權在該目錄建立硬連結的。筆者的EXP中,將注入操作順帶實現了,自己建立一個程序並注入。
遠端執行緒方式注入一個DLL到Notepad中,建立硬連結並觸發漏洞函式。
上面通過RPC方式呼叫schedsvc!SchRpcSetSecurity()函式,觸發漏洞。其中所傳遞的SDDL安全描述字串,將目標檔案設定為驗證使用者擁有可寫入許可權,其格式可以自己解讀,MSDN有例子
在觸發漏洞之後,理論上目標檔案以及可以修改,上面的程式碼用於修改檔案。從資源取出DLL並覆蓋。在DLL修改完畢之後,通過COM元件啟動該服務進行列印。
至此漏洞利用完畢。
這裡貼上EXP的程式碼,DLL載入DllMain()函式必被呼叫,EXP由DLLMain()開始執行漏洞利用程式碼。該exp通過本地SOCKET接收使用者引數並執行,然後通過SOCKET把結果傳回給漏洞利用程式展示給使用者。
六、總結
到這裡,漏洞分析和漏洞利用都介紹完了,該漏洞屬於邏輯漏洞,而並非編碼產生的安全漏洞。
目前微軟暫未釋出相關安全更新,建議使用者不要執行來源不明的可執行程式,避免遭受此類漏洞的攻擊。
七、參考連結
1)SchRpcSetSecurity()函式
https://msdn.microsoft.com/en-us/library/cc248452.aspx
2)SDDL安全描述字串
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/sddl-for-device-objects
3)Access Control Lists
https://docs.microsoft.com/zh-cn/windows/desktop/SecAuthZ/access-control-lists
4)DACLs and ACEs
https://docs.microsoft.com/zh-cn/windows/desktop/SecAuthZ/dacls-and-aces
5)HardLink 硬連結
IO/hard-links-and-junctions" rel="nofollow,noindex" target="_blank">https://docs.microsoft.com/zh-cn/windows/desktop/FileIO/hard-links-and-junctions
*本文作者:alphalab,轉載請註明來自 FreeBuf.COM