windows 进程降权和提权代码示例(2) c++

强制完整性控制 - Win32 应用程序 |Microsoft 学习

一、强制完整性控制

  • 03/26/2021
  • 7 个参与者
反馈

本文内容

  1. 诚信标签
  2. 进程创建
  3. 强制性政策

强制完整性控制 (MIC) 提供了一种用于控制对安全对象的访问的机制。此机制是对自主访问控制的补充,在根据对象的自主访问控制列表 (DACL) 评估访问检查之前评估访问权限。

MIC 使用完整性级别和强制策略来评估访问权限。为安全主体和安全对象分配完整性级别,以确定其保护或访问级别。例如,具有低完整性级别的主体无法写入具有中等完整性级别的对象,即使该对象的 DACL 允许对主体进行写入访问。

Windows 定义了四个完整性级别:低、中、高和系统。标准用户接收中等,高级用户接收高。您启动的进程和您创建的对象将获得您的完整性级别(中或高),如果可执行文件的级别较低,则为低;系统服务接收系统完整性。缺少完整性标签的对象将作系统视为中等对象;这可以防止低完整性代码修改未标记的对象。此外,Windows 确保以低完整性级别运行的进程无法访问与应用程序容器关联的进程。

诚信标签

完整性标签指定安全对象和安全主体的完整性级别。完整性标签由完整性 SID 表示。安全对象的完整性 SID 存储在其系统访问控制列表 (SACL) 中。SACL 包含一个 SYSTEM_MANDATORY_LABEL_ACE 访问控制条目 (ACE),该条目又包含完整性 SID。任何没有完整性 SID 的对象都被视为具有中等完整性。

安全主体的完整性 SID 存储在其访问令牌中。访问令牌可以包含一个或多个完整性 SID。

有关定义的完整性 SID 的详细信息,请参阅已知 SID。

进程创建

当用户尝试启动可执行文件时,将创建新进程,并将用户完整性级别和文件完整性级别降至最低。这意味着新进程的执行永远不会比可执行文件的完整性更高。如果管理员用户执行低完整性程序,则新进程的令牌将以低完整性级别运行。这有助于保护启动不可信代码的用户免受该代码执行的恶意行为的侵害。用户数据处于典型的用户完整性级别,针对此新进程进行写保护。

强制性政策

安全对象 SACL 中的 SYSTEM_MANDATORY_LABEL_ACE ACE 包含一个访问掩码,该掩码指定向完整性级别低于对象的主体授予的访问权限。为此访问掩码定义的值为 SYSTEM_MANDATORY_LABEL_NO_WRITE_UPSYSTEM_MANDATORY_LABEL_NO_READ_UP 和 SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP。默认情况下,系统使用 SYSTEM_MANDATORY_LABEL_NO_WRITE_UP 访问掩码创建每个对象。

每个访问令牌还指定一个强制策略,该策略在创建令牌时由本地安全机构 (LSA) 设置。此策略由与令牌关联的 TOKEN_MANDATORY_POLICY 结构指定。可以通过调用 GetTokenInformation 函数来查询此结构,并将 TokenInformationClass 参数的值设置为 TokenMandatoryPolicy

二、降至指定权限运行进程办法:设置进程完整性级别即可。

