安全矩阵

 找回密码
 立即注册
搜索
查看: 2167|回复: 0

Windows Token原理及利用

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-15 16:20:00 | 显示全部楼层 |阅读模式
原文链接:Windows Token原理及利用

NO.1 登陆会话与访问令牌
在windows登录后,一旦用户成功通过身份验证,LSA 将创建一个新的登录会话并生成一个访问令牌,一个登录会话可以有多个关联的访问令牌,但一个访问令牌只能链接到一个登录会话。
每个新登录会话都可以通过 64 位本地唯一标识符 (LUID) 进行识别,称为登录 ID,并且每个访问令牌都必须包含一个身份验证 Id(或 AuthId)参数,该参数通过此 LUID 标识源/链接登录会话。当然,每一个进程也是对应一个访问令牌并关联一个登录会话。
访问令牌充当的是登录会话替身,代表了用户的安全上下文属性,比如说SID、GROUP、PRIV等。
在任务管理器就能看到每个进程对应的用户,这也是访问令牌其中的一个标识:

NO.2 令牌的作用
每一个进程都都有一个唯一的主令牌,而一个进程可以有多个线程。每当线程尝试访问由 Windows 内核管理的安全对象时,例如进程、线程、句柄、令牌等,Windows 都会执行访问检查:
  •         谁请求的访问?
  •         它访问对象的意图是什么?
  •         谁可以访问对象?

首先,Windows会检查调用线程关联的令牌的授权属性(例如,用户 sid、组成员身份、权限等),然后Windows 将查看线程请求的所需访问权限,最后还需要表明访问的意图。

在检查过程中,Windows会检索目标对象的安全描述符。安全描述符包含一个自由访问控制列表(DACL ),它指定哪些用户/组有权访问对象以及授予的访问权限。
某些特权可以使用户绕过内核中对给定对象的访问检查。例如,如果令牌启用了SeDebugPrivilege特权,Windows内核将跳过对任何进程和线程对象的DACL检查。常见的滥用比如:凭据窃取、提权、防御规避等。

除了SeDebugPrivilege,还有其他特权也经常被攻击者滥用:
1.SeBackupPrivilege
描述:此权限使授予对任何文件的所有读取访问控制权,而不管为该文件指定的[访问控制列表](https://msdn.microsoft.com/libra ... ss-control-list-gly)(ACL)。
攻击场景:收集
2.SeCreateTokenPrivilege
描述:需要创建主令牌。
攻击场景:权限提升
3.SeLoadDriverPrivilege
描述:需要加载或卸载设备驱动程序。
攻击场景:持久化;防御规避
4.SeRestorePrivilege
描述:需要执行还原操作。此特权使系统授予对任何文件的所有写访问控制,而不管为文件指定的 ACL。
攻击场景:持久化;防御规避
5.SeTakeOwnershipPrivilege
描述:需要获得对象的所有权而不被授予自由访问权限。
攻击场景:持久化;防御规避;收集
6.SeTcbPrivilege
描述:此权限将其持有者标识为受信任计算机库的一部分。某些受信任的受保护子系统被授予此特权。
攻击场景:权限提升
NO.3 模拟令牌
模拟是指在安全上下文中执行线程的功能,该上下文不同于拥有该线程的进程的上下文。在客户端的安全上下文中运行时,服务器在一定程度上"是"客户端。服务器线程使用代表客户端凭据的访问令牌来获取对客户端具有访问权限的对象的访问权限。
访问令牌是描述进程或线程的安全上下文的对象。它们提供的信息包括用户帐户的标识和用户帐户可用的特权子集。每个进程都有一个 主访问令牌 ,用于描述与进程关联的用户帐户的安全上下文。默认情况下,当进程的线程与安全对象交互时,系统将使用主标记。但是,当线程模拟客户端时,模拟线程同时具有主访问令牌和模拟令牌。模拟标记代表客户端的安全上下文,此访问令牌是在模拟期间用于访问检查的令牌。当模拟结束时,该线程会恢复为仅使用主访问令牌。
默认情况下,所有线程都将继承与其进程的主令牌相同的安全上下文。但是,模拟允许线程切换到不同的安全上下文。
NO.4 令牌的利用
攻击者可以通过三种方法利用访问令牌:
假冒/窃取令牌攻击者创建一个新的访问令牌,该令牌使用 DuplicateToken(Ex) 复制现有令牌。
使用令牌创建进程攻击者创建一个新的访问令牌,并使用它创建一个在模拟用户的安全上下文下运行的新进程。
制作和模拟令牌对手拥有用户名和密码,但用户未登录系统。攻击者可以使用该功能为用户创建登录会话。该函数将返回新会话的访问令牌的副本,攻击者可以使用该令牌将令牌分配给线程。

NO.5 窃取/模拟令牌流程
一般的利用流程为:
WindowsPrincipal:判断当前权限
LookupPrivilegeValue:判断是否拥有SeDebugPrivilege权限
OpenProcess:打开进程获取句柄
OpenProcessToken:打开进程令牌获取hToken
DuplicateToken:复制令牌
CreateProcessWithTokenW:启动进程

NO.6 其他问题
窃取问题
在窃取令牌时会发现,并不是所有的进程都能进行令牌窃取,这跟OpenProcess()提供的访问权限有关:
当我们使用 PROCESS_QUERY_INFORMATION 或 PROCESS_ALL_ACCESS 的访问权限对某些 SYSTEM 进程调用 OpenProcess() 时,我们可以成功窃取这些进程的访问令牌。这些进程包括:
  1. dllhost.exe
  2. lsass.exe
  3. OfficeClickToRun.exe
  4. svchost.exe(只适用于某些PID)
  5. Sysmon64.exe
  6. unsecapp.exe
  7. VGAuthService.exe
  8. vmacthlp.exe
  9. vmtoolsd.exe
  10. winlogon.exe
复制代码

对于受 PPL 保护的某些 SYSTEM 进程,如果我们以 PROCESS_QUERY_LIMITED_INFORMATION 访问权限调用 OpenProcess(),还是能够窃取访问令牌,这些进程包括:
  1. csrss.exe
  2. Memory Compression.exe
  3. services.exe
  4. smss.exe
  5. wininit.exe
复制代码


总结:

  • 如果想在某个进程上调用OpenProcessToken(),那么BUILTIN\Administrator必须为TokenOwner


  • 如果SYSTEM进程受PPL(Protected Process Light)保护,那么我们必须使用PROCESS_QUERY_LIMITED_INFORMATION访问权限来调用OpenProcess()


权限问题
模拟令牌的完整性级别必须小于或等于调用进程的完整性级别,否则模拟调用也将失败。比如,在开启UAC的情况下只能模拟未提升权限的(过滤的)中等完整性令牌。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-30 00:47 , Processed in 0.016467 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表