1. UAC 简介

    UAC(User Account Control,用户账号控制)是微软为了提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。

    在Windows Vista及以后的版本中,微软设置了安全控制策略,分为高、中、低三个等级。

    • 高等级的进程有管理员权限;

    • 中等级的进程有普通用户权限;

    • 低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。

     在权限不够的情况下,访问系统磁盘的根目录( 例如 C:\)、Windows目录,以及读写系统登录数据库等操作,都需要经常UAC(User Account Control,用户账号控制)的认证,如图所示:Windows提权-BypassUAC之劫持注册表实验_java

需要UAC的授权才能进行的操作列表如下:

  • 配置Windows Update

  • 增加、删除账户

  • 更改账户类型

  • 更改UAC的设置

  • 安装ActiveX

  • 安装、卸载程序

  • 安装设备驱动程序

  • 将文件移动/复制到Program Files或Windows目录下

  • 查看其它用户的文件夹

  • ...

UAC有如下四种设置要求:

  • 始终通知:

    这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户

  • 仅在程序试图更改我的计算机时通知我:

    这是UAC的默认设置。

    当本地Windows程序要使用高级别的权限时,不会通知用户。

    但是,当第三方程序要使用高级别的权限时,会提示本地用户

  • 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):

    与上一条设置的要求相同,但在提示用户时不降低桌面的亮度

  • 从不提示:

    当用户为系统管理员时,所有程序都会以最高权限运行

Windows提权-BypassUAC之劫持注册表实验_java_02

2. 利用系统自带的UAC白名单程序提权

    用户账户控制限制着程序使用高级权限才能进行的操作,但是UAC同样也会对系统本身的程序造成影响,微软也不希望运行系统程序也需要询问用户,因为系统程序是安全的。因此,微软则在 UAC 中添加了白名单机制,即在系统中记录有一张表单,表单中的系统程序,将不限制其直接提升到管理员权限。系统中的白名单程序有多个,其中,msconfig、taskmgr、perfmon、cleanmgr 等平时常用的程序都在其中。操作系统的UAC白名单程序,默认以管理员权限运行,而且不弹出UAC窗口确认。这些白名单程序,都具有微软的签名是操作系统可信的。

    所以我们可以找一些以高权限运行的,但是并没有UAC提示的进程,然后利用Process Monitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。

    以高权限运行的进程图标一般有如下标志:

Windows提权-BypassUAC之劫持注册表实验_java_03

3. 怎么找这些白名单程序

    需要用到的工具



sigcheck.exe:https://docs.microsoft.com/zhcn/sysinternals/downloads/sigcheckstrings.exe:https://docs.microsoft.com/zhcn/sysinternals/downloads/strings

    白名单程序都有一个特性,就是它们都具有autoElevate属性,该属性可由特定工具查看。

    利用微软工具Sigcheck检测程序是否具有autoElevate属性,以eventvwr.exe为例,该程序位于C:\Windows\System32\目录下。

使用微软的 工具去查看


sigcheck64.exe -m C:\Windows\System32\eventvwr.exe

Windows提权-BypassUAC之劫持注册表实验_java_04

    使用strings.exe工具找出所有具有autoElevate属性的程序,将strings.exe放在C:\Windows\System32目录下


strings.exe -s *.exe | findstr /i autoelevate

Windows提权-BypassUAC之劫持注册表实验_java_05

    系统在调用这些高权限程序时,会调用HKCR(HKEY_CLASSES_ROOT)下的键值。所以,修改HKCR(HKEY_CLASSES_ROOT)下的键值,把原本的键值改为 cmd.exe 等 shell 程序,如果高权限的程序,在运行过程中调用此处被修改过的键值,就会以高权限启动我们设定的程序。从而实现绕过 UAC提权。而此问题的难点在于找到注册表的关键位置。

4. 如何找对应的注册表?以事件查看器(eventvwr)为例

    需要用到的工具和可能用到的补丁:



