Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

在這篇文章中,我們將討論Windows Service Tracing中的一個任意文件移動漏洞。在我們的測試過程中,該漏洞將影響從Windows Vista至Windows 10的所有版本操作系統,但是Windows XP也很有可能會受此漏洞影響,因為XP系統中也有這項功能。

Windows Service Tracing

Service Tracing這項服務在Windows平臺上歷史悠久,早在XP就已經引入了這個功能。該功能可以給分析人員提供當前正在運行的服務及模塊的相關基本調試信息,任意本地用戶都可以通過編輯註冊表鍵值(HKLM\\SOFTWARE\\Microsoft\\Tracing)來對其進行配置。

在Windows中,每一個服務或模塊都對應了一個註冊表鍵,每一個鍵包含六個值,我們主要針對其中的三個值,即EnableFileTracing(啟用/禁用“tracing”)、FileDirectory(設置日誌輸出文件的地址)和MaxFileSize(設置日誌文件的最大文件大小)。

EnableFileTracing啟用之後,目標服務將會開始向我們所選擇的文件路徑寫入其日誌文件,當日志文件超過MaxFileSize的大小時,它將會被移動(即將原本的.LOG後綴替換為.OLD),並在原處創建一個新的日誌文件。

安全研究人員James Forshaw曾發佈過一個符號鏈接測試工具,漏洞利用也非常簡單。我們只需要將目標目錄設置為掛載點,指向\\RPC Control對象目錄,然後創建如下2個符號鏈接即可:

1、創建一個從MODULE.LOG到我們某個文件的符號鏈接(該文件大小必須大於MaxFileSize);

2、創建一個從MODULE.OLD到系統任意文件的符號鏈接,例如“C:\\Windows\\System32\\WindowsCoreDeviceInfo.dll”。

最後,我們需要以“NT AUTHORITY\\SYSTEM”權限運行的服務作為目標來觸發文件“移動”操作,然後利用Update Session Orchestrator服務來獲取任意代碼執行權限。

服務的Tracing功能

文章開頭介紹過,任意本地用戶都可以通過編輯註冊表鍵值(HKLM\\SOFTWARE\\Microsoft\\Tracing)來配置Service Tracing功能。

此時,通過使用Windows Sysinternals工具集中的AccessChk工具,我們可以看到普通用戶擁有相關注冊表項下幾乎所有子項的讀寫權限:

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

接下來,我們將以RASTAPI模塊為例來進行漏洞利用演示。IKEEXT服務會使用這個模塊,因此我們可以通過啟動任意VPN連接來觸發事件日誌行為。相關注冊表鍵值的默認設置如下圖所示,其他的服務及模塊也使用的是完全相同的值:

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

從本地攻擊者的角度來看,下面的值會有利用價值:

參數名稱 值範圍 描述 EnableFileTracing 0 – 1 開始/停止寫入日誌文件 FileDirectory A String 目錄的絕對路徑 MaxFileSize 0×00000000 – 0xffffffff 輸入日誌文件的最大文件大小

通過設置這些值,我們可以做到:

1、將EnableFileTracing修改為0或者1,強制特定服務或模塊開始/停止將調試信息寫入日誌文件。

2、通過FileDirectory設置日誌文件的具體位置。

3、通過MaxFileSize設置輸出文件大小的最大值。

需要注意的是,我們無法選擇輸出日誌文件的名稱,日誌文件名稱取決於被調用服務或模塊的名稱,但我們可以通過符號鏈接來解決這個問題。

任意文件移動漏洞

場景一:MaxFileSize為默認值

在這個場景中,我們將路徑“C:\\LOGS”設置為日誌文件的輸出目錄,並啟用“File Tracing”功能:

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

接下來,我們需要生成一些事件來觸發目標服務開始寫入日誌文件。這裡我們可以使用rasdial命令並配合PBK文件來初始化一個VPN連接:

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

成功了!日誌文件由“NT AUTHORITY\\SYSTEM”寫入,當前日誌文件大小約為24KB:

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

場景二:MaxFileSize - 自定義值

在之前的測試中,我們可以看到輸出日誌文件的大小約為24KB,因此這一次,我們要將MaxFileSize的值設置為“0×4000”(16384個字節大小),然後重新進行測試:

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

根據“Process Monitor”捕捉到的事件,我們可以知道:

1、服務會獲取日誌文件的基礎信息。我們可以看到EndOfFile的偏移量為23,906,這也是目前文件的大小值。由於我們設定的最大文件大小值為16,384個字節,因此這裡系統會判斷沒有更多空間可用。

2、服務調用SetRenameInformationFile,其中FileName=C:\\LOGS\\RASTAPI.OLD。由於系統認為當前文件已滿,因此會將“C:\\LOGS\\RASTAPI.LOG”更改為“C:\\LOGS\\RASTAPI.OLD”。

3、服務創建一個新的“C:\\LOGS\\RASTAPI.LOG”文件,開始寫入數據。

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

這裡的文件移動操作由“NT AUTHORITY\\SYSTEM”完成。因此,我們可以利用這一點將用戶所有的文件移動到目標系統中的任意位置,比如說“C:\\Windows\\System32\\”。

漏洞利用

漏洞利用過程如下:

1、創建(或拷貝)一個大小超過0×8000(32,768)個字節的文件。

2、創建一個新的目錄,例如“C:\\EXPLOIT\\mountpoint\\”,然後將其設置為一個指向“\\RPC Control”的掛載點。

3、創建下列符號鏈接:

<code>\\RPC Control\\RASTAPI.LOG -> \\??\\C:\\EXPLOIT\\FakeDll.dll (owner = current user)\\RPC Control\\RASTAPI.OLD -> \\??\\C:\\Windows\\System32\\WindowsCoreDeviceInfo.dll/<code>

4、在註冊表中配置下列值:

<code>FileDirectory = C:\\EXPLOIT\\mountpointMaxFileSize = 0x8000 (32,768‬ bytes)EnableFileTracing = 1/<code>

5、使用Windows API中的RasDial函數,觸發與RASTAPI相關的事件。

6、觸發Update Session Orchestrator服務,並利用“NT AUTHORITY\\SYSTEM”權限加載相關DLL。

演示樣例

Windows Service Tracing中的權限提升漏洞分析 CVE-2020-0668

1、https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0668

2、https://googleprojectzero.blogspot.com/2018/04/windows-exploitation-tricks-exploiting.html

3、https://github.com/googleprojectzero/symboliclink-testing-tools

4、https://github.com/itm4n/UsoDllLoader


分享到:


相關文章: