精彩!Windows再現任意檔案提權漏 CVE-2020-0667漏洞情報

在這篇文章中,我將討論我在Windows服務跟蹤中發現的一個任意檔案移動漏洞。從我的測試來看,它影響了從Vista到10的所有Windows版本,但它可能更老,因為這個功能在XP中已經有了。

簡介

Service Tracing是一個古老的功能,最早可以追溯到Windows XP,而在更古老的作業系統中可能也存在類似功能。它旨在提供有關執行服務和模組的一些基本除錯資訊,它可由任何本地使用者配置,只需在HKLM\SOFTWARE\Microsoft\Tracing下編輯一些登錄檔鍵和值。

一個服務或模組往往與其中一個登錄檔鍵相關聯。每個鍵包含6個值(相關設定)。我們將關注其中的三個值:EnableFileTracing(啟用/禁用“跟蹤”)、FileDirectory(設定輸出日誌檔案的位置)和MaxFileSize(設定日誌檔案的最大檔案值)。

在啟用了EnableFileTracing後,目標服務將開始寫入你選擇的目錄中的日誌檔案。一旦輸出檔案的大小超過MaxFileSize,它就會被移動(。log副檔名改為。old),並建立一個新的日誌檔案。

多虧了有James Forshaw的

符號連結測試工具

,讓我們利用這個漏洞變得非常簡單。我們所需要做的就是將日誌目錄設定為\RPC Control物件目錄的掛載點,然後建立兩個符號連結:

·

一個從MODULE。LOG連結到你控制的檔案(其大小必須大於MaxFileSize)。

·

·

另外一個從MODULE。OLD連結到檔案系統中的任意檔案(例如C:\Windows\System32\WindowsCoreDeviceInfo。dll)。

·

最後,檔案的一系列改動被觸發(以NT AUTHORITY\SYSTEM許可權),透過Update Session Orchestrator服務來執行任意命令。

The Tracing Feature for Services

如前所述,任何本地使用者都可以配置Service Tracing功能,只需在HKLM\SOFTWARE\Microsoft\Tracing下編輯一些登錄檔鍵和值即可。

使用來自Windows Sysinternals工具套件的AccessChk,我們可以看到普通使用者幾乎對所有的子鍵都具有讀/寫許可權。

在本文的其餘部分,我將使用RASTAPI模組作為示例,因為它是我利用的一個模組。這個模組由IKEEXT服務使用。因此,透過初始化虛擬VPN連線可以很容易地觸發日誌事件。下面的螢幕截圖顯示了登錄檔項的預設內容。為其他服務和模組配置了完全相同的值。

精彩!Windows再現任意檔案提權漏 CVE-2020-0667漏洞情報

從本地攻擊者的角度來看,最有趣的在下面

精彩!Windows再現任意檔案提權漏 CVE-2020-0667漏洞情報

透過設定這些值,我們可以:

·

將EnableFileTracing設定為0或1,強制特定的服務或模組啟動或停止輸出日誌檔案(除錯資訊寫入日誌檔案)。

·

·

設定FileDirectory來指定日誌檔案的位置。

·

·

設定MaxFileSize指定輸出檔案的最大大小。

The Arbitrary File Move Vulnerability

·

考慮到前面的上下文元素,可以很容易地解釋漏洞。

Case #1: MaxFileSize - Default value

對於第一個測試用例,我簡單地將C:\LOGS設定為輸出目錄並啟用檔案跟蹤。

現在,如果我們希望目標服務開始寫入這個檔案,我們必須生成一些事件。一種非常簡單的方法是使用rasdial命令和一個PBK檔案初始化一個虛擬VPN連線。

I

它執行了,日誌檔案是由NT AUTHORITY\系統編寫的。它的大小大約是24KB。

精彩!Windows再現任意檔案提權漏 CVE-2020-0667漏洞情報

Case #2: MaxFileSize - Custom value

在前面的測試中,我們看到輸出日誌檔案的最終大小約為24KB。因此,這一次,我們將把MaxFileSize設定為0x4000(16,384位元組)並重新啟動測試。

精彩!Windows再現任意檔案提權漏 CVE-2020-0667漏洞情報

“程序監視器”捕獲的事件可以總結如下:

1。服務獲取關於日誌檔案的基本資訊。我們可以看到EndOfFile的偏移量為23,906,這是此時檔案的大小。問題是,我們指定了最大檔案大小為16,384位元組,因此係統將判定沒有更多的空閒空間。使用FileName=C:\LOGS\ rasta 。 old呼叫SetRenameInformationFile。換句話說,因為現有檔案被判定達到最大容量了,所以它從C:\LOGS\ rasta 。 log移到了C:\LOGS\RASTAPI。OLD。

2。 該服務建立一個新的C:\LOGS\ rasta 。 log檔案並開始對其進行寫入。

3。 “Move”

操作作為NT AUTHORITY\系統執行。因此,它可用於所有檔案移動到檔案系統上的任何位置,比如C:\Windows\System32\。

利用

整體攻擊流程可概括為:

1。建立(或複製)一個大於0x8000(32768)位元組的惡意DLL(FakeDll。dll)。

2。建立一個新目錄(例如C:\EXPLOIT\mountpoint\),並將其設定為\RPC Control的掛載點。

3。建立以下符號連結:

\RPC Control\RASTAPI。LOG -> \??\C:\EXPLOIT\FakeDll。dll (owner = current user)

\RPC Control\RASTAPI。OLD -> \??\C:\Windows\System32\WindowsCoreDeviceInfo。dll

4。在登錄檔中配置以下值:

FileDirectory = C:\EXPLOIT\mountpoint

MaxFileSize = 0x8000 (32,768‬ bytes)

EnableFileTracing = 1

5。使用Windows API中的RasDial功能觸發RASTAPI的相關事件。

6。觸發Update Session Orchestrator服務,以NT AUTHORITY\SYSTEM許可權載入惡意DLL。

Links & Resourc

MSRC - CVE-2020-0668

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

-

Windows Exploitation Tricks: Exploiting Arbitrary File Writes for Local Elevation of Privilege

https://googleprojectzero。blogspot。com/2018/04/windows-exploitation-tricks-exploiting。html

i

Symbolic Link Testing Tools

https://github。com/googleprojectzero/symboliclink-testing-tools

k

UsoDllLoader

https://github。com/itm4n/UsoDllLoader

m

My PoC for CVE-2020-0668

https://github。com/itm4n/SysTracingPoc

b。com/itm4n/SysTracingPoc

·

本文翻譯至 https://itm4n。github。io/cve-2020-0668-windows-service-tracing-eop/