NT 权限链(Windows NT 安全访问模型,Access Control 访问控制链):Windows 从登录、身份验证 → 安全标识符 SID → 访问令牌 Access Token → DACL/SACL → 访问检查,这一整套判定「主体能否访问对象」的完整安全链路,俗称 NT 权限链。

NT 权限链 拆解|解构

NT 权限链(Windows NT 安全访问模型,Access Control 访问控制链):Windows 从登录、身份验证 → 安全标识符 SID → 访问令牌 Access Token → DACL/SACL → 访问检查,这一整套判定「主体能否访问对象」的完整安全链路,俗称 NT 权限链。

核心:主体(用户 / 进程)携带访问令牌,对象携带安全描述符;内核执行访问检查,判定允许 / 拒绝

一、底层原理

Windows 采用自主访问控制 DAC 为基础,内核态执行访问校验。

  1. 身份认证:登录环节验证账号密码,生成 SID、用户组 SID 列表,构造访问令牌 AccessToken(核心凭证)。
  2. 安全描述符 SD(Security Descriptor) 所有安全对象(文件、注册表项、服务、进程、目录、内核对象)都附带 SD,包含 4 部分:
    • Owner:所有者 SID
    • Group:主组 SID(遗留,NTFS 使用)
    • DACL 自主访问控制列表:允许 / 拒绝 ACE 访问条目,控制谁能读写执行
    • SACL 系统访问控制列表:审计访问行为(触发安全日志)
  3. 访问检查算法(内核执行) 1)拿到主体访问令牌(包含用户 SID、所有组 SID、特权 Privileges) 2)读取目标对象安全描述符 DACL 3)按 ACE 顺序逐条匹配:拒绝 ACE 优先级高于允许 ACE,一旦命中拒绝,直接拒绝访问;命中允许则授予对应权限;无匹配条目默认拒绝。 4)同时检查令牌内特权(SeSecurityPrivilege、SeTakeOwnershipPrivilege 等),特权可以绕过部分 DACL 限制。

关键规则:ACE 按顺序从上到下评估,拒绝优先;没有匹配 ACE = 隐式拒绝

二、依赖文件

内核驱动(内核安全子系统)

文件 路径 角色
ntoskrnl.exe C:\Windows\System32\ntoskrnl.exe Windows 内核主体,包含安全引用监视器 SRM(Security Reference Monitor),访问检查的核心执行单元
lsass.exe C:\Windows\System32\lsass.exe 用户态本地安全认证服务,登录验证、生成访问令牌、管理凭据、LSA 策略存储
samss.dll System32 SAM 账号数据库接口,读取本地账号 SID 与密码哈希
seclogon.dll System32 辅助登录服务,用于二次登录(runas)生成新令牌

用户态 DLL(权限 API 调用层)

文件 路径 角色
advapi32.dll System32 安全 API 主入口:OpenProcessTokenGetSecurityDescriptorSetSecurityInfo,读写 SD/DACL
secur32.dll System32 LSA 交互,身份验证包加载(NTLM/Kerberos)
aclui.dll System32 安全属性图形界面(权限编辑器,高级安全设置窗口)
ntdll.dll System32 底层 Native API,直接调用内核 SRM 访问检查函数
srvcli.dll / srvsvc.dll System32 SMB 远程对象权限校验(网络文件访问时的 NT 权限链)

文件系统层(NTFS 专属)

文件 路径 角色
ntfs.sys drivers\ntfs.sys NTFS 文件系统驱动,持久化存储文件 / 文件夹安全描述符 SD 到 MFT 元数据

三、依赖关系

应用程序/资源管理器
 ↓调用
advapi32.dll / ntdll.dll(安全API)
 ↓请求
ntoskrnl.exe 【SRM安全引用监视器】 ← 访问检查核心
    ├─ lsass.exe(LSA):登录、生成Access Token、SID/组信息
    ├─ ntfs.sys:读取文件对象SD(DACL/SACL)
    └─ 内核对象管理器:进程/注册表/事件等内核对象的SD维护
  1. SRM(在 ntoskrnl.exe 内)是整个权限链的核心裁决者,不可绕过;所有对象访问请求最终都提交 SRM 做访问检查。
  2. lsass.exe 负责生成访问令牌;没有访问令牌,SRM 无法识别访问主体身份。
  3. NTFS 文件的 SD 保存在 MFT,由ntfs.sys读取;注册表 SD 保存在配置单元,由注册表驱动读取。
  4. advapi32.dll只是 API 封装层,不做权限判定,仅负责把参数传给内核 SRM。
  5. 依赖 SID 体系:没有 SID,DACL 的 ACE 条目无法定位主体。
  6. 特权 (Privilege) 独立于 DACL:特权存储在访问令牌内部,可以覆盖 DACL 限制(例如 SeRestorePrivilege)。

四、配套链(分层架构)

  1. 账号与身份存储层 SAM 数据库(本地账号)/AD 域数据库(域账号),存储用户 SID、组 SID、凭据哈希。
  2. 身份验证层(LSA) lsass.exe + secur32,接收登录请求,验证凭据,构造访问令牌 Access Token
  3. 内核安全裁决层(SRM,ntoskrnl.exe) 安全引用监视器,接收访问请求,执行访问检查算法;内核中全局唯一的访问判定模块。
  4. 安全对象存储层
    • NTFS 文件:ntfs.sys,SD 存入 MFT 记录
    • 注册表:注册表驱动,SD 存入 hive 配置单元
    • 进程 / 线程 / 事件 / 互斥体:内核对象管理器,SD 保存在内核内存对象头
  5. API 与 UI 管理层 advapi32.dll、aclui.dll,提供编程接口和图形权限编辑器,读写 SD/DACL。
  6. 审计层(SACL) SRM 命中 SACL 规则时,写入安全事件日志(EventLog)。
  7. 应用层 资源管理器、命令行、PowerShell、各类软件,发起打开文件 / 注册表 / 进程对象的访问请求。

