如何使用SilentCleanup繞過UAC?

0x00 前言

最近我在James Forshaw?的博客學到了一個Win10下繞過UAC的技巧,該方法通過腳本實現,並且目前微軟還未對該繞過方法進行修復(預計在Win10 RS3修復)。經過我的學習測試,該方法同樣適用於Win8,並且文中介紹的繞過思路很值得學習,因此整理成文,分享給大家。

文章地址如下:

tyranidslair.blogspot.co.uk

0x01 簡介

本文將要介紹以下內容:

繞過思路

利用方法

0x02 繞過思路

在之前文章也分享過一些繞過UAC思路的心得,可參考以下文章:

Study Notes of using sdclt.exe to bypass UACStudy Notes Weekly No.1(Monitor WMI & ExportsToC++ & Use DiskCleanup bypass UAC)

個人認為尋找繞過UAC的方法可分為以下兩個步驟:

1、尋找許可權控制不嚴格的程序

通常具有以下特點:

以普通用戶許可權啟動程序

程序默認以高許可權啟動,通常標記為Highest

2、該程序啟動過程是否可被劫持

啟動路徑是否可被劫持

啟動過程載入的問題(如dll)是否可被劫持

0x03 利用方法

對應到James Forshaw?的方法,也是優先尋找許可權控制不嚴格的程序——計劃任務中的SilentCleanup

註:

Matt Nelson之前也介紹過一個利用SilentCleanup繞過UAC的方法,目前已被修復,文章地址如下:

Bypassing UAC on Windows 10 using Disk Cleanup

計劃任務中的SilentCleanup:

普通用戶許可權即可啟動

啟動後自動提升為高許可權

通過Powershell可以獲取更多細節,代碼如下:

$task = Get-ScheduledTask SilentCleanupn$task.Principaln

註:

Win7默認powershell版本2.0,不支持Get-ScheduledTask操作

如下圖

Authenticated Users表示普通用戶許可權即可啟動

RunLevel為Highest表示以高許可權啟動

查看啟動參數,powershell代碼如下:

$task.Actions[0]n

如下圖

啟動參數為%windir%system32cleanmgr.exe

這裡存在一個可供利用的地方——環境變數%windir%

註:

可通過set windir查看環境變數%windir%

%windir%默認指向c:Windows

如果修改當前系統環境變數,指向其他路徑,那麼這裡就實現了一個劫持

例如:

將%windir%設置為c:test

在c:testsystem32下將payload.exe保存為cleanmgr.exe

那麼在啟動計劃任務SilentCleanup時,就會以高許可權啟動payload.exe,實現了UAC繞過

更直接的利用方法:

將%windir%設置為cmd /K,那麼在啟動計劃任務SilentCleanup時會彈出cmd.exe

注:

cmd後面需要加參數,否則由於參數問題導致無法正常啟動

/k表示彈出的cmd.exe在執行代碼後不退出

為了增加隱蔽性(很多程序在啟動時需要調用環境變數%windir%),在執行cmd的需要同時刪除新添加的註冊表鍵值windir,可以使用如下代碼:

reg add hkcuEnvironment /v windir /d "cmd /K reg delete hkcuEnvironment /v windir /f && REM "nschtasks /Run /TN MicrosoftWindowsDiskCleanupSilentCleanup /In

註:

以上代碼來自於gist.github.com/tyranid

將環境變數設置為cmd /K reg delete hkcuEnvironment /v windir /f && REM,那麼在啟動計劃任務SilentCleanup時會彈出cmd.exe,接著執行刪除註冊表鍵值的命令:reg delete hkcuEnvironment /v windir /f

完整操作如下圖(gif圖)

注:

參數如果換成/a,那麼cmd.exe在執行後面的命令後會立即退出

0x04 防禦檢測

1、防禦

修改計劃任務SilentCleanup的啟動參數,將環境變數去掉,換成c:Windows,鎖定路徑

管理員許可權:

$action = New-ScheduledTaskAction -Execute $env:windirSystem32cleanmgr.exe -Argument "/autoclean /d $env:systemdrive"nSet-ScheduledTask SilentCleanup -TaskPath MicrosoftWindowsDiskCleanup -Action $actionn

註:

以上代碼來自於gist.github.com/tyranid

如下圖

計劃任務SilentCleanup的啟動參數被修改為c:windowssystem32cleanmgr.exe,無法通過修改環境變數%windir%對其劫持

2、檢測

通過powershell尋找計劃任務中是否還存在可供利用的服務,代碼如下:

$tasks = Get-ScheduledTask | n Where-Object { $_.Principal.RunLevel -ne "Limited" -and n $_.Principal.LogonType -ne "ServiceAccount" -and n $_.State -ne "Disabled" -and n $_.Actions[0].CimClass.CimClassName -eq "MSFT_TaskExecAction" }n

註:

以上代碼來自於gist.github.com/tyranid

如下圖,可供利用的服務一共有四個,經測試,其他三個無法實際利用,只有SilentCleanup有效

0x05 補充

該方法同樣適用於Win8環境,完整操作如下圖(gif圖)

Win7系統不包含計劃任務SilentCleanup,因此無法利用

0x06 小結

本文介紹了通過計劃任務SilentCleanup繞過UAC的方法,該方法僅需要通過腳本向當前用戶註冊表寫入鍵值即可,簡單有效。

本文為 3gstudent 原創稿件,授權嘶吼獨家發布,未經許可禁止轉載,如若轉載,請聯繫嘶吼編輯:t如何使用SilentCleanup繞過UAC? 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

Windows惡意軟體API調用特徵分析
初探域滲透神器Empire
如何處理格式為ACE的惡意軟體文件?
厚客戶端滲透測試實戰(三)

TAG:技术分析 | UAC | 信息安全 |