// showpriv_03.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <sddl.h>
#pragma comment(lib, "Advapi32.lib")void CreateIntegritySidProcess(LPCWSTR wszIntegritySid)
{BOOL bRet = FALSE;HANDLE hToken = NULL;HANDLE hNewToken = NULL;// Notepad is used as an exampleWCHAR wszProcessName[MAX_PATH] = L"C:\\Windows\\System32\\Notepad.exe";PSID pIntegritySid = NULL;TOKEN_MANDATORY_LABEL TIL = { 0 };PROCESS_INFORMATION ProcInfo = { 0 };STARTUPINFO StartupInfo = { 0 };ULONG ExitCode = 0;__try{if (FALSE == OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &hToken)){__leave;}//复制tokenif (FALSE == DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,SecurityImpersonation, TokenPrimary, &hNewToken)){__leave;}//根据已知sid获取完整性级别TIL.Label.Sid
/*
// Mandatory Label Authority.
#define SECURITY_MANDATORY_LABEL_AUTHORITY          {0,0,0,0,0,16}
#define SECURITY_MANDATORY_UNTRUSTED_RID            (0x00000000L)
#define SECURITY_MANDATORY_LOW_RID                  (0x00001000L)
#define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
#define SECURITY_MANDATORY_MEDIUM_PLUS_RID          (SECURITY_MANDATORY_MEDIUM_RID + 0x100)
#define SECURITY_MANDATORY_HIGH_RID                 (0x00003000L)
#define SECURITY_MANDATORY_SYSTEM_RID               (0x00004000L)
#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    (0x00005000L)
*/if (FALSE == ConvertStringSidToSid(wszIntegritySid, &pIntegritySid)){__leave;}TIL.Label.Attributes = SE_GROUP_INTEGRITY;TIL.Label.Sid = pIntegritySid;// Set the process integrity levelif (FALSE == SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL,sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid))){__leave;}bRet = CreateProcessAsUser(hNewToken, NULL,wszProcessName, NULL, NULL, FALSE,0, NULL, NULL, &StartupInfo, &ProcInfo);}__finally{if (NULL != pIntegritySid){LocalFree(pIntegritySid);pIntegritySid = NULL;}if (NULL != hNewToken){CloseHandle(hNewToken);hNewToken = NULL;}if (NULL != hToken){CloseHandle(hToken);hToken = NULL;}}printf("%ls bRet:%d\n", wszIntegritySid, bRet);//%ls打印宽字符
}int _tmain(int argc, _TCHAR* argv[])
{// INTEGRITY_LEVEL_SYSTEM:      "S-1-16-16384" System Mandatory Level
// INTEGRITY_LEVEL_HIGH:        "S-1-16-12288" High Mandatory Level
// INTEGRITY_LEVEL_MEDIUM:      "S-1-16-8192"  Medium Mandatory Level
// INTEGRITY_LEVEL_MEDIUM_LOW:  "S-1-16-6144"
// INTEGRITY_LEVEL_LOW:         "S-1-16-4096"  Low Mandatory Level
// INTEGRITY_LEVEL_BELOW_LOW:   "S-1-16-2048"
// INTEGRITY_LEVEL_UNTRUSTED:   "S-1-16-0"     Untrusted Mandatory Level//
// Mandatory Label Authority.
//
/*
#define SECURITY_MANDATORY_LABEL_AUTHORITY          {0,0,0,0,0,16}
#define SECURITY_MANDATORY_UNTRUSTED_RID            (0x00000000L)
#define SECURITY_MANDATORY_LOW_RID                  (0x00001000L)
#define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
#define SECURITY_MANDATORY_MEDIUM_PLUS_RID          (SECURITY_MANDATORY_MEDIUM_RID + 0x100)
#define SECURITY_MANDATORY_HIGH_RID                 (0x00003000L)
#define SECURITY_MANDATORY_SYSTEM_RID               (0x00004000L)
#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    (0x00005000L)*///创建不同权限的进程CreateIntegritySidProcess(L"S-1-16-16384");//system权限进程CreateIntegritySidProcess(L"S-1-16-12288");//high权限进程CreateIntegritySidProcess(L"S-1-16-8192");//medium权限进程CreateIntegritySidProcess(L"S-1-16-4096");//low权限进程CreateIntegritySidProcess(L"S-1-16-6144");//INTEGRITY_LEVEL_MEDIUM_LOWCreateIntegritySidProcess(L"S-1-16-2048");//INTEGRITY_LEVEL_BELOW_LOWCreateIntegritySidProcess(L"S-1-16-0");//INTEGRITY_LEVEL_UNTRUSTEDsystem("puase");return 0;
}

三、看下实际效果:

注意:DuplicateTokenEx [in] TokenType主令牌和模拟令牌限制,具体参考官网介绍:
        if (FALSE == DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
            SecurityImpersonation, TokenPrimary, &hNewToken))
        {
            __leave;
        }

DuplicateTokenEx 函数 (securitybaseapi.h) - Win32 apps | Microsoft Learn

四、DuplicateTokenEx 函数 (securitybaseapi.h)

  • 项目
  • 2023/08/25

反馈

本文内容

  1. 语法
  2. parameters
  3. 返回值
  4. 注解

显示另外 2 个

DuplicateTokenEx 函数创建一个复制现有令牌的新访问令牌。 此函数可以创建 主令牌 或 模拟令牌。

语法

C++复制

