首页 > 系统相关 >Chromium 进程降权和提权模拟示例c++

Chromium 进程降权和提权模拟示例c++

时间:2024-11-08 15:16:23浏览次数:3  
标签:MANDATORY 降权 示例 16 c++ token base SECURITY include

 一、背景知识概念参考微软链接:

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

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

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

本文主要演示 low, medium, high, and system 四种权限创建和使用例子:

 Windows defines four integrity levels: low, medium, high, and system

integrity levels定义如下:

C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um\winnt.h

#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)

 或者字符串也一样:

 

  //  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

   Low (SID: S-1-16-4096),
 Medium (SID: S-1-16-8192),
 High (SID: S-1-16-12288)
 System (SID: S-1-16-16384). 

二、代码:

#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <windows.h>
#include <iostream>

#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/memory_mapped_file.h"
#include "base/logging.h"
#include "base/process/launch.h"
#include "base/process/process.h"
#include "base/threading/thread.h"
#include "base/win/access_token.h"
#include "base/win/scoped_handle.h"
#include "base/win/sid.h"
#include "build/build_config.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace {

// Copies the process token making it a primary impersonation token.
// The returned handle will have |desired_access| rights.
bool CopyProcessToken(DWORD desired_access,
                      base::win::ScopedHandle* token_out) {
  HANDLE temp_handle;
  if (!::OpenProcessToken(::GetCurrentProcess(),
                          TOKEN_DUPLICATE | desired_access, &temp_handle)) {
    LOG(ERROR) << "Failed to open process token";
    return false;
  }
  base::win::ScopedHandle process_token(temp_handle);

  if (!::DuplicateTokenEx(process_token.Get(), desired_access, nullptr,
                          SecurityImpersonation, TokenPrimary, &temp_handle)) {
    LOG(ERROR) << "Failed to duplicate the process token";
    return false;
  }

  token_out->Set(temp_handle);
  return true;
}

void RunAccessTokenTest(DWORD integrity_level) {
  base::win::ScopedHandle privileged_token;
  CopyProcessToken(MAXIMUM_ALLOWED, &privileged_token);
  absl::optional<base::win::AccessToken> token =
      base::win::AccessToken::FromToken(std::move(privileged_token));

  token->SetIntegrityLevel(integrity_level);
  DWORD level = token->IntegrityLevel();
  if (level == integrity_level) {
    LOG(INFO) << "IntegrityLevel: " << level;
  } else {
    LOG(ERROR) << "failed IntegrityLevel: " << level;
  }

  base::LaunchOptions options;
  options.as_user = token->get();
  static const base::CommandLine::CharType* argvTmp[] = {
      FILE_PATH_LITERAL("C:/Windows/System32/Notepad.exe")};
  base::CommandLine command_line(1, argvTmp);

  LOG(INFO) << "Browser: " << command_line.GetCommandLineString();
  base::Process child_process = base::LaunchProcess(command_line, options);
}

}  // namespace

int main(int argc, const char* argv[]) {
  // SYSTEM HIGH MEDIUM LOW UNTRUSTED
  //  Note: These levels map to SIDs under the hood.
  //  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

  // DWORD integrity_level PSID 定义如下
  //  #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)

  base::CommandLine::Init(argc, argv);
  RunAccessTokenTest(SECURITY_MANDATORY_SYSTEM_RID);  // system权限进程
  RunAccessTokenTest(SECURITY_MANDATORY_HIGH_RID);    // high权限进程
  RunAccessTokenTest(SECURITY_MANDATORY_MEDIUM_RID);  // medium权限进程
  RunAccessTokenTest(SECURITY_MANDATORY_LOW_RID);     // low权限进程
  return 0;
}

三、编译之后运行效果如图:

     可以看到已经按照预定完整性级别创建了进程。 

    system级别创建失败 是因为02-test.exe进程级别是high的,按照规则不可以模拟出大于原始进程完整性级别。强制完整性控制 - Win32 应用程序 |Microsoft 学习

 四、总结:

      核心也是利用DuplicateTokenEx复制进程token完整性级别,在设置到token中【SetTokenInformation】

SetIntegrityLevel函数定义如下:

template <typename T>
bool Set(const ScopedHandle& token,
         TOKEN_INFORMATION_CLASS info_class,
         T& value) {
  return !!::SetTokenInformation(token.get(), info_class, &value,
                                 sizeof(value));
}


