.NET内网实战:不安全的系统令牌特权

01阅读须知

此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧。

02基本介绍

本文内容部分节选自小报童《.NET 不安全的令牌特权-SeImpersonatePrivilege 》我们会长期更新

03原理分析

在 Windows 操作系统中,用户和进程可以拥有不同的权限,这些权限控制着能够执行的操作范围。如果当前进程获取到本地用户或者系统服务账户启用了一些不安全的权限,那么有可能会完成权限提升。SeImpersonatePrivilege 是一种特殊的权限,允许进程以其他用户的身份执行操作。

3.1 用户身份运行程序

当在Windows系统桌面下使用管理员组的用户打开 cmd 而不以管理员身份运行时,cmd 以当前用户的权限级别启动,默认不具备 SeImpersonatePrivilege 权限,执行命令 whoami /priv 查看当前用户或进程所具有的权限,如下图所示

从图上显示当前管理员组用户Ivan1ee,虽然是管理员权限,但被分配了Medium Mandatory Level,该组是Windows 安全模型中的一种强制级别,限制用户对系统敏感部分的访问,从而减少潜在的恶意操作。因此,当应用程序尝试执行需要更高权限的操作时,Windows 会根据用户的 Mandatory Level 进行检查。如果用户的级别不足,则会提示用户以管理员身份运行程序。

3.2 管理员身份运行程序

当用户需要以高权限运行程序时,通常在Windows窗口下右键点击 cmd,选择以管理员身份运行。再次输入 whoami /priv 可以看到很多的特权名,如下图所示。

默认分配此权限的用户组分别是本地管理员组的成员(Administraotrs)、本地服务账户(Local Service、Network Service)、服务控制管理器启动的服务,由此得知,.NET应用程序池在NetWork Service账户下运行的IIS均具备此权限。

3.3 编程实现

下面将详细解析一个 .NET 类 PrivilegeChecker,其主要功能是检查当前进程是否具备 SeImpersonatePrivilege 权限。

在PrivilegeChecker类的开头,使用 DllImport 特性导入了三个 Windows API 函数,OpenProcessToken 用于打开指定进程的访问令牌,以便获取权限信息。GetTokenInformation 函数可以获取指定令牌的不同类型的信息,例如权限列表。LookupPrivilegeValue 函数用于查找特权名称对应的 LUID(本地唯一标识符),通过它可以确认权限的启用状态。具体代码如下所示。

复制代码
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool GetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength);
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, out LUID lpLuid);

接着,通过 OpenProcessToken 获取当前进程的访问令牌。如果调用失败,抛出异常。具体代码如下所示。

复制代码
public static bool IsSeImpersonatePrivilegeEnabled()
{
    IntPtr zero = IntPtr.Zero;
    try
    {
        if (!OpenProcessToken(Process.GetCurrentProcess().Handle, 8U, out zero))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
    }

04WebShell实战

所以很多工具在桌面用户下运行工具,需要首先绕过UAC或者以管理员身份运行此工具,但是在在IIS里通过webshell运行,根本不需要考虑UAC的绕过,这个特权很厉害噢。比如IIS服务管理器的进程w3wp.exe默认就具备了该权限,如下图所示。

这样看,通过 IIS 进程(如 w3wp.exe)启动的 cmd 可以在一定情况下运行其他软件,而不受 UAC 限制。这是因为 IIS 进程在具有 SeImpersonatePrivilege 权限的上下文中运行,可以模拟令牌。

综上,曾有前辈说,当你拥有 SeImpersonatePrivilege 权限时,你就是SYSTEM。想要了解完整或者更多的内网安全防御绕过方向的文章,可以移步订阅小报童《.NET 内网实战攻防》电子报刊。

05**.NET 电子报刊**

小报童电子报刊【.NET内网安全攻防】专栏,内容主要有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,可细分为以下8个方向。

复制代码
1) .NET 安全防御绕过
2) .NET 本地权限提升
3) .NET 内网信息收集
4) .NET 内网代理通道
5) .NET 内网横向移动
6) .NET 目标权限维持
7) .NET 数据传输外发
8) .NET 目标痕迹清理
相关推荐
kyriewen3 分钟前
前端切图仔被 AI 新闻淹死的第 N 天,我用 TRAE Work 定时任务救了自己
前端·人工智能·trae
京东云开发者4 分钟前
【全栈实践】第一个 AI Agent 项目:从零搭建 AI 音频创作助手(高级篇)
前端·agent·音视频开发
DAVIED98 分钟前
llama.cpp 本地部署完全指南
windows·llama·wsl·llamacpp
sbjdhjd18 分钟前
企业站 SQL 注入实战:PCRE 正则回溯绕过关键词 WAF 完整实战 | 进阶02
sql·安全·web安全·网络安全·ai·开源·php
AbrahamCS21 分钟前
从角色协同到可运行图:Graph Engineer 与多智能体编排
前端·人工智能·智能体
BigTopOne32 分钟前
VS Code IntelliSense 配置(解决 #include 找不到的报红)
前端
愚公搬代码34 分钟前
【愚公系列】《Web应用安全》005-Visual Studio Code编辑器的使用
前端·安全·编辑器
用户9210802628637 分钟前
2. 以 Bubble 为例,看 Ant Design X Vue 组件是怎么设计的
前端
Liora_Yvonne40 分钟前
Monorepo 里的 shared、services 和 ui 到底怎么划分?
前端
PedroQue9942 分钟前
uni-router v2.1.0 升级:导航守卫全面支持返回值模式
前端·uni-app