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

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展:人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点:数据的管理者(DBMS);数据结构化;数据共享性高,冗余度低,易于扩充;数据独立性高。DBMS 对数据的控制功能:数据的安全性保护;数据的完整性检查;并发控制;数据库恢复。 数据库技术研究领域:数据库管理系统软件的研发;数据库设计;数据库理论。数据模型要素 数据结构:描述数据库

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

计算机组成原理——RECORD

第一章 概论 1.固件  将部分操作系统固化——即把软件永恒存于只读存储器中。 2.多级层次结构的计算机系统 3.冯*诺依曼计算机的特点 4.现代计算机的组成:CPU、I/O设备、主存储器(MM) 5.细化的计算机组成框图 6.指令操作的三个阶段:取指、分析、执行 第二章 计算机的发展 1.第一台由电子管组成的电子数字积分和计算机(ENIAC) 第三章 系统总线

GaussDB关键技术原理:高性能(二)

GaussDB关键技术原理:高性能(一)从数据库性能优化系统概述对GaussDB的高性能技术进行了解读,本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。 2 查询处理综述 内容概要:本章节介绍查询端到端处理的执行流程,首先让读者对查询在数据库内部如何执行有一个初步的认识,充分理解查询处理各阶段主要瓶颈点以及对应的解决方案,本章以GaussDB为例讲解查询执行的几个主要阶段

XMG xib中不属于一个类的控件,拖线到指定的类中

1.比如我现在有一个view绑定为GreenView,我们按住control向类里面拖线的方式想要达到目的,显然拖不进去。例图如下 那么我们此时还想要达到目的,就需要自己去GreenView的类内部去写IBo 然后这面连接起来 2.第二,大哥郝良建给做的扩展 可以在.h或者.m中写一个NSObject的属性 然后在xib中对应的位置创建一个NSObject的属性

MybatisPlus指定字段查询

一,上代码 QueryWrapper<Device> queryWrapper = Wrappers.query();queryWrapper.select("project_id as projectId,count(device_id) as total").in("project_id",projectIds).isNotNull("project_id").eq("del_flag",B

【计算机组成原理】部分题目汇总

计算机组成原理 部分题目汇总 一. 简答题 RISC和CICS 简要说明,比较异同 RISC(精简指令集)注重简单快速的指令执行,使用少量通用寄存器,固定长度指令,优化硬件性能,依赖软件(如编译器)来提升效率。 CISC(复杂指令集)包含多样复杂的指令,能一条指令完成多步操作,采用变长指令,减少指令数但可能增加执行时间,倾向于硬件直接支持复杂功能减轻软件负担。 两者均追求高性能,但RISC

MySQL数据库锁的实现原理

MySQL数据库的锁实现原理主要涉及到如何确保在多用户并发访问数据库时,保证数据的完整性和一致性。以下是MySQL数据库锁实现原理的详细解释: 锁的基本概念和目的 锁的概念:在数据库中,锁是用于管理对公共资源的并发控制的机制。当多个用户或事务试图同时访问或修改同一数据时,数据库系统通过加锁来确保数据的一致性和完整性。 锁的目的:解决多用户环境下保证数据库完整性和一致性的问题。在并发的情况下,会