CreateProcessAsUser之创建进程时指定父进程与UAC(UAC原理)

2024-02-24 10:18

本文主要是介绍CreateProcessAsUser之创建进程时指定父进程与UAC(UAC原理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UAC

UAC(user account control),这里科普下UAC的功能,其实UAC就是大家常见的安装软件或者启动程序的时候的出现的全屏变暗的一个提示框,正常的UAC级别下,会检测程序是否有数字签名(可识别程序),以及他的数字签名是否合法,这对于一部分低端的木马具有提醒作用,所以除非特殊情况,不要乱对UCA降权。
在这里插入图片描述

UAC运行原理:

在Windows Vista操作系统中。
用户账户主要有两种:标准用户(stand user) 和 管理员用户 (administrator)
一般在计算机上创建的第一个用户将成为管理员,后续用户默认设置为标准用户。

为什么要有UAC
Windows Vista以前的操作系统,一旦以管理员身份登录的用户被攻破,那就权限崩溃,所以用户们不得不使用标准用户身份登录,一些特殊情况才使用管理员权限。

而有了UAC 用户不在需要专门以标准用户去登录。

因为当一个标准用户登录到计算机时,Vista将创建一个新的登录会话,并通过一个操作系统创建的、与刚刚创建的这个登录会话相关联的shell程序(例如Windows Explorer)作为访问令牌颁发给用户。

而当一个管理员登录到计算机时,Windows Vista的处理方式却与先前版本的Windows有所不同。虽然系统创建了一个新的登录会话,但却为该登录会话创建了两个不同的访问令牌,而不是先前版本中的一个。第一个访问令牌提供了管理员所有的许可和权限,而第二个就是所谓的“受限访问令牌”,有时候也叫做“过滤访问令牌(filtered token)",该令牌提供了少得多的许可和权限。实际上,受限访问令牌所提供的访问权限和标准用户的令牌没什么区别。然后系统将使用该受限访间令牌创建 shell应用程序。这也就意味着即使用户是以管理员身份登录的,其默认的运行程序许可和权限仍为标准用户。

若是该管理员需要执行某些需要额外许可和权限的、并不在受限访间令牌提供权限之内的操作,那么他/她可以选择使用非限制访问令牌所提供的安全上下文来运行该应用程序。在由受限访问令牌“提升到非限制访间令牌的过程中,Windows Vista将通过给管理员提示的方式确认该操作,以其确保计算机系统的安全。恶意代码不可能绕过该安全提示并在用户不知不觉中得到对计算机的完整控制。

UAC提权

进程完整性级别,系统的每个进程有相应的完整性级别标志,与资源的完整性级别相互验证,以提供额外的安全保护。

用户态进程可以设置如下四种完整性级别:

1.Low
2.Medium
3.High
4.System

管理员的标准用户模式下(未提升)是(Medium)完整性级别
经过提升后拥有高(High)完整性级别。
运行于Local System之下的账户拥有(System)完整性级别

提权简单流程:

  1. 获取需要查询的进程的访问令牌
  2. 根据令牌获取指定类型信息,得到表示完整性级别的SID
  3. 根据该进程的SID,决定是否需要用户确认,然后进行提权。

《深入解析Windows操作系统》里面讲解了UAC的原理,里面的意思是这样解释UAC提权的:

当用户允许一次UAC提权时,AIS服务(AppInfo Service)调用的CreateProcessAsUser() 函数创建进程并且赋予恰当的管理员权限,在理论上说AIS服务(所在的进程)是提权后辣个进程的父进程。

然而,当我们用一些进程查看管理工具 进行查看时,会发现已经被提权的进程,它的父进程是创建它的进程,而不是AIS服务(所在的进程)。

这是因为AIS利用了CreateProcessAsUser() API中的一个新的功能,这里的新功能就是将要被提权的进程的父进程设置成创建该进程的进程,如果我们利用一下该API,就可以把一个进程的父进程设置为任意进程。

如果把木马进程的父进程设置为 杀软 或者csrss.exe ,notepad.exe 等可信进程,那么对于依据父进程可疑(进程链)来查杀的杀软就轻易绕过了。(360绕不过,估计慢慢的都会意识到这点)。

下面的代码就是关于CreateProcessAsUser()的使用:

原理->MSDN:
如果是CreateProcessAsUser 的dwCreationFlags 的参数被设置为EXTENDED_STARTUPINFO_PRESENT, 这就是有扩展启动信息的结构体,
这里的IpStartupInfo参数需要填好STARTUPEX 结构
这个结构由STARTUOINFO结构和PROC_THREAD_ATTRIBUTE_LIST 指针构成

typedef struct _STARTUPINFOEX {STARTUPINFO                 StartupInfo;PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;
} STARTUPINFOEX, *LPSTARTUPINFOEX;

也就是说,调用CreateProcessAsUser 且设置dwCreationFlags参数的值为EXTENDED_STARTUPINFO_PRESENT,此时再将结构体中的PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList 值设置目标父进程的属性。

下面看具体代码:

//一般情况下,创建子进程的进程 就是子进程的父进程。而这部分代码功能: 去指定任何一个有相应权限的进程为新创建进程的父进程#include <iostream>
#include <Windows.h>
#include <Tlhelp32.h> //因为Tlhelp32.h 中一些宏定义是在windows.h中定义的,所以Tlhelp32.h 要定义在windows.h的后面
#pragma comment(lib, "Advapi32.lib")int main()
{
/LPVOID pAlloc1;LPVOID pAlloc2;HANDLE hfile;PIMAGE_NT_HEADERS pPeHeader;PIMAGE_SECTION_HEADER pSectionHeader;int lastError, ReadInfo = 0;DWORD BytesRead = 0;CONTEXT Context = { 0 };Context.ContextFlags = CONTEXT_ALL;PROCESSENTRY32 pe;// explorer.exe的进程IDDWORD  pid = 0;HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);pe.dwSize = sizeof(PROCESSENTRY32);if (!Process32First(hSnapshot, &pe))return 0;do{pe.dwSize = sizeof(PROCESSENTRY32);if (Process32Next(hSnapshot, &pe) == FALSE)break;if (wcscmp(pe.szExeFile, L"cmd.exe") == 0){pid = pe.th32ProcessID;break;}} while (1);CloseHandle(hSnapshot);/* 以全部权限打开explorer.exe 进程 */HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);/* 创建启动信息结构体 */STARTUPINFOEXA si;/* 初始化结构体 */ZeroMemory(&si, sizeof(si));/* 设置结构体成员 */si.StartupInfo.cb = sizeof(si);SIZE_T lpsize = 0;/* 用微软规定的特定的函数初始化结构体 */InitializeProcThreadAttributeList(NULL, 1, 0, &lpsize);//首先要获取到需要初始化的大小char * temp = new char[lpsize];/* 转换指针到正确类型 */LPPROC_THREAD_ATTRIBUTE_LIST AttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)temp;/* 真正为结构体初始化属性参数 */InitializeProcThreadAttributeList(AttributeList, 1, 0, &lpsize);//设置AttributeList结构体属性个数以及初始化它的大小/* 用已构造的属性结构体更新属性表 */if (!UpdateProcThreadAttribute(AttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &handle, sizeof(HANDLE), NULL, NULL)){//更新AttrubuteList 属性,添加PROC_THREAD_ATTRIBUTE_PARENT_PROCESS属性printf("UpdateProcThreadAttribute failed ! (%d).\n", GetLastError());}/* 移交指针,这里已更换了父进程的属性表是 explorer.exe */si.lpAttributeList = AttributeList;PROCESS_INFORMATION pi;ZeroMemory(&pi, sizeof(pi));//当调用下面的api 且createFlags的参数是EXTENDED_STARTUPINFO_PRESENT时,lpStartupInfo就需要有扩展的信息,也就是这条属性:PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;if (CreateProcessAsUserA(NULL, 0, "C:\\Users\\Administrator\\Desktop\\Play.exe", 0, 0, 0, EXTENDED_STARTUPINFO_PRESENT, 0, 0, (LPSTARTUPINFOA)&si, &pi)){printf("CreateProcessAsUserA success !  \n");}else{printf("CreateProcessAsUserA failed ! (%d). \n ", GetLastError());}/* 处理后事 */DeleteProcThreadAttributeList(AttributeList);delete temp;printf("exit");getchar();return 0;
}

UAC绕过有些复杂呀,以后有机会试试。
关于绕过UAC的文章链接:
https://www.freebuf.com/vuls/183914.html

这篇关于CreateProcessAsUser之创建进程时指定父进程与UAC(UAC原理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741784

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P