BOOL DuplicateTokenEx([in]           HANDLE                       hExistingToken,[in]           DWORD                        dwDesiredAccess,[in, optional] LPSECURITY_ATTRIBUTES        lpTokenAttributes,[in]           SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,[in]           TOKEN_TYPE                   TokenType,[out]          PHANDLE                      phNewToken
);

parameters

[in] hExistingToken

使用TOKEN_DUPLICATE访问权限打开的访问令牌的句柄。

[in] dwDesiredAccess

指定新令牌的请求访问权限。 DuplicateTokenEx 函数将请求的访问权限与现有令牌的任意访问控制列表 (DACL) 进行比较,以确定授予或拒绝了哪些权限。 若要请求与现有令牌相同的访问权限,请指定零。 若要请求对调用方有效的所有访问权限,请指定MAXIMUM_ALLOWED。

有关访问令牌访问权限的列表,请参阅 Access-Token 对象的访问权限。

[in, optional] lpTokenAttributes

指向 SECURITY_ATTRIBUTES 结构的指针,该结构指定新令牌 的安全描述符 ,并确定子进程是否可以继承令牌。 如果 lpTokenAttributes 为 NULL,则令牌将获取默认安全描述符,并且无法继承句柄。 如果安全描述符包含 系统访问控制列表 (SACL) ,则令牌ACCESS_SYSTEM_SECURITY访问权限,即使 未在 dwDesiredAccess 中请求也是如此。

若要在新令牌的安全描述符中设置所有者,调用方的进程令牌必须具有 SE_RESTORE_NAME 权限集。

[in] ImpersonationLevel

指定 SECURITY_IMPERSONATION_LEVEL 枚举中的值,该值指示新标记的模拟级别。

[in] TokenType

指定 TOKEN_TYPE 枚举中的下列值之一。

展开表

含义

TokenPrimary

新令牌是可在 CreateProcessAsUser 函数中使用的主令牌。

TokenImpersonation

新令牌是模拟令牌。

[out] phNewToken

指向接收新令牌的 HANDLE 变量的指针。

使用完新令牌后,调用 CloseHandle 函数以关闭令牌句柄。

返回值

如果函数成功,该函数将返回非零值。

如果函数失败,则返回零。 要获得更多的错误信息,请调用 GetLastError。

注解

DuplicateTokenEx 函数允许创建可在 CreateProcessAsUser 函数中使用的主令牌。 这允许模拟客户端的服务器应用程序创建具有客户端 安全上下文 的进程。 请注意, DuplicateToken 函数只能创建对 CreateProcessAsUser 无效的模拟令牌。

下面是使用 DuplicateTokenEx 创建 主令牌的典型方案。 服务器应用程序创建一个线程,该线程调用某个模拟函数(如 ImpersonateNamedPipeClient)来模拟客户端。 然后,模拟线程调用 OpenThreadToken 函数来获取自己的令牌,该令牌是具有客户端安全上下文的 模拟令牌 。 线程在调用 DuplicateTokenEx 时指定此模拟令牌,并指定 TokenPrimary 标志。 DuplicateTokenEx 函数创建具有客户端安全上下文的主令牌

