穿透Session 0隔离

1、前言

在 Windows XP 和 Windows Server 2003 之前,用户和服务会共享同一个会话,而这个会话是由第一个登录到控制台的用户来启动的,该会话就称为Session 0。
而从Windows Vista 开始,Windows 采取了会话隔离的措施,确保系统进程和服务与普通用户会话隔离,即只有系统服务和后台进程可以运行在Session 0中。
由于不同的Session之间工作站互相独立,无法直接从一个Session中创建属于另一个Session的GUI进程,因此就需要下面要讲述的Session穿透技术。
Windows会话,工作站和桌面的关系

2、核心技术

1. 进程创建

Windows提供了多个可以以指定用户上下文创建新进程的API函数,包括CreateProcessAsUserCreateProcessWithLogon CreateProcessWithTokenW

其中使用CreateProcessWithLogon 必须要持有明文的用户名和密码,而CreateProcessWithLogon 函数不支持XP系统,因此选择CreateProcessAsUser

BOOL CreateProcessAsUserW([in, optional]      HANDLE                hToken,[in, optional]      LPCWSTR               lpApplicationName,[in, out, optional] LPWSTR                lpCommandLine,[in, optional]      LPSECURITY_ATTRIBUTES lpProcessAttributes,[in, optional]      LPSECURITY_ATTRIBUTES lpThreadAttributes,[in]                BOOL                  bInheritHandles,[in]                DWORD                 dwCreationFlags,[in, optional]      LPVOID                lpEnvironment,[in, optional]      LPCWSTR               lpCurrentDirectory,[in]                LPSTARTUPINFOW        lpStartupInfo,[out]               LPPROCESS_INFORMATION lpProcessInformation
);
2. 环境变量

由于不同用户的环境变量存在差异,因此创建进程时需要考虑是否需要指定用户的环境变量还是继承当前用户。如果需要可以使用CreateEnvironmentBlock检索指定用户的环境变量。

BOOL CreateEnvironmentBlock([out]          LPVOID *lpEnvironment,[in, optional] HANDLE hToken,[in]           BOOL   bInherit
);
3. 用户令牌获取

想要通过CreateProcessAsUser创建用户进程,最关键的一步就在于获取用户的令牌。而比较常用的获取用户令牌的方式有两种:

  1. 通过WTSQueryUserToken获取指定Session的令牌
BOOL WTSQueryUserToken([in]  ULONG   SessionId,[out] PHANDLE phToken
);
  1. 通过SetTokenInformation替换自身的令牌的Session
BOOL SetTokenInformation([in] HANDLE                  TokenHandle,[in] TOKEN_INFORMATION_CLASS TokenInformationClass,[in] LPVOID                  TokenInformation,[in] DWORD                   TokenInformationLength
);
4. 获取活动Session

虽然Windows提供了WTSGetActiveConsoleSessionId函数可以直接获取当前活动会话,但实际使用中远程桌面访问的过程中,获取的活动会话与实际不符。
因此,更多情况下会使用WTSEnumerateSessionsW枚举所有的会话,找到活动的会话ID。

BOOL WTSEnumerateSessionsW([in]  HANDLE             hServer,[in]  DWORD              Reserved,[in]  DWORD              Version,[out] PWTS_SESSION_INFOW *ppSessionInfo,[out] DWORD              *pCount
);

3 具体实现