五、逻辑链路(完整流程示例:用户打开 NTFS 文件)

  1. 用户登录系统 → lsass 验证账号密码,查询用户 SID + 所有所属组 SID,生成访问令牌,分配给用户的 explorer.exe 进程。
  2. 用户双击文件,explorer 发起 CreateFile API 调用。
  3. API 经由 ntdll 进入内核,内核对象管理器定位目标文件对象,ntfs.sys 从 MFT 读取文件的安全描述符 SD(DACL)
  4. 请求提交给 SRM 安全引用监视器
    • 传入:进程访问令牌(主体身份 SID / 组 SID / 特权) + 对象 SD(DACL) + 请求的访问权限(读 / 写)
  5. SRM 逐条遍历 DACL 内 ACE:
    • 若命中拒绝 ACE → 直接返回拒绝访问,链路终止。
    • 命中允许 ACE,且包含请求权限 → 允许访问。
    • 无任何匹配 ACE → 默认拒绝。
  6. 若 SACL 配置了审计规则,SRM 生成安全审计事件写入事件日志。
  7. 返回结果给调用方:允许则打开文件句柄;拒绝返回0x5 拒绝访问

远程 SMB 访问变种链路:客户端凭据 → SMB 会话建立,服务端生成服务端侧访问令牌,在服务器端执行 SRM 访问检查(权限校验发生在文件服务器,不是客户端)。

六、边界、限制与误区

✅ 功能边界

  1. 仅针对 Windows 安全对象:NTFS 文件、注册表、进程、线程、服务、打印机、命名管道;FAT32 无 SD,不支持 NT 权限链
  2. DACL 是自主访问控制:对象所有者可以修改 DACL;管理员可通过 Take Ownership 夺取所有权。
  3. 访问令牌分主令牌(进程)、模拟令牌(线程 Impersonate,常用于 RPC/SMB);模拟场景下使用线程令牌而非进程令牌做权限校验。
  4. 特权(Privileges)独立于 DACL:如 SeTakeOwnershipPrivilege 可以直接夺取文件所有权,无视原有 DACL

⚠️ 系统边界

  1. SRM 是内核组件,用户态程序无法绕过 SRM 做访问判定;所有打开对象的内核调用都会强制经过 SRM。
  2. 继承规则:新建文件默认继承父文件夹 DACL;继承 ACE 可标记 “不传播”,继承是 NTFS 对象创建时一次性复制,不是动态联动。父目录权限修改,不会自动修改已存在子对象(除非手动递归应用)。
  3. 拒绝 ACE 优先级高于允许 ACE,和书写顺序相关;很多权限错误来自 ACE 顺序写反。

❌ 常见误区

  1. 误区:用户态 advapi32 负责判断权限 ✔ 纠正:advapi32 只是 API 封装,真正判断在内核 SRM(ntoskrnl)
  2. 误区:“管理员账号一定拥有全部文件权限” ✔ 纠正:管理员 SID 可以被 DACL 显式拒绝;管理员默认拥有 SeTakeOwnershipPrivilege,可以夺取所有权后修改权限。
  3. 误区:文件权限 = 文件夹权限,自动同步 ✔ 纠正:继承仅在新建对象时生效;后续父目录权限修改不会自动修改已有子对象。
  4. 误区:SMB 访问在客户端校验权限 ✔ 纠正:NT 权限校验全部在文件服务器内核 SRM 执行,客户端只发送凭据。

🛡️ 安全边界

  1. 高权限账号的访问令牌泄露(如令牌窃取),攻击者可直接复用令牌绕过 DACL 检查(Windows 经典提权攻击面)。
  2. 模拟 (Impersonate) 权限是高危权限,允许线程切换令牌身份,是 SMB/RPC 服务的主要安全边界。
  3. SACL 审计仅记录访问事件,不阻止访问;SACL 只用于日志,不参与允许 / 拒绝判定。

补充速查 PowerShell

# 获取文件安全描述符
Get-Acl C:\test.txt
# 获取当前进程访问令牌信息
whoami /all

AccessToken(访问令牌)拆解|解构

定义:访问令牌是 Windows 内核对象,由 LSA (lsass.exe) 在登录阶段生成,绑定到进程 / 线程;它代表当前安全主体的身份、SID、组、特权、权限,内核 SRM 使用它做访问检查。 分为两类:主令牌 Primary Token(进程级别)模拟令牌 Impersonation Token(线程级别)

一、底层原理

  1. 用户登录(本地登录 / 域登录 /runas)→ lsass 验证凭据,查询 SAM/AD 获取用户 SID、所有用户所属组 SID、用户特权列表。
  2. LSA 在内核中创建访问令牌对象,返回句柄,分配给登录会话。新进程默认继承父进程的主令牌
  3. 内核 SRM(安全引用监视器,ntoskrnl.exe)在每次对象访问请求时,读取当前生效令牌(优先线程模拟令牌,没有则使用进程主令牌),配合目标对象 SD 做访问检查。
  4. 令牌是内核对象,存储在内核内存;用户态进程只能拿到句柄,不能直接修改令牌内部 SID / 特权。

核心区分:

  • 主令牌:绑定在进程,该进程所有线程默认使用这个令牌;CreateProcess 时传入。
  • 模拟令牌:绑定在单个线程;线程临时切换身份(SMB、RPC、命名管道服务最常用),线程结束后失效。

令牌内部核心字段(内核结构体 _TOKEN

  • TokenID:令牌唯一标识
  • LogonSessionId:登录会话 ID(关联 lsass 登录会话)
  • User SID:用户主 SID
  • Groups SID 列表:所有用户所属组 SID(包含域组、本地组,含 SID 属性:启用 / 禁用 / 拒绝)
  • Privileges(特权列表):Se*Privilege 集合,每个特权包含启用状态(默认启用 / 默认禁用)
  • Default DACL:新建对象时默认应用的 DACL
  • Owner SID:默认所有者 SID
  • Primary Group SID:NTFS 遗留主组
  • Token Source:来源(如WINLOGONRAS
  • TokenType:主令牌 / 模拟令牌
  • ImpersonationLevel:模拟级别(SecurityAnonymous / SecurityIdentification / SecurityImpersonation / SecurityDelegation)

二、依赖文件

内核层

文件 位置 作用
ntoskrnl.exe System32 创建、管理、引用计数 TOKEN 内核对象;SRM 使用 TOKEN 做访问校验
lsass.exe System32 LSA 安全服务,登录时生成访问令牌,维护登录会话
ntdll.dll System32 Native API(NtOpenProcessToken / NtQueryInformationToken),直接操作内核令牌对象

用户态 API 层

文件 位置 作用
advapi32.dll System32 封装安全 API:OpenProcessToken、DuplicateToken、ImpersonateLoggedOnUser、GetTokenInformation
secur32.dll System32 LSA 交互,身份验证包、登录会话管理,用于生成令牌
seclogon.dll System32 Secondary Logon 服务,RunAs 二次登录,生成独立新访问令牌
kernel32.dll System32 CreateProcess,继承 / 分配主令牌给子进程

三、依赖关系

lsass.exe (LSA) → 在内核ntoskrnl创建TOKEN对象
    ↓句柄返回
advapi32.dll / ntdll.dll API
    ↓操作
进程/线程绑定令牌
    ↓访问对象时
ntoskrnl SRM 读取令牌,配合对象SD做访问检查
  1. 令牌创建依赖 lsass:绝大多数登录场景的访问令牌,都由 LSA 生成;没有 lsass,无法生成新登录会话令牌。
  2. 令牌属于内核对象,生命周期由内核对象管理器管理,引用计数控制销毁;句柄关闭不等于令牌立刻销毁,登录会话存在时令牌保持。
  3. 进程默认继承父进程主令牌;子进程创建时可自定义传入其他令牌(权限较高操作)。
  4. 模拟令牌依赖:服务线程拿到客户端凭据,调用 ImpersonateLoggedOnUser,将模拟令牌绑定到当前线程;线程切换回原身份(RevertToSelf),模拟令牌不再生效。
  5. 特权在令牌内部,不是全局系统设置:同一账号,不同登录会话可以生成特权不一样的令牌

四、配套链

  1. 身份存储层:SAM 本地账号库 / AD 域账号库,存储 SID、组、用户特权分配策略
  2. 身份验证层:lsass.exe + secur32,验证凭据、查询 SID 与特权 → 生成内核 TOKEN 对象
  3. 内核对象管理层(ntoskrnl):维护 TOKEN 对象,句柄、引用计数
  4. API 操作层:advapi32 + ntdll,提供查询、复制、模拟令牌 API
  5. 安全裁决层(SRM,ntoskrnl):访问对象时读取 TOKEN,执行访问检查
  6. 进程 / 线程调度层:进程绑定主令牌;线程可临时挂载模拟令牌
  7. 应用层:程序调用 API 开启进程、模拟客户端身份(SMB/RPC 服务)

五、逻辑链路(2 个典型场景)

场景 1:用户登录,启动资源管理器(主令牌)

  1. winlogon 收集账号密码 → 转交 lsass 验证凭据
  2. lsass 查询 SAM 获取用户 SID、所有组 SID、特权列表
  3. LSA 通知内核 ntoskrnl,新建 TOKEN 内核对象
  4. 创建 explorer.exe 进程,把这个 TOKEN 设为进程主令牌
  5. explorer 所有操作,默认使用这个主令牌;访问文件 / 注册表时 SRM 读取令牌做权限校验。
  6. explorer 派生的子进程,默认继承这个主令牌。

场景 2:SMB 服务模拟客户端(模拟令牌)

  1. 客户端访问 SMB 共享,srvsvc 服务验证客户端凭据
  2. lsass 根据客户端身份生成模拟令牌
  3. SMB 服务线程调用 ImpersonateLoggedOnUser,线程挂载模拟令牌
  4. 线程执行文件访问时,SRM优先读取线程模拟令牌,而不是 smb 服务进程自身的主令牌
  5. 操作完成,调用 RevertToSelf (),线程切回服务原始主令牌,模拟令牌解除绑定。

六、边界、限制、误区

✅ 功能边界

  1. 令牌是登录会话绑定:同一个用户,多次登录会产生多个独立登录会话,多份独立访问令牌,特权可以不同。
  2. 两种令牌生效优先级:线程模拟令牌 > 进程主令牌;只要线程开启模拟,访问检查使用线程令牌。
  3. 模拟级别(ImpersonationLevel)控制令牌能力:
    • Anonymous:匿名,没有身份信息
    • Identification:仅查询身份,不能访问资源
    • Impersonation:本地服务器可模拟访问资源(SMB 常用)
    • Delegation:委派,令牌可跨机器传递(域环境,高风险)
  4. 特权默认有两种状态:声明状态 (EnabledByDefault) 和 启用状态 (Enabled)。很多特权默认存在于令牌但是禁用,进程需要调用AdjustTokenPrivileges手动启用。例如 SeDebugPrivilege 默认禁用。

⚠️ 系统边界

  1. 用户态不能直接修改令牌内 SID;只能复制令牌(DuplicateToken),部分场景修改特权。篡改 SID 需要内核态权限。
  2. 令牌句柄有访问权限:打开进程令牌需要TOKEN_QUERY / TOKEN_ADJUST_PRIVILEGES等权限。
  3. 登录会话注销时,令牌引用计数归零,内核销毁 TOKEN 对象。
  4. UAC 会拆分令牌:管理员账号登录时生成过滤令牌(Filtered Token),默认去掉管理员高特权;提升时才使用完整管理员令牌。

❌ 常见误区

  1. 误区:账号本身自带特权

纠正:特权保存在访问令牌里,不是账号属性;同一账号,UAC 过滤登录和提升后,令牌特权完全不同。

  1. 误区:进程令牌一旦设置就不可变

纠正:可以调用 AdjustTokenPrivileges,启用 / 禁用令牌内已有特权,但不能新增不存在的特权。

  1. 误区:模拟令牌会修改整个进程身份

纠正:模拟令牌仅作用于当前单个线程;其他线程继续使用进程主令牌。

  1. 误区:复制令牌就能直接提权

纠正:DuplicateToken 复制得到的令牌,仍然继承原有 SID 和特权;复制只是复制对象,不提升权限

🛡️ 安全边界

  1. 令牌窃取(如SeDebugPrivilege打开高权限进程,复制其访问令牌)是 Windows 经典本地提权 / 横向移动攻击手段。
  2. 委派级别(SecurityDelegation)是域安全高危点:允许把客户端身份转发到后端服务器,可用于 Kerberos 委派攻击。
  3. UAC 过滤令牌:管理员默认使用低权限过滤令牌;必须 “以管理员身份运行”,才加载完整高特权令牌。

补充 实用查询命令

# 查看当前令牌:SID、组、所有特权状态
whoami /all
# 查看进程令牌信息(需要管理员)
Get-Process | Select-Object Name,Id,TokenHandle

NT 权限链|Windows 权限提升(LPE 本地权限提升)完整解构

前置基础:NT 权限链核心裁决单元是ntoskrnl 内 SRM 安全引用监视器,以访问令牌 AccessToken作为主体身份凭证,资源对象携带 SD/DACL 做访问判定。 权限提升(Local Privilege Escalation,LPE)

本质:进程 / 线程,从低权限访问令牌,获得更高权限的访问令牌 / 获得高特权 (Privilege),从而可以执行原本被 SRM 拒绝的操作

一、核心概念梳理

1. 权限(Access Right)

资源层面的访问许可:文件读 / 写、注册表修改、打开进程、创建服务等,定义对某个对象能干什么。 存储位置:对象 SD 的 DACL(ACE 条目)。

例:FILE_READ_DATAPROCESS_VM_READ

2. 特权(Privilege,Se*Privilege)

系统全局能力,不属于某个资源,属于访问令牌内的能力开关,可以直接绕过 DACL 限制。 存储位置:访问令牌 AccessToken 内部

例:SeDebugPrivilegeSeTakeOwnershipPrivilegeSeRestorePrivilege

✅ 关键区分:

  • 权限:针对对象,DACL 控制;
  • 特权:属于令牌身份能力,可绕过 DACL。

3. 权限提升(LPE)定义

进程当前访问令牌的 SID / 组 / 特权不足以执行目标操作;通过漏洞、配置缺陷、错误授权,拿到更高权限令牌 / 启用高特权,突破 SRM 访问检查限制。

目标:拿到更高 SID(管理员 SID / SYSTEM SID),或启用令牌内高风险特权。

4. 权限提升两大分类

  1. 用户身份提升(SID 提升) 替换访问令牌主体 SID,从普通用户 SID → 管理员 SID / NT AUTHORITY\SYSTEM SID。 效果:新令牌自带高 SID + 全套特权,SRM 判定身份为高权限主体。 示例:服务漏洞执行代码,继承 SYSTEM 账号令牌。
  2. 特权提升(Privilege 提升,不换 SID) SID 不变,在原有访问令牌内,启用原本存在但默认禁用的高特权(AdjustTokenPrivileges)。 最典型:SeDebugPrivilege。普通管理员 UAC 过滤令牌默认禁用;启用后可以打开任意进程,窃取高权限令牌。

    注意:不能凭空增加令牌不存在的特权,只能启用令牌内已经存在、只是被关闭的特权。

5. 权限提升目的

  • 合法场景:程序安装、系统配置、驱动加载,需要高权限完成运维任务(UAC 弹窗、RunAs)。
  • 攻击场景:攻击者拿到低权限 shell,提升到管理员 / SYSTEM,持久化、横向移动、窃取凭据、关闭安全防护。

合法提权:需要身份验证,产生新的高权限令牌; 恶意 LPE:利用缺陷绕过验证,非预期拿到高权限。

二、底层原理(基于 NT 权限链)

正常访问流程: 进程访问令牌 + 资源SD(DACL) → SRM 执行访问检查 → 允许 / 拒绝

提权的本质就是破坏这个判定链的约束,3 种核心路径

  1. 获取更高 SID 的访问令牌(替换主体身份,最常见)
  2. 启用访问令牌内高风险特权,特权优先于 DACL,直接绕过对象权限检查
  3. 修改目标资源 DACL,给低 SID 增加允许 ACE,让低权限主体直接访问高价值资源(属于间接提权)

SRM 不会区分 “合法操作” 和 “恶意操作”,只校验令牌 SID、特权、DACL 规则。只要令牌具备对应身份 / 特权,SRM 就放行。

三、依赖文件

文件 位置 在提权链路中的角色
ntoskrnl.exe System32 SRM 安全引用监视器、TOKEN 内核对象管理;内核漏洞提权的目标
lsass.exe System32 LSA 登录会话、访问令牌生成;凭据窃取、令牌窃取相关
advapi32.dll System32 权限 API:AdjustTokenPrivileges、OpenProcessToken、DuplicateToken
ntdll.dll System32 Native API,直接操作内核对象,漏洞利用常用
seclogon.dll System32 Secondary Logon,RunAs / UAC 令牌创建
winlogon.exe System32 用户登录会话,初始令牌生成
srvsvc.dll System32 SMB 模拟令牌、会话身份切换(横向移动令牌窃取)
驱动文件(*.sys) drivers\ 内核驱动漏洞提权载体,加载未签名驱动 / 有漏洞驱动实现内核执行

四、依赖关系

低权限进程
   ↓(利用漏洞/错误配置)
获取高权限令牌句柄 / 启用高特权
   ↓
advapi32 / ntdll API调用
   ↓
ntoskrnl SRM接收新令牌/特权状态
   ↓
SRM访问检查:新身份/特权通过校验,执行高权限操作
  1. 所有权限判定最终依赖ntoskrnl中的 SRM;LPE 的本质就是操纵 SRM 的输入(令牌)。
  2. 访问令牌由 lsass 生成;令牌窃取类提权,不需要重新登录,直接复制已有高权限 TOKEN
  3. UAC 依赖 seclogon,UAC Bypass 就是绕过 UAC 的令牌过滤机制,直接拿到完整管理员令牌。
  4. 内核提权直接在 ntoskrnl 内核态执行代码,可以直接修改内核 TOKEN 结构体,绕过全部用户态安全检查。

五、配套链(分层)

  1. 身份存储层:SAM/AD,SID、账号权限策略定义
  2. LSA 登录会话层:lsass 生成 AccessToken,UAC 做令牌过滤(管理员账号默认生成过滤低权限令牌)
  3. 内核安全裁决层:ntoskrnl SRM、TOKEN 对象管理,访问判定核心
  4. 对象安全描述符层:文件 / 注册表 / 服务 DACL 配置缺陷(错误配置是大量 LPE 源头)
  5. API 调用层:advapi32/ntdll,操作令牌、特权、对象 ACL
  6. 应用 / 服务层:Windows 服务、第三方软件、驱动、COM 组件(漏洞来源)
  7. 利用层:漏洞 EXP、Mimikatz、PowerSploit 等工具,调用 API 完成令牌窃取、特权启用

六、逻辑链路(4 类典型提权链路)

链路 1:服务配置缺陷提权(最经典本地提权)

  1. 低权限用户登录,持有标准用户访问令牌。
  2. 系统服务以 SYSTEM 身份运行,服务对应的可执行文件路径,低权限用户拥有写入权限(DACL 配置错误)。
  3. 低权限用户替换 EXE 文件。
  4. 服务重启,Windows 使用 SYSTEM 令牌执行被替换的恶意程序。
  5. 恶意进程获得 SYSTEM 访问令牌,完成 LPE。

链路 2:SeDebugPrivilege 特权启用提权

  1. 管理员登录,UAC 默认生成过滤令牌,SeDebugPrivilege 存在但禁用。
  2. 程序调用AdjustTokenPrivileges启用 SeDebugPrivilege。
  3. 使用该特权OpenProcess打开 SYSTEM 级别的进程(如 lsass、winlogon)。
  4. 读取目标进程令牌,DuplicateToken 复制高权限访问令牌,实现身份窃取。

链路 3:UAC Bypass

  1. 管理员账号登录,默认是过滤后的低权限令牌。
  2. 利用 Windows 组件缺陷,绕过 UAC 弹窗验证,直接获取完整管理员高权限令牌
  3. 使用完整令牌创建新进程,执行高权限操作。

链路 4:内核漏洞提权(Kernel Exploit)

  1. 用户态低权限进程,触发 ntoskrnl / 第三方驱动内核漏洞,实现内核态任意代码执行。
  2. 在内核内存中直接修改当前进程 TOKEN,替换 TOKEN 内 SID,直接改成 SYSTEM。
  3. 返回用户态,进程的访问令牌已经是 SYSTEM,SRM 直接放行所有高权限操作。

七、边界、限制与误区

✅ 功能边界

  1. 特权不能凭空新增:AdjustTokenPrivileges 只能启用令牌内已存在的特权;不能添加令牌没有的 Se * 特权。
  2. 令牌分主令牌 / 模拟令牌;模拟令牌仅作用于单线程,适合 SMB/RPC 横向移动,本地 LPE 多用主令牌。
  3. UAC 过滤令牌:管理员账号默认登录拿到过滤令牌,移除部分管理员 SID 与特权;提升后才拿到完整管理员令牌。
  4. 资源 DACL 错误修改属于间接提权:SID 不变,但资源允许低 SID 访问,不修改访问令牌

⚠️ 安全边界

  1. 内核级提权是最高危害:直接在内核修改 TOKEN,完全绕开用户态所有安全检查(UAC、DACL、特权检查)
  2. 令牌窃取依赖目标进程PROCESS_QUERY_INFORMATION / PROCESS_DUP_HANDLE权限;没有对应权限无法复制令牌。
  3. 很多 LPE 依赖本地交互访问;仅网络远程无本地会话,部分 LPE 无法触发。

❌ 常见误区

  1. 误区:管理员账号 = 全程拥有全部特权

纠正:UAC 过滤令牌,管理员默认使用删减后的令牌,很多高特权默认禁用。

  1. 误区:拿到 SeDebugPrivilege 直接就是 SYSTEM

纠正:SeDebugPrivilege 只是允许打开进程;还需要打开高权限进程,复制其令牌,才能拿到 SYSTEM 身份。

  1. 误区:修改 DACL 就是修改访问令牌

纠正:DACL 属于资源对象;访问令牌属于主体进程,两者独立。

  1. 误区:UAC 弹窗只是简单的确认框,只是提醒

纠正:UAC 底层是两套不同访问令牌切换;UAC Bypass 本质是绕过令牌切换校验。

八、提权类型汇总表

提权类型 原理 是否修改令牌 SID 典型例子
服务文件权限缺陷提权 服务 EXE 低权限可写,重启后以服务账号执行恶意代码 ✔ 拿到新高 SID 令牌 旧版本第三方服务
特权滥用提权 启用令牌内已存在的高特权,绕过 DACL ❌ SID 不变 SeDebugPrivilege、SeTakeOwnershipPrivilege
UAC 绕过 绕过 UAC 验证,获取完整管理员令牌 ✔ 切换到完整管理员 SID UAC bypass 各类方法
内核漏洞提权 内核漏洞,内核态修改进程 TOKEN 结构体 ✔ 直接改写 SID 为 SYSTEM CVE-2021-40449 等
DLL 劫持提权 高权限进程加载恶意 DLL,继承进程令牌 ✔ 继承宿主高 SID 系统服务 DLL 搜索顺序劫持
注册表配置缺陷提权 服务注册表项低权限可修改,修改 ImagePath 指向恶意程序 ✔ 拿到服务账号令牌 服务注册表项 ACL 配置错误

九、防御思路(基于 NT 权限链)

  1. 最小权限原则:服务运行账号尽量使用低权限本地服务账号,不要直接 SYSTEM。
  2. 资源 ACL 加固:服务 EXE、注册表项严格限制写入权限,普通用户不可修改。
  3. 特权最小化:不要给普通账号分配高风险特权。
  4. 补丁管理:修复内核、系统组件、第三方软件漏洞。
  5. 监控:审计令牌复制、AdjustTokenPrivileges、进程打开 lsass/winlogon 等高危行为(SACL 审计)。

关于权限概念、权限提升概念以及权限提升的分类和目的,以下是一些基本信息供您参考:

  1. 权限概念:

    • 权限是指系统或应用程序授予用户或进程执行某些操作或访问资源的能力。
    • 权限通常按照用户的身份、角色或组织结构来管理,以确保系统安全和数据保护。
  2. 权限提升概念:

    • 权限提升是指用户或进程获取更高级别权限的过程,以便执行需要更高权限级别的操作。
    • 在操作系统中,常见的权限提升方式包括用户提升为管理员权限或进程提升为系统级权限。
  3. 权限提升的分类:

    • 根据权限提升的方式,可以将权限提升分为用户权限提升和进程权限提升两种类型。
    • 用户权限提升:用户通过输入密码或其他身份验证方式提升为管理员权限,以执行系统级操作。
    • 进程权限提升:某些程序或进程可能需要获取更高级别的权限才能执行某些操作,这就涉及到进程权限提升。
  4. 权限提升的目的:

    • 提供必要的权限以执行特定任务:有些任务需要更高级别的权限才能完成,权限提升允许用户或进程执行这些任务。
    • 确保系统安全性:权限提升通常需要经过身份验证或授权,以确保只有经过授权的用户或进程才能获得更高级别的权限。
    • 防止滥用权限:权限提升应该是有条件的,避免用户或进程滥用获得的更高级别权限,以维护系统的安全和稳定性。

Windows 提权的基础原理是了解操作系统的安全机制和权限管理。以下是一些与 Windows 提权相关的基础原理知识:

  1. 用户权限:

    • Windows 操作系统使用用户账户来管理和控制对系统资源的访问。
    • 用户账户可以分为标准用户和管理员用户,管理员用户具有更高级别的权限。
  2. 用户令牌:

    • 用户登录时,操作系统为其分配一个访问令牌(Access Token)。
    • 令牌包含用户权限信息,用于验证用户对系统资源的访问权限。
  3. 访问控制列表(ACL):

    • Windows 使用访问控制列表来管理文件、文件夹、注册表项等资源的访问权限。
    • ACL 决定了哪些用户或组可以执行特定操作,比如读取、写入、修改等。
  4. 提权方式:

    • 常见的 Windows 提权方式包括滥用弱点、利用漏洞、修改系统设置等。
    • 例如,攻击者可能利用系统服务、进程、DLL 或驱动程序中的漏洞来提升自己的权限。
  5. 安全标识:

    • 安全标识是一个数据结构,用于描述用户和组的安全属性。
    • 它包括用户的 SID(安全标识符)和权限等信息。
  6. UAC(用户账户控制):

    • UAC 是 Windows 的一项安全功能,旨在限制管理员权限的滥用。
    • 当需要执行需要管理员权限的操作时,UAC 会弹出提示框,要求用户确认或输入管理员密码。
  1. Windows服务:

    • Windows服务是在后台运行的应用程序,具有系统级别的权限。
    • 某些服务可能存在漏洞,可以被攻击者利用来提升权限。
  2. 提权工具:

    • 有一些专门设计用于在Windows系统中执行提权的工具,例如PowerSploit、Mimikatz等。
    • 这些工具通常利用操作系统或应用程序中的漏洞,以获取更高级别的权限。
  3. 文件系统权限:

    • Windows文件系统(NTFS)使用访问控制列表(ACL)来管理文件和文件夹的权限。
    • 攻击者可能试图修改文件或文件夹的权限以获取敏感信息或执行恶意操作。
  4. Windows注册表:

  • Windows注册表包含系统和应用程序的配置信息。
  • 修改注册表中的关键项可以影响系统行为或获取更高级别的权限。

Windows提权攻击的进一步知识

  1. 社会工程:
  • 除了技术手段,攻击者还可以利用社会工程技术来获取权限。
  • 通过欺骗用户或管理员来获得他们的凭据或权限信息。
  1. 安全补丁和更新:
  • 定期安装Windows的安全补丁和更新是防止提权攻击的重要措施。
  • 补丁通常修复已知漏洞,减少系统受攻击的风险。
  1. Kernel Exploitation(内核利用):
  • 内核是操作系统的核心部分,控制着系统资源和各种功能。
  • 内核级别的漏洞可以被攻击者利用来提升权限并执行恶意代码。
  1. User Account Control (UAC) Bypass(用户账户控制绕过):
  • UAC 是用于限制管理员权限滥用的安全功能,但它也可能存在漏洞。
  • 攻击者可能通过绕过UAC来获取管理员权限而不触发UAC的提示框。
  1. DLL Injection(动态链接库注入):
  • DLL注入是一种技术,允许攻击者将恶意DLL加载到进程中,以获取更高的权限。
  • 通过注入恶意DLL,攻击者可以修改进程行为、窃取敏感信息等。
    DLL注入技术起源可以追溯到Windows操作系统的早期阶段,大约在1990年代中期。当时,开发人员开始探索如何利用动态链接库(DLL)来增强程序的功能性,并且为了实现一些特定的目的,比如增加调试功能或者实现程序间的通信。随着时间的推移,DLL注入技术也被黑客和恶意软件作者用于进行恶意行为。

    DLL注入技术的发展经历了几个阶段:

    1. 早期探索阶段(1990年代中期):开发人员开始探索如何利用动态链接库(DLL)来增强程序的功能性和灵活性。这个阶段的重点是在开发和测试环境下使用DLL注入技术。

    2. 安全工具和调试工具(2000年代初期):随着DLL注入技术的普及,安全研究人员和开发者开始开发各种工具,如调试器和注入器,用于测试和分析软件,以及进行系统调试。

    3. 黑客和恶意软件使用(2000年代中期至今):随着对DLL注入技术的了解和进一步发展,黑客和恶意软件作者开始广泛使用该技术进行恶意活动,比如窃取敏感信息、操纵系统、隐藏恶意代码等。这导致了DLL注入技术成为恶意软件攻击中的常见手段之一。

    4. 对抗和防御(2000年代中期至今):安全研究人员和开发者不断努力改进防御措施,以抵御DLL注入等恶意行为。这包括使用数字签名验证、安全软件的行为监控、内核模式防御技术等手段,以提高系统的安全性和抵御恶意注入的能力。

    DLL注入技术有几个主要的分支,每个分支都有不同的实现方式和应用场景:

    1. 远程线程注入:远程线程注入是一种将代码注入到远程进程中执行的技术。它通常通过创建远程线程并在其中执行恶意代码的方式来实现。这种注入方法常用于恶意软件攻击中,以实现对其他进程的控制或执行恶意操作。

    2. 挂钩注入:挂钩注入是一种利用Windows操作系统的API挂钩机制来注入代码的技术。通过挂钩,恶意代码可以截取和修改目标进程的系统调用和消息传递,从而实现各种恶意行为,比如键盘记录、窃取信息等。

    3. 反射注入反射注入是一种利用.NET Framework的反射机制来实现DLL注入的技术。通过反射,恶意代码可以将DLL加载到目标进程中,并执行其中的代码,而无需通过传统的LoadLibrary等API函数来加载DLL。

    4. APC注入:异步过程调用(APC)注入是一种利用Windows操作系统的APC机制来注入代码的技术。通过将恶意代码插入目标进程的异步过程调用队列中,恶意软件可以在目标进程的上下文中执行代码,而无需创建新的线程或改变目标进程的执行路径。

    5. 模块注入:模块注入是一种将DLL注入到目标进程中并执行其中的代码的技术。它通常通过修改目标进程的PEB(进程环境块)或通过注入器程序来实现。模块注入通常用于实现代码注入、调试和破解等操作。

    这些分支在实践中经常结合使用,以实现更复杂和隐蔽的攻击或操作。

  1. Privilege Escalation Vulnerabilities(权限提升漏洞):
  • 权限提升漏洞是指操作系统或应用程序中存在的漏洞,可被攻击者用来提升权限。
  • 攻击者可能利用这些漏洞来绕过安全机制,获取比其初始权限更高的权限。
  1. Least Privilege Principle(最小权限原则):
  • 最小权限原则是一种安全原则,建议用户仅具有完成工作所需的最低权限。
  • 限制用户的权限可以减少潜在的风险和攻击面。
  1. Token Manipulation(令牌操作):
  • Windows使用访问令牌来确定用户和进程的权限。
  • 攻击者可能尝试修改或伪造访问令牌,以获取更高级别的权限。
  1. Lateral Movement(横向移动):
  • 横向移动是指攻击者在受感染的网络中移动,以获取更多系统的权限。
  • 攻击者可能使用已获得的权限和凭据来渗透其他系统和账户。
  1. Credential Dumping(凭据转储):
  • 凭据转储是指攻击者从系统中提取敏感凭据,如密码哈希或明文密码。
  • 这些凭据可以用于进一步的攻击,如密码破解或伪造身份。
  1. Sandbox Evasion(沙盒逃避):
  • 沙盒是一种限制应用程序行为的隔离环境,以保护系统免受恶意软件的影响。
  • 攻击者可能尝试绕过沙盒限制,以执行恶意操作。
  1. Zero-Day Vulnerabilities(零日漏洞):
  • 零日漏洞是指被攻击者利用,但尚未被厂商修补的漏洞。
  • 攻击者可能利用这些未知漏洞来提升权限并执行攻击。
  1. 持久性(Persistence):
  • 攻击者可能通过在系统上创建持久性机制,确保他们在重新启动后仍保持访问权限。
  • 例如,创建计划任务、服务或修改启动项等。
  1. Privilege Escalation Vulnerabilities(权限提升漏洞):
  • 权限提升漏洞是指存在于操作系统或应用程序中的漏洞,可被攻击者利用来获取比他们当前权限更高的权限。
  • 攻击者可能通过利用这些漏洞来绕过访问控制机制,提升其权限级别。
  1. User Account Control (UAC)(用户账户控制):
  • UAC是Windows中的一种安全功能,用于限制标准用户的权限,并在需要管理员权限时进行提示。
  • 攻击者可能尝试绕过UAC限制,以执行需要管理员权限的操作。
  1. Kernel Exploitation(内核利用):
  • 内核是操作系统的核心部分,包含关键的系统资源和功能。
  • 攻击者可能尝试利用操作系统内核中的漏洞来实现提权或执行恶意操作。
  1. Patch Management(补丁管理):
  • 补丁管理是指及时安装操作系统和应用程序的安全补丁,以修复已知的漏洞。
  • 定期更新系统和软件,以减少受到已公开漏洞攻击的风险。
  1. Least Privilege Principle(最小权限原则):
  • 最小权限原则是指为用户和进程分配最低必要权限,以限制攻击者获取敏感数据或执行恶意操作的能力。
  • 通过限制权限范围,可以最大程度地减少潜在的提权攻击。
  1. Secure Configuration(安全配置):
  • 安全配置涉及对操作系统、应用程序和网络设备进行正确配置,以减少安全漏洞和风险。
  • 配置强密码策略、禁用不必要的服务、启用防火墙等可以加强系统安全性。
  1. Audit and Monitoring(审计和监控):
  • 审计和监控系统活动可以帮助发现异常行为和潜在的提权攻击。
  • 启用日志记录、实施实时监控和使用入侵检测系统等可以提供早期威胁警报和事件响应能力。
  1. Privilege Separation(权限分离):
  • 权限分离是一种安全原则,旨在将系统中的不同功能和数据分隔开来,并为每个实体分配最小必要的权限。
  • 通过权限分离,可以降低攻击者获取系统控制权的可能性。
  1. Secure Boot(安全启动):
  • 安全启动是一种用于保护系统免受恶意代码篡改的技术,确保在启动过程中加载的软件和驱动程序是受信任的。
  • 使用安全启动可以减少恶意软件对系统进行篡改或提权的机会。
  1. Code Signing(代码签名):
  • 代码签名是一种验证软件或文件来源和完整性的方法,可帮助用户确定文件是否被篡改或被恶意软件感染。
  • 通过使用代码签名,可以降低恶意软件利用漏洞进行提权攻击的风险。
  1. Secure Development Practices(安全开发实践):
  • 在开发应用程序或系统时,遵循安全开发实践是至关重要的,以减少漏洞和安全弱点的存在。
  • 安全开发包括代码审查、安全测试、输入验证等活动,可以提高系统的安全性并减少提权攻击的可能性。
  1. Threat Intelligence(威胁情报):
  • 威胁情报是指关于威胁行为、漏洞和恶意软件的信息,可用于识别和应对潜在的提权攻击。
  • 定期获取和分析威胁情报,可以帮助组织加强安全防御,并及早发现潜在的安全威胁。
  1. Security Incident Response Plan(安全事件响应计划):
  • 安全事件响应计划是组织为应对安全事件而制定的指导方针和程序,包括如何应对提权攻击等安全事件。
  • 有一个完善的安全事件响应计划可以帮助组织迅速应对安全事件,减少损失并恢复系统功能。
  1. Exploit(利用程序):
  • 利用程序是指利用软件或系统中已知的漏洞来实施攻击的代码或技术。
  • 攻击者可能使用已知的漏洞来执行提权攻击,从而获取比当前权限更高的特权级别。
  1. Zero-day Vulnerability(零日漏洞):
  • 零日漏洞是指已存在但尚未公开披露并修复的漏洞。
  • 攻击者可能利用零日漏洞来进行提权攻击,因为这些漏洞对于系统管理员和安全厂商来说是未知的。
  1. Token Privilege(令牌权限):
  • 在Windows中,每个用户登录后都会分配一个访问令牌,其中包含了用户的权限信息。
  • 通过修改令牌权限,攻击者可以将其权限级别提升到比当前用户更高的级别。
  1. DLL Hijacking(DLL劫持):
  • DLL劫持是一种利用应用程序加载动态链接库(DLL)时的弱点来进行攻击的技术。
  • 攻击者可能替换或注入恶意DLL,以执行提权攻击或执行其他恶意操作。
  1. Password Cracking(密码破解):
  • 密码破解是指尝试通过暴力破解、字典攻击或其他方法来获取用户密码的过程。
  • 攻击者可能使用密码破解技术来获取管理员账户的密码,以实施提权攻击。
  1. Phishing(钓鱼):
  • 钓鱼是一种社会工程学攻击,通过伪装成可信实体来欺骗用户输入敏感信息。
  • 攻击者可能通过钓鱼攻击来获取管理员账户的凭据,从而进行提权攻击。
  1. Network Segmentation(网络分割):
  • 网络分割是将网络划分为多个隔离的子网或虚拟局域网(VLAN)的过程。
  • 通过网络分割,可以限制攻击者在网络中移动和扩散,减少提权攻击的影响范围。
  1. Kernel Exploitation(内核利用):
  • 内核利用是指利用操作系统内核中存在的漏洞来执行恶意代码或获取系统特权的过程。
  • 攻击者可能使用内核利用来实施提权攻击,因为内核拥有较高的系统权限。
  1. Pass-the-Hash Attack(哈希传递攻击):
  • 哈希传递攻击是一种利用用户凭据的哈希值来获取对系统资源的访问权限的攻击方法。
  • 攻击者可以通过获取并传递用户凭据的哈希值来获得更高的权限级别,而无需知道明文密码。
  1. Lateral Movement(横向移动):
  • 横向移动是指攻击者在已经感染的系统内移动,并尝试获取对其他系统或资源的访问权限。
  • 提权攻击常常伴随着横向移动,攻击者通过在网络中移动来获取更高的权限级别。
  1. Privilege Escalation Vulnerability(权限提升漏洞):
  • 权限提升漏洞是指系统中的漏洞或配置错误,可以被攻击者利用来获取比当前权限更高的特权级别。
  • 攻击者可能通过利用权限提升漏洞来实施提权攻击。
  1. User Account Control (UAC)(用户帐户控制):
  • 用户帐户控制是Windows中的一种安全功能,用于限制标准用户的操作和提高系统的安全性。
  • UAC可以降低恶意软件或攻击者执行提权攻击的能力,因为它需要用户明确授权敏感操作。
  1. Patch Management(补丁管理):
  • 补丁管理是指定期检查和应用操作系统和应用程序的安全补丁,以修复已知漏洞并提高系统的安全性。
  • 及时进行补丁管理可以减少攻击者利用已知漏洞进行提权攻击的机会。
  1. Privilege Escalation Tools(权限提升工具):
  • 权限提升工具是一类用于执行提权攻击的软件或工具。
  • 这些工具可以利用已知的漏洞、弱点或配置错误来提升用户的权限级别。
  1. Password Spraying(密码喷洒):
  • 密码喷洒是一种攻击技术,攻击者尝试使用少量常见密码来尝试登录多个帐户。
  • 攻击者可能使用密码喷洒来获取管理员账户的密码,从而实施提权攻击。
  1. Remote Desktop Protocol (RDP) Exploitation(远程桌面协议利用):
  • 远程桌面协议是一种允许用户通过网络远程连接到计算机的协议。
  • 攻击者可以利用远程桌面协议中的漏洞或弱点来执行提权攻击。
  1. File Permission Manipulation(文件权限操纵):
  • 文件权限操纵是指攻击者通过修改文件的权限设置来获取对文件的访问权限。
  • 攻击者可能通过操纵文件权限来执行提权攻击,以获取比当前用户更高的权限级别。
  1. Social Engineering(社会工程学):
  • 社会工程学是一种攻击技术,攻击者通过欺骗、误导或操纵人们来获取信息或执行操作。
  • 攻击者可能使用社会工程学技术来获得管理员账户的凭据,从而实施提权攻击。
  1. Privilege Separation(权限分离):
  • 权限分离是一种安全原则,将不同的任务或进程分配给不同的权限级别。
  • 通过权限分离,可以减少攻击者在系统中执行提权攻击的机会。
  1. Kernel Patching(内核修补):
  • 内核修补是指对操作系统内核进行修复或更新,以解决已知的漏洞或安全问题。
  • 及时应用内核修补程序可以减少攻击者利用内核漏洞进行提权攻击的机会。
  1. DLL Hijacking(DLL劫持):
  • DLL劫持是一种攻击技术,攻击者通过替换系统或应用程序所需的动态链接库(DLL)来执行恶意代码。
  • 攻击者可以利用DLL劫持来实施提权攻击,以获取比当前用户更高的权限级别。
  1. Token Manipulation(令牌操纵):
  • 令牌操纵是指攻击者修改或伪造用户令牌的过程,以获取比当前用户更高的权限级别。
  • 通过令牌操纵,攻击者可以提升自己的权限并执行提权攻击。
  1. Exploit Development(漏洞开发):
  • 漏洞开发是指研究和利用操作系统或应用程序中的未知漏洞,以执行恶意操作或提升权限。
  • 攻击者可能通过漏洞开发来发现并利用新的提权漏洞。
  1. Sandbox Escaping(逃逸沙箱):
  • 沙箱逃逸是指攻击者绕过沙箱环境的安全限制,以执行恶意代码或提升权限。
  • 攻击者可能通过逃逸沙箱来实施提权攻击,从而获取对系统更高级别的访问权限。

还有很多探讨的。。。


 

posted @ 2024-03-12 12:25  suv789  阅读(691)  评论(0)    收藏  举报