.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 目标痕迹清理
相关推荐
独立开阀者_FwtCoder4 分钟前
"页面白屏了?别慌!前端工程师必备的排查技巧和面试攻略"
java·前端·javascript
慧一居士4 分钟前
Vite 完整功能详解与 Vue 项目实战指南
前端·vue.js
南岸月明4 分钟前
不聊主业,聊聊你们眼中的副业是什么样的?
前端
Kevin在掘金920149 分钟前
c#、.net、Fluent UI Blazor
前端
LovelyAqaurius10 分钟前
RSA加密算法:从数学魔法到现实守护
前端
Hilaku12 分钟前
说实话,React的开发体验,已经被Vue甩开几条街了
前端·javascript·vue.js
蛋黄蛋黄15 分钟前
微信表情怎么在自己的项目使用微信表情?-> [开源仓库]wechat-emoji
前端·github
汪子熙16 分钟前
错误剖析:net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK) 的含义与解决之道
前端
猩猩程序员18 分钟前
Rust 1.88 稳定支持裸函数:更安全简洁的汇编函数写法
前端
艾克马斯奎普特19 分钟前
为什么响应性语法糖最终被废弃了?尤雨溪也曾经试图让你不用写 .value
前端·vue.js·代码规范