Skip to content
Suzu

【LOLBAS鐵人賽Day19】Sdclt.exe:備份工具的 UAC Bypass 攻擊手法解析

解析 Windows 備份工具 Sdclt.exe 如何透過劫持 HKCU\Software\Classes\Folder\shell\open\command 登錄機碼與 DelegateExecute 值,利用 auto-elevate 特性執行高權限命令,達成 UAC Bypass(T1548.002)。

Series
30 posts
View the complete series →
On this page

Sdclt.exe 是 Windows 內建的「備份與還原」功能的主要執行檔,
位置放在 C:\Windows\System32
因為本身帶數位簽章,而且有 Auto-elevate,

所以常常會被拿來當作攻擊的工具,
今天我們就一起來看看他的用法吧。

什麼是登錄碼 Registry?


先來看看什麼是登錄碼吧,
我們可以把登錄碼當成是整個 OS 的中央大腦
他可以存電腦上幾乎所有東西的設定、選項,

主要功能:

  • 硬體設定:紀錄有哪些硬體,像是顯示卡,USB 裝置,還有它們的驅動跟設定。
  • 軟體設定:當安裝一個程式的時候,他會把自己的資訊寫進 Registry,包括安裝路徑、版本號,還有檔案關聯(像是 .docx 要用哪個程式打開)
  • 使用者設定:每個使用者帳號都有自己的設定區塊,可以存像是桌布、視窗顏色、程式個人設定等內容。
  • 作業系統設定:Windows 自身的行為也會存在這邊。

登錄碼結構:

  • 機碼(Keys):可以想成是資料夾,是一個可以包含其他機碼(形成子資料夾)或鍵值的容器。
  • 鍵值(Values):可以想成是檔案,每個 Value 都有一個名稱、資料類型、具體值。

五個主要的根目錄:

上面我們有看到類比成資料夾、檔案的相應關係,
其實如果我們更深入去看的話,
整個 Registry 的最頂層有五個主要的根 Keys

  • HKEY_CLASSES_ROOT (HKCR):主要管理檔案關聯和 COM 物件。
  • HKEY_CURRENT_USER (HKCU):儲存目前登入使用者的個人設定。這就是我們這次攻擊利用的地方,因為改這邊不需要管理員權限。
  • HKEY_LOCAL_MACHINE (HKLM):儲存與本機電腦相關的設定,對所有使用者都有效。修改這裡需要管理員權限。
  • HKEY_USERS (HKU):儲存了電腦上所有使用者帳號的設定檔。HKEY_CURRENT_USER 其實只是 HKEY_USERS 下目前使用者設定的一個快捷方式。
  • HKEY_CURRENT_CONFIG (HKCC):儲存目前硬體設定檔的資訊。

來看一下 Demo 吧


sdclt.exe 的 UAC Bypass,其實就是一種 Registry Hijacking,
用 Windows Shell 的命令指派、委託機制來達成攻擊,
而且我們最主要利用的就是上面提到的 HKCU

攻擊核心

我們要修改的是這個路徑:
HKEY_CURRENT_USER\Software\Classes\Folder\shell\open\command

拆開來看一下:

  • HKEY_CURRENT_USER (HKCU): 重點部分。這是專屬當前登入使用者的 Registry 區域。對這個區域的任何修改完全不需要系統管理員權限,我們就可以在一個低權限的 Shell 中完成所有準備工作。
  • Software\Classes: HKCU 中用來覆蓋系統級別(HKEY_LOCAL_MACHINE\Software\Classes)檔案關聯和 COM 物件設定的地方。系統在尋找如何處理某個檔案類型時,會優先檢查目前使用者的這個路徑。
  • Folder\shell\open\command: 定義當系統對一個資料夾執行「開啟」動作的時候,應該執行的命令。正常情況打開資料夾是由 explorer.exe 處理,但我們可以劫持這個行為。

兩個關鍵 Values

等等攻擊的過程,我們主要會設定兩個 Value:

  • (Default) 預設值:
    • 作用:裡面原本是存要執行的命令,等等我們會把它改成 cmd.exe,所以只要有「開啟」的動作產生的時候,就會執行 cmd。
  • DelegateExecute:
    • 作用:正常情況下這個值會存一個 COM 物件的 CLSID,Windows Shell 看到它存在時,就不會直接執行 (Default) 值裡的命令,而是把任務委派給對應的 COM 物件去處理。我們刻意把它設成空字串,讓委派找不到目標,Shell 就會回頭直接執行 (Default) 裡的命令。
    • 提權說明:因為 sdclt.exe 本身是 auto-elevate(以高完整性啟動、不彈 UAC),由它來讀取這個被劫持的機碼並觸發執行時,(Default) 裡的 cmd 就會繼承這個高權限了

攻擊步驟

Step 1: Registry Hijacking

New-Item "HKCU:\Software\Classes\Folder\shell\open\command" -Force
Set-ItemProperty "HKCU:\Software\Classes\Folder\shell\open\command" -Name "(Default)" -Value "cmd.exe" -Force
Set-ItemProperty "HKCU:\Software\Classes\Folder\shell\open\command" -Name "DelegateExecute" -Value "" -Force

Step 2: 去觸發開啟動作,讓 Default 裡的 Payload 出來

sdclt.exe

執行 sdclt.exe 後,未跳出 UAC 提示就直接開啟高權限的 cmd 視窗

應該就會發現不會有任何 UAC 視窗跳出來,
然後有帶 admin 權限的 cmd 就跳出來了,
這樣我們就成功 UAC Bypass 了。

補充:這個手法主要適用於 Windows 10 上的特定版本。sdclt.exe 的 manifest 在 Windows 10 才標記為 auto-elevate(Windows 7 的 requestedExecutionLevel 是 AsInvoker),而且微軟在後續的 Windows 版本已陸續修復這類透過 HKCU 檔案關聯劫持 auto-elevate 程式的手法,在已更新的 Windows 11 上通常無法復現。

結論!


這邊也就整理一下 Sdclt.exe 在攻擊方面的一些優勢:

  • 不需要下載任何東西
  • 不需要網路連線
  • 使用內建 Windows 工具,不易被過濾

Share this page