CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

本文是翻譯文章,文章原作者itm4n,文章來源:itm4n.github.io原文地址:https://itm4n.github.io/cve-2020-0668-windows-service-tracing-eop/


譯文僅供參考,具體內容表達以及含義原文為準

×

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

0x00 前言

在本文中,我將與大家分享我在Windows Service Tracing中找到的一個任意文件移動漏洞。根據測試結果,該漏洞影響從Vista到10的所有Windows版本。由於XP系統中已存在該功能,因此該漏洞可能會影響更早的版本。

Service Tracing是Windows系統中很早就存在的一個功能,可以追溯到XP時代,但更早系統中可能已經包含該功能。Service Tracing可以提供正在運行的服務和模塊的基礎調試信息,配置起來非常方便,本地用戶只要編輯HKLM\\SOFTWARE\\Microsoft\\Tracing下的某些註冊表鍵值即可。

Windows系統中,服務或者模塊會關聯某些註冊表項,其中每個鍵都包含6個值(即具體的設置信息)。這裡我們主要關注其中3個值:EnableFileTracing(啟用/禁用“跟蹤”功能)、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服務來獲得任意代碼執行權限。

0x01 服務跟蹤

前面簡單提到過,任何本地用戶都能配置Service Tracing功能,只要編輯某些註冊表項,修改HKLM\\SOFTWARE\\Microsoft\\Tracing下的鍵值即可。

我們可以使用Windows Sysinternals工具集中的AccessChk工具,驗證普通用戶具備相關注冊表項下幾乎所有子項的的Read/Write權限:

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

為了演示方便,下文中我將以RASTAPI模塊為例,這也是我利用代碼中用到的模塊。由於IKEEXT服務會用到該模塊,因此我們可以通過啟動任意VPN連接來觸發事件日誌行為。涉及到的相關注冊表鍵值默認設置如下圖所示,其他服務及模塊也使用了完全相同的值。

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

從本地攻擊者角度來看,比較有趣的幾個值如下所示:

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

我們可以修改這些值,實現如下目標:

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

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

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

這裡唯一要注意的是我們無法選擇輸出文件的名稱,該名稱取決於被調試服務或模塊的名稱,但我們可以通過符號鏈接輕鬆解決該問題。

0x02 任意文件移動漏洞

瞭解前面信息後,我們可以澄清該漏洞的利用過程。

場景1:MaxFileSize為默認值

在這個測試案例中,我將C:\\LOGS設置為輸出目錄,啟用文件跟蹤功能。

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

現在,如果我們希望目標服務開始寫入該文件,就必須生成某些事件。這裡最簡單的一種方法就是使用rasdial命令,配合PBK文件來初始化任意一個VPN連接。

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

這種方法行之有效,NT AUTHORITY\\SYSTEM用戶會寫入日誌文件。目前日誌文件大小約為24KB。

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

場景2:MaxFileSize為自定義值

在上一個測試用例中,輸出日誌文件的最終大小約為24KB。因此,這裡我們要將MaxFileSize設置為0x4000(即16,384個字節),然後重新開始測試。

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

根據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文件,開始寫入數據。

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

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

0x03 漏洞利用

利用過程非常簡單,可以總結如下:

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

2、創建一個新的目錄(C:\\EXPLOIT\\mountpoint\\ for example),將其設置為指向\\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。

漏洞利用過程如下圖所示:

CVE-2020-0668:Windows Service Tracing本地提權漏洞分析

  • MSRC – CVE-2020-0668
    https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0668
  • Windows利用技巧:利用任意文件寫入實現本地權限提升
    https://googleprojectzero.blogspot.com/2018/04/windows-exploitation-tricks-exploiting.html
  • 符號鏈接測試工具
    https://github.com/googleprojectzero/symboliclink-testing-tools
  • UsoDllLoader
    https://github.com/itm4n/UsoDllLoader


分享到:


相關文章: