概述:Windows 权限与会话管理知识索引,涵盖 UAC、令牌、提权、降权等核心概念。
📖 知识概览
Windows 权限系统是操作系统安全的核心组成部分,涉及用户身份验证、访问控制、特权管理等多个方面。本系列文章系统性地介绍 Windows 权限与会话相关的技术原理和实践应用。
核心概念
| 概念 | 说明 |
|---|---|
| Token(令牌) | 包含用户身份和权限信息的数据结构 |
| UAC | 用户账户控制,限制程序权限的机制 |
| Privilege | 系统级特权,如调试、关机等 |
| Session | 登录会话,管理用户交互上下文 |
| DACL/SDDL | 访问控制列表及其描述语言 |
📚 文章索引
基础概念
| 文章 | 说明 |
|---|---|
| 【权限与会话】Windows 令牌 | Windows Token 令牌结构与原理 |
| 【权限】Privilege’s constants | Windows 特权常量定义 |
| 【权限与会话】SDDL | 安全描述符定义语言 |
UAC 机制
| 文章 | 说明 |
|---|---|
| 【权限与会话】由appinfo谈谈UAC级别 | UAC 级别详解与 AppInfo 服务 |
权限操作
| 文章 | 说明 |
|---|---|
| 【权限与会话】提权 | 提权技术与代码实现 |
| 【权限与会话】提权工具 | 常用提权工具介绍 |
| 【权限与会话】降权 | 降权启动进程的方法 |
| 【权限与会话】 Service降权启动进程 | 服务进程降权启动技术 |
高级技术
| 文章 | 说明 |
|---|---|
| 【权限与会话】Token窃取与利用 | Token 窃取技术与利用方式 |
🔑 核心知识点
1. Windows 令牌(Token)
令牌是 Windows 安全模型的核心,包含:
Token 结构:
├── 用户 SID(Security Identifier)
├── 组 SID 列表
├── 特权列表(Privileges)
├── 默认 DACL
├── 源信息(Source)
├── 过期时间
└── 模拟级别
令牌类型:
- Primary Token:主令牌,代表进程身份
- Impersonation Token:模拟令牌,用于线程模拟
2. UAC(用户账户控制)
UAC 通过限制管理员权限来提高安全性:
| UAC 级别 | 说明 |
|---|---|
| 始终通知 | 所有更改都通知 |
| 默认 | 仅程序更改时通知 |
| 仅程序通知(不 darken 桌面) | 不安全 |
| 从不通知 | 关闭 UAC |
UAC 提升路径:
用户请求提升权限
↓
AppInfo 服务处理
↓
创建提升后的进程
↓
返回新进程句柄
3. 特权(Privilege)
常用特权常量:
| 特权 | 常量 | 说明 |
|---|---|---|
| SeDebugPrivilege | 20 | 调试程序 |
| SeLoadDriverPrivilege | 10 | 加载驱动 |
| SeShutdownPrivilege | 19 | 关机 |
| SeTakeOwnershipPrivilege | 28 | 获取所有权 |
| SeAssignPrimaryTokenPrivilege | 3 | 分配主令牌 |
4. 降权与提权
提权场景:
- 利用漏洞提升权限
- Token 窃取与注入
- 服务提权
降权场景:
- 服务以低权限运行
- 沙箱隔离
- 最小权限原则
🛠️ 常用 API
令牌操作
// 打开进程令牌
OpenProcessToken(
HANDLE ProcessHandle,
DWORD DesiredAccess,
PHANDLE TokenHandle
);
// 获取令牌信息
GetTokenInformation(
HANDLE TokenHandle,
TOKEN_INFORMATION_CLASS TokenInformationClass,
LPVOID TokenInformation,
DWORD TokenInformationLength,
PDWORD ReturnLength
);
// 复制令牌
DuplicateTokenEx(
HANDLE hExistingToken,
DWORD dwDesiredAccess,
LPSECURITY_ATTRIBUTES lpTokenAttributes,
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
TOKEN_TYPE TokenType,
PHANDLE phNewToken
);特权操作
// 启用特权
BOOL EnablePrivilege(HANDLE hToken, LPCTSTR lpszPrivilege) {
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
return FALSE;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
return AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
}🔗 外部参考
- DACL, NULL or not NULL - Flier Lu - 博客园
- Windows Access Control - Microsoft Docs
- UAC Architecture - MSDN
📝 学习建议
- 理解基础 - 先掌握 Token 和 SID 的概念
- 实践操作 - 使用工具观察和分析 Token
- 安全视角 - 理解提权漏洞的成因和防护
- 代码实现 - 编写提权/降权代码加深理解
更新时间: 2026-03-27