授权) (模拟级别 - Win32 apps | Microsoft Learn

五、(授权) (模拟级别)

  • 项目
  • 2023/06/13
  • 6 个参与者

反馈

SECURITY_IMPERSONATION_LEVEL枚举定义了四个模拟级别,用于确定服务器可以在客户端上下文中执行的操作。

展开表

模拟级别说明
SecurityAnonymous服务器无法模拟或标识客户端。
SecurityIdentification服务器可以获取客户端的标识和特权,但不能模拟客户端。
SecurityImpersonation服务器可以在本地系统上模拟客户端的安全上下文。
SecurityDelegation服务器可以在远程系统上模拟客户端的安全上下文。

命名管道、RPC 或 DDE 连接的客户端可以控制模拟级别。 例如,命名管道客户端可以调用 CreateFile 函数以打开命名管道的句柄并指定服务器的模拟级别。

当命名管道、RPC 或 DDE 连接是远程连接时,将忽略传递给 CreateFile 以设置模拟级别的标志。 在这种情况下,客户端的模拟级别由服务器启用的模拟级别确定,该级别由目录服务中的服务器帐户上的标志设置。 例如,如果为服务器启用了委派,则客户端的模拟级别也将设置为委派,即使传递给 CreateFile 的标志指定了标识模拟级别。

DDE 客户端使用具有 SECURITY_QUALITY_OF_SERVICE 结构的 DdeSetQualityOfService 函数来指定模拟级别。 SecurityImpersonation 级别是命名管道、RPC 和 DDE 服务器的默认值。 ImpersonateSelf、DuplicateToken 和 DuplicateTokenEx 函数允许调用方指定模拟级别。 使用 GetTokenInformation 函数检索 访问令牌的模拟级别。

在 SecurityImpersonation 级别,线程的大多数操作发生在线程模拟令牌的安全上下文中,而不是发生在拥有线程的进程的主令牌中。 例如,如果模拟线程打开安全对象,则系统会使用模拟令牌来检查线程的访问。 同样,如果模拟线程创建新对象(例如通过调用 CreateFile 函数),则新对象的所有者是客户端 访问令牌的默认所有者。

但是,在以下情况下,系统使用进程的主令牌,而不是调用线程的模拟令牌:

  • 如果模拟线程调用 CreateProcess 函数,则新进程始终继承进程的主标记。
  • 对于需要 SE_TCB_NAME 特权的函数(例如 LogonUser 函数),系统始终检查进程主令牌中的特权。
  • 对于需要SE_AUDIT_NAME特权的函数(例如 ObjectOpenAuditAlarm 函数),系统始终检查进程主令牌中的特权。
  • 在调用 OpenThreadToken 函数时,线程可以指定函数是使用模拟令牌还是主令牌来确定是否授予请求的访问权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/6908.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python的旅游景点推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【C++】vector 类深度解析:探索动态数组的奥秘

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 如果你对string类还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; &#x1f449;【C】string 类深度解析&#xff1a;…

Hugging Face 平台轻松上手 | 书生大模型

文章目录 HF 的 Transformers 库GitHub CodeSpace 使用终端安装依赖下载 internlm2_5-7b-chat 的配置文件 参考文献 HF 的 Transformers 库 直接使用预训练模型进行推理提供了大量预训练模型可供使用使用预训练模型进行迁移学习 因此在使用 HF 前&#xff0c;我们需要下载 Tra…

项目升级到.Net8.0 Autofac引发诡异的问题

前两天把项目升级到.Net8.0了&#xff0c;把.Net框架升级了&#xff0c;其他一些第三方库升级了一部分&#xff0c;升级完以后项目跑不起来了&#xff0c;报如下错误&#xff1a; An unhandled exception occurred while processing the request. DependencyResolutionExcepti…

如何开发查找附近地点的微信小程序

我开发的是找附近卫生间的小程序。 在现代城市生活中&#xff0c;找到一个干净、方便的公共卫生间有时可能是一个挑战。为了解决这个问题&#xff0c;我们可以开发一款微信小程序&#xff0c;帮助用户快速找到附近的卫生间。本文将介绍如何开发这样一款小程序&#xff0c;包…

canfestival主站多电机对象字典配置

不要使用数组进行命名&#xff1a;无法运行PDO 使用各自命名的方式&#xff1a;

楼宇智慧公厕为用户提供清晰厕位引导,提高用厕效率

如今楼宇管理者越来越重视公共设施的优化&#xff0c;尤其是公厕的管理。楼宇智慧公厕系统通过先进的技术&#xff0c;为用户提供清晰的厕位引导&#xff0c;显著提高了用厕效率。本文将从两个方面介绍楼宇智慧公厕系统的功能及其带来的好处。 一、清晰厕位引导 楼宇智慧公厕系…

Ubuntu 20.04 安装 QGC v4.3 开发环境

Ubuntu 20.04 安装 QGC开发环境 1. 准备安装 Qt 5.15.2安装依赖获取源码 2. 编译参考 前言 QGC ( QGroundControl) 是一个开源地面站&#xff0c;基于QT开发的&#xff0c;有跨平台的功能。可以在Windows&#xff0c;Android&#xff0c;MacOS或Linux上运行。它可以将PX4固件加…

使用匿名管道时出现程序一直运行问题

父进程创建两个子进程&#xff0c;父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息&#xff0c;体现通信效果。(源程序pipe_1.c) 一开始&#xff0c;我忘了初始化pipe,很傻*的直接把fd当管道使&#xff0c;出现了儿子喊爸爸"i am your father."的…

uniapp实现H5和微信小程序获取当前位置(腾讯地图)

之前的一个老项目&#xff0c;使用 uniapp 的 uni.getLocation 发现H5端定位不准确&#xff0c;比如余杭区会定位到临平区&#xff0c;根据官方文档初步判断是项目的uniapp的版本太低。 我选择的方式不是区更新uniapp的版本&#xff0c;是直接使用高德地图的api获取定位。 1.首…

小菜家教平台(四):基于SpringBoot+Vue打造一站式学习管理系统

前言 昨天配置完了过滤器&#xff0c;权限检验&#xff0c;基本的SpringSecurity功能已经配置的差不多了&#xff0c;今天继续开发&#xff0c;明天可能会暂停一天整理一下需求&#xff0c;然后就进行CRUD了。 今日进度 补充SpringSecurity异常处理和全局异常处理器 详细操作…

MES管理系统的生产绩效分析与资源可追踪性

在探讨MES管理系统的核心功能时&#xff0c;生产绩效分析与资源可追踪性是两个不可或缺的关键要素。它们共同构成了MES管理系统中对于生产效率、成本控制以及产品质量进行精细管理的基石。以下是对这两个关键领域的深入剖析与重新阐述。 MES管理系统中的生产绩效分析&#xff0…

无人车之路径规划篇

无人车的路径规划是指在一定的环境模型基础上&#xff0c;给定无人车起始点和目标点后&#xff0c;按照性能指标规划出一条无碰撞、能安全到达目标点的有效路径。 一、路径规划的重要性 路径规划对于无人车的安全、高效运行至关重要。它不仅能够提高交通效率&#xff0c;减少交…

unocss 添加支持使用本地 svg 预设图标,并支持更改大小

安装 pnpm install iconify/utils 在配置文件 unocss.config.ts&#xff1a; presets > presetIcons 选项中 通过 FileSystemIconLoader 加载本地图标&#xff0c;并指定目录。 import presetWeapp from unocss-preset-weapp import { extractorAttributify, transformer…

从0开始学习Linux——网络配置

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 上一个教程中&#xff0c;我们了解了…

Spring中的 InitializingBean、BeanPostProcessor、@PostConstruct 等初始化动作的执行时机分析

初始化Bean的时序图如下&#xff1a; 小结说明&#xff1a; 1、相同点&#xff1a;InitializingBean 的(afterPropertiesSet方法)、BeanPostProcessor、PostConstruct 都是在bean的属性注入完毕之后才执行&#xff0c;都可以用来进行bean的初始化动作 2、初始化执行顺序优先级…

【初阶数据结构与算法】沉浸式刷题之顺序表练习(顺序表以及双指针两种方法)

文章目录 顺序表练习1.移除数组中指定的元素方法1&#xff08;顺序表&#xff09;方法2&#xff08;双指针&#xff09; 2.删除有序数组中的重复项方法1&#xff08;顺序表&#xff09;方法2&#xff08;双指针&#xff09; 3.双指针练习之合并两个有序数组方法1&#xff08;直…

996引擎 - 活捉NPC

996引擎 - 活捉NPC 引擎触发 - 引擎事件(QF)事件处理模块 GameEvent测试文件参考资料 引擎触发 - 引擎事件(QF) cfg_game_data 配置 ShareNpc1 可以将QM和机器人的触发事件全部转到 QF 引擎触发是通用的,TXT的所有触发转换成小写后在LUA中就可使用,如说明书中缺省可反馈至对接群…

第十三届交通运输研究(上海)论坛┆新发展格局下高铁物流运输模式分析

0. 简介 交通运输研究&#xff08;上海&#xff09;论坛&#xff08;简称为TRF&#xff09;是按照国际会议的组织原则&#xff0c;为综合交通运输领域学者们构建的良好合作交流平台。交通运输研究&#xff08;上海&#xff09;论坛已经成功举办了十二届&#xff0c;凝聚了全国…

Qos基本原理+园区网络

解决网络拥塞最直接就是增加带宽&#xff0c;但是费钱。可以用Qos解决 Qos( Quality of Service) 设置不同流量不同优先级 1. QoS技术概述 延迟 v.s. 延迟抖动 延迟 vs 延迟抖动 延迟&#xff1a;指一个数据包从源端传输到目的端所需要的时间。延迟是一个静态的值&#xff0…