DWORD wts_session_count;
PWTS_SESSION_INFO wts_session;
// 枚举当前系统所有的会话
if (!WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &wts_session, &wts_session_count)) {return false;
}
DWORD active_session_id = -1;
for (auto i = 0ul; i < wts_session_count; i++) {// 找到活动的会话IDif (wts_session[i].State == WTSActive) {active_session_id = wts_session[i].SessionId;break;}
}
// 释放资源
WTSFreeMemory(wts_session);HANDLE htoken = nullptr;
LPVOID env = nullptr;
do {// 查询用户令牌HANDLE user_token;if (!WTSQueryUserToken(active_session_id, &user_token)) {break;}TOKEN_ELEVATION_TYPE token_type;DWORD token_size;// 获取令牌类型if (!GetTokenInformation(user_token, TokenElevationType, (VOID*)&token_type, sizeof(token_type), &token_size)) {CloseHandle(user_token);break;}// 判断令牌类型if (TokenElevationTypeLimited == token_type) {// 从限制令牌获取提权令牌if (!GetTokenInformation(user_token, TokenLinkedToken, (VOID*)&htoken, sizeof(htoken), &token_size)) {CloseHandle(user_token);break;}CloseHandle(user_token);}else {htoken = user_token;}PROCESS_INFORMATION pi;STARTUPINFO si;ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));ZeroMemory(&si, sizeof(STARTUPINFO));si.cb = sizeof(STARTUPINFO);// 创建用户环境if (!CreateEnvironmentBlock(&env, htoken, FALSE)) {break;}// 创建指定用户进程if (!CreateProcessAsUser(htoken, NULL, (LPWSTR)command,NULL, NULL, FALSE, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, env, NULL, &si, &pi)) {break;}
} while (false);
// 释放资源
if (env) {DestroyEnvironmentBlock(env);
}
if (htoken) {CloseHandle(htoken);
}

4、后话

这里简单描述一下笔者在开发安全产品的过程中,遇到的一些问题。

  • WTSQueryUserToken失败,错误代码ERROR_ACCESS_DENIEDWin7
  • CreateProcessAsUser失败,错误代码ERROR_FILE_NOT_FOUNDWin - XP

以上两个问题的本质上都是因为执行系统函数的过程中将具体的实现委托给第三方进程,而第三方进程在又反过来访问当前进程,导致第三方进程被驱动拦截。
因此,将第三方进程lsm.exewinlogon.exe加入驱动保护过滤白名单即可。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型思维链COT:Chain-of-Thought Prompting Elicits Reasoningin Large Language Models

一、TL&#xff1b;DR 探索了COT&#xff08;chain-of-thought prompting&#xff09;通过一系列的中间推理步骤来显著的提升了LLM的复杂推理能力在三个大型语言模型上的实验表明&#xff0c;思维链提示能够提升模型在一系列算术、常识和符号推理任务上的表现解释了一下为什么…

颠覆传统:SaaS 品牌如何通过 SEO 策略引爆市场!

SaaS 商业模式提供了令人难以置信的可扩展性和盈利能力——但前提是与正确的营销增长策略相结合。 SaaS 品牌知道&#xff0c;托管基于云的应用程序的成本会随着用户量的增加而降低&#xff0c;因此必须专注于订阅者的快速增长&#xff0c;以保持竞争力并降低成本。 许多 CMO…

大模型训练 | 智能体知识库 资源收集之心理咨询问答数据集

最近我一直在研究AI大模型相关的内容&#xff0c;想着从现在开始慢慢收集各种各样的资源&#xff0c;万一以后需要训练大模型的时候可以用到&#xff0c;或者自己以后也许会需要。今天我想介绍一组“心理咨询问答数据集”产品&#xff0c;包含9414条心理咨询问答数据&#xff0…

vivado 创建生成时钟

创建生成时钟 生成时钟源自另一个现有时钟 &#xff08;主时钟&#xff09;。通常用来描述由逻辑块在主时钟上执行的波形变换。由于生成时钟的定义 取决于主时钟特性&#xff0c;因此必须首先定义主时钟。要明确定义生成时钟&#xff0c;必须使用 create_generated_clock 命…

数据清洗:基于python抽取jsonl文件数据字段

基于python抽取目录下所有“jsonl”格式文件。遍历文件内某个字段进行抽取并合并。 import os import json import time from tqdm import tqdm # 需要先安装&#xff1a;pip install tqdmdef process_files():# 设置目录路径dir_path r"D:\daku\关键词识别\1623-00000…

《TCP/IP网络编程》学习笔记 | Chapter 22:重叠 I/O 模型

《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型理解重叠 I/O 模型重叠 I/O本章讨论的重叠 I/O 的重点不在于 I/O 创建重叠 I/O 套接字执行重叠 I/O 的 WSASend 函数进行重叠 I/O 的 WSA…