Process Monitor :https://docs.microsoft.com/zh-cn/sysinternals/downloads/procmon补丁:https://www.microsoft.com/en-us/download/confirmation.aspx?id=46148

    接下来使用 Process Monitor 工具来查看eventvwr运行时,会调用哪些文件、查询哪些注册表地址。(win7 上无法使用 提示:unable to load Process Monitor device driver,更新上面补丁即可)

    1、打开Process Monitor工具后,设置过滤规则,选择工具栏”Filter” ⇒ “Filter…”

Windows提权-BypassUAC之劫持注册表实验_java_06

    设置过滤规则,”Process Name” “is” “eventvwr.exe”,然后点击Add添加规则,之后点击Apply应用和OK即可

Windows提权-BypassUAC之劫持注册表实验_java_07

    运行eventvwr.exe,之后查看Process Monitor ,会出现一堆东西,而且右键Properties 可以看到eventvwr.exe权限为high

Windows提权-BypassUAC之劫持注册表实验_java_08

Windows提权-BypassUAC之劫持注册表实验_java_09

    难点就在于从这一堆东西中找到注册表的关键位置,这里我也并不熟悉,通过查找搜索,发现关键点为:

Windows提权-BypassUAC之劫持注册表实验_java_10



HKCU\Software\Classes\mscfile\shell\open\commandHKCR\mscfile\shell\open\command


    在进程 eventvwr.exe 启动的时候,首先查找注册表位置HKCU\Software\Classes\mscfile\shell\open\command。如果该处为空,接着查找注册表位置HKCR\mscfile\shell\open\command(此处默认值为%SystemRoot%\system32\mmc.exe "%1" %*),以高权限启动 mmc.exe,最后打开 eventvwr.msc

    这里由结果向原因推导:发现关键字,shellcommand

    搞站不就是拿shell,执行命令,这里不就是执行命令的点吗?!

4.1 测试

    如果修改键值HKCU\Software\Classes\mscfile\shell\open\command,使其查询结果为 SUCCESS,会如何呢?

    首先需要修改键值HKCU\Software\Classes\mscfile\shell\open\command,为测试可以把值改为 calc.exe, 打开运行,执行regedit





注册表内:    HKCU = HKEY_CURRENT_USER    HKLM = HKEY_LOCAL_MACHINE    HKCR = HKEY_CLASSES_ROOT

    在Win7 中 我这里的 regedit 中的键值只到 HKCU\Software\Classes\ 这层目录,所以我新增了后面的表项,并把值设为C:\Windows\System32\calc.exe

Windows提权-BypassUAC之劫持注册表实验_java_11

    再重新启动eventvwr.exe,成功弹出计算器

Windows提权-BypassUAC之劫持注册表实验_java_12

    并且使用Process Monitor 查看权限,也是high

Windows提权-BypassUAC之劫持注册表实验_java_13

    而正常启动计算器

Windows提权-BypassUAC之劫持注册表实验_java_14

实验成功,成功绕过 UAC。

4.2 实战

    修改键值HKCU\Software\Classes\mscfile\shell\open\command,为msf生成的exe,之后运行eventvwr.exe

Windows提权-BypassUAC之劫持注册表实验_java_15

    一句话修改注册表,将d:\1.exe改为msf的exe地址,复制到命令行执行即可


reg add "HKCU\Software\Classes\mscfile\shell\open\command" /d d:\1.exe /f   #1.exe为msf马

    如果直接执行shell.exe,反弹回来的会话不能通过getsystem直接提权,因为会被UAC拦截

Windows提权-BypassUAC之劫持注册表实验_java_16

    劫持注册表后,再次执行程序就会去查找劫持的注册表地址,然后以自动提权之后的管理员权限加载shell.exe,此时反弹回来的会话可通过getsystem直接提权

Windows提权-BypassUAC之劫持注册表实验_java_17

    最后记得清除注册表项


reg delete "HKCU\Software\Classes\mscfile\shell\open\command"

    需要注意的是,执行eventvwr命令时才会去注册表查找mmc.exe的路径,如果执行的是mmc.exe eventvwr.msc,直接加载mmc.exe,是不会去查询注册表的。