bool AccessToken::SetIntegrityLevel(DWORD integrity_level) {
  absl::optional<base::win::Sid> sid = Sid::FromIntegrityLevel(integrity_level);
  if (!sid) {
    ::SetLastError(ERROR_INVALID_SID);
    return false;
  }

  TOKEN_MANDATORY_LABEL label = {};
  label.Label.Attributes = SE_GROUP_INTEGRITY;
  label.Label.Sid = sid->GetPSID();
  return Set(token_, TokenIntegrityLevel, label);
}

 base\win\access_token.cc

  base\win\sid.cc

也可以参考windows 进程降权和提权代码示例(2)-CSDN博客 

标签:MANDATORY,降权,示例,16,c++,token,base,SECURITY,include
From: https://blog.csdn.net/jangdong/article/details/143609895

相关文章

  • C++之OpenCV入门到提高004:Mat 对象的使用
    一、介绍今天是这个系列《C++之Opencv入门到提高》得第四篇文章。这篇文章很简单,介绍如何使用Mat对象来实例化图像实例,了解它的构造函数和常用的方法,这是基础,为以后的学习做好铺垫。虽然操作很简单,但是背后有很多东西需要我们深究,才能做到知其然知其所以然。OpenCV具......
  • C++ 模板参数的两种类型转换
    与非模板函数一样,我们在一次调用中传递给函数模板的实参被用来初始化函数的形参。如果一个函数形参的类型使用了模板类型参数,那么它采用特殊的初始化规则。只有很有限的几种类型转换会自动地应用于这些实参。编译器通常不是对实参进行类型转换,而是生成一个新的模板实例。与往常一......
  • C++ 模板显式实例化
    //template.hpptemplate<typenameT>classDylan{public:Dylan(Tt);Tm_data;};//template.cpp#include"template.hpp"template<typenameT>Dylan<T>::Dylan(Tt){m_data=t;}templateclassDylan<int&g......
  • C++关于DLL导出模板类和模板函数
    这两天写了个Dll,要导出普通类中的模板函数,稍微查了一下,没查到具体资料。自己根据C++模板的编译原理,推断出应该要源码放在头文件中直接导出,查了下接触的OpenSource项目,确实如此。这里记录一下,方便下次查阅。1、宏定义说明:#ifdefDLL_PROJECT#defineTEMPLATE_IM_EXPORT__decl......
  • c++多态学习:多态含义与使用
    目录 多态的概念多态的定义多态的实现注意事项 多态的概念多态是面向对象编程中的一个重要概念,它指的是同一个行为具有多个不同表现形式或形态的能力。在C++中,多态主要通过虚函数来实现,允许将子类类型的指针赋值给父类类型的指针,并在运行时根据实际对象类型调用相......
  • 最新毕设-SpringBoot-求职推荐系统-55000(免费领项目)可做计算机毕业设计JAVA、PHP、爬
    摘 要当前社会竞争激烈,求职市场信息众多,但信息不对称、筛选困难的问题依然存在。因此,设计开发一款求职推荐系统是顺应时代发展的必然选择。该求职推荐系统利用Java编程语言,使用springboot技术框架,采取MySQL数据库实现系统的各项功能,具有便捷高效、安全友好的特点,促进求职招聘......
  • WINFORM简单套打程序示例
    1、软件界面(printDialog和printdocument两个控件显示在下方)  2、主要代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tas......
  • C++:模拟实现STL的list
    目录一.list类1.list的创建节点2.list迭代器的运算符操作3.list的构造函数及析构4.list的迭代器5.list的插入及删除二.整体代码1.list.h2.list.cpp在上一节已经了解list在库中的用法,在这里实现list的底层逻辑一.list类1.list的创建节点template<classT>struc......
  • C++入门基础(一)
    目录C++关键字命名空间命名冲突例子域的概念理解命名空间定义例子1例子2例子3例子4例子5例子6例子7C++输出与输入输出输入感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接......
  • C++解倒三角问题
    题目描述输入一个整数打印数字图形。输入一个整数(0<n<10)输出一个数字图形样例输入 3样例输出 关于本题代码如下:#include<iostream>usingnamespacestd;intmain(){ intn,k,t=1; cin>>n;k=n; for(inti=1;i<=n;i++......