html css 网页制作成品——HTML+CSS非遗文化扎染网页设计(5页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…

飞书只有阅读权限的文档下载,飞书文件下载

wx搜索公zhong号&#xff1a;"狮心王"回复"飞书文档保存"下载chrome扩展文件 拿到扩展文件之后给chrome添加扩展

避免踩坑!查收查引常见问题解答

Q1&#xff1a;为什么我的论文刚发表&#xff0c;在查引系统中却查不到&#xff1f; 这是由于数据库存在数据延迟。SCI、SSCI等索引平台通常需要1-3个月更新数据&#xff0c;而中文数据库如CNKI也可能延迟1-2周。建议在论文发表后耐心等待&#xff0c;或直接联系数据库客服…

Centos7 Gitlab17部署

确保你的安装源正常 1.安装依赖项 sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix 2.安装Gitlab (1)添加仓库 curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash (2) 安装Gitl…

[数据结构]1.时间复杂度和空间复杂度

这里写目录标题 1. 算法复杂度2. 时间复杂度2.1 执行次数2.2 大O渐进表示法2.3 常见时间复杂度计算eg1eg2eg3eg4eg5eg6eg7eg8eg9 3. 空间复杂度eg1eg2eg3eg4 4. 常见复杂度对比5. 复杂度练习eg1 1. 算法复杂度 衡量一个算法的好坏&#xff0c;一般是从时间空间两个维度来衡量&…

高斯核函数

高斯核函数的名称比较多&#xff0c;以下名称指的都是高斯核函数&#xff1a; 高斯核函数。 RBF&#xff08;Radial Basis Function Kernel&#xff09;。 径向基函数。 高斯核函数的数学表达式为&#xff1a; 其中&#xff1a; xxx 和 yyy 是输入空间中的两个向量。∥x−y…

数据结构入门【算法复杂度】

算法复杂度 1.数据结构前言1.1 数据结构1.2算法1.3算法效率 2.时间复杂度3.大O渐进表示法3.1大O渐进表示法概念3.2时间复杂度示例 4.空间复杂度 1.数据结构前言 1.1 数据结构 数据结构是计算机存储&#xff0c;组织数据的方式&#xff0c;指相互之间存在的一种或者多种特定关…

others-rustdesk远程

title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…

Android 静态壁纸设置实现方案

提示&#xff1a;Android 平台&#xff0c;静态壁纸实现方案 文章目录 需求&#xff1a;Android 实现壁纸 设置场景 参考资料实现方案直接调用系统 API,WallpaperManager 来实现 wallpaperManager.setResource系统源码分析系统app WallpaperPickerWallpaperPickerActivity ->…

余弦退火算法与学习率预热

余弦退火算法与学习率预热 总述&#xff1a; &#xff08;1&#xff09;标准余弦退火算法&#xff08;Cosine Annealing&#xff09;是通过单次的余弦曲线调整学习率&#xff0c;在一个周期内让学习率从一个最大值平滑下降η_max到最小值η_min&#xff0c;这种调整模式是非周…

数据结构之栈的2种实现方式(顺序栈+链栈,附带C语言完整实现源码)

对于逻辑关系为“一对一”的数据&#xff0c;除了用顺序表和链表存储外&#xff0c;还可以用栈结构存储。 栈是一种“特殊”的线性存储结构&#xff0c;它的特殊之处体现在以下两个地方&#xff1a; 1、元素进栈和出栈的操作只能从一端完成&#xff0c;另一端是封闭的&#xf…

MySQL 调优:查询慢除了索引还能因为什么?

文章目录 情况一&#xff1a;连接数过小情况二&#xff1a;Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么&#xff1f;MySQL 查询慢&#xff0c;我们一般也会想到是因为索引&#xff0c;但除了索引还有哪些原因会导致数据库查询变慢呢&#xff1f; 以下以 MySQL 中一条 S…

gin学习

gin学习笔记&#xff0c;不仅包含了基本的增删查改外&#xff0c;还包括参数传递&#xff0c;上传下载&#xff0c;模版、session与中间件等&#xff0c;方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…

[GHCTF 2025]ez_readfile

题目&#xff1a; <?phpshow_source(__FILE__);if (md5($_POST[a]) md5($_POST[b])) {if ($_POST[a] ! $_POST[b]) {if (is_string($_POST[a]) && is_string($_POST[b])) {echo file_get_contents($_GET[file]);}}} ?> Warning: md5() expects parameter 1 …