【权限与会话】Windows 令牌

概述:Winodws 令牌详解,关于 windows 初始令牌、主令牌,模拟令牌,关联令牌等概念的说明。

工具推荐:diversenok/TokenUniverse: An advanced tool for working with access tokens and Windows security policy.

0x01 初始令牌

初始令牌也称访问令牌,是描述进程或线程的安全上下文的对象。令牌中的信息包括与进程或线程关联的用户帐户的标识和特权信息。

当用户登录时,系统通过将用户密码与安全数据库(如域认证中的NTDS或本地认证中的SAM文件)中存储的信息进行比较来验证用户密码。

如果密码经过验证,则系统将生成访问令牌。代表该用户执行的每个进程都有此访问令牌的副本。(通常我们在输入密码登陆进入Windows界面时就是一个生成访问令牌的过程)当线程与安全对象进行交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户。

访问令牌包含以下信息:

flowchart LR
    A[访问令牌] --> 用户所在组SID
    A --> C[用户账户的安全描述符 SID]
    A --> D["标识当前登录会话(logon session)的登录SID"]
    A --> E["特权(privilege):用户或用户组拥有的特权列表"]
    A --> F["其他数据"]

Access Token的组成

  1. 用户账户的安全标识符(SID)
  2. 用户所属的组的SID
  3. 用于标识当前登陆会话的登陆SID
  4. 用户或用户组所拥有的权限列表
  5. 所有者SID
  6. 主要组的SID
  7. 访问控制列表
  8. 访问令牌的来源
  9. 令牌是主要令牌还是模拟令牌
  10. 限制SID的可选列表
  11. 目前的模拟等级
  12. 其他统计的数据

初始令牌的创建过程

Windows Access Token 创建过程,可以参考下 《深入解析 Windows 操作系统 第6版》第六章第8节相关描述

  1. 登录主要分为两种形式,一种是非交互式的,一种是交互式的

    • 非交互式的,用户在输入用户名和密码后,由 WinLogon 调用 LSASS(Local Security Authority Subsystem Service) 中的相关函数(LasLogonUser)传递登录信息给认证包

    • 对于交互式登录,Windows使用两个标准的认证包∶ KerberosMSV1_0

  2. 认证通过后,LSASS 在本地策略中查找该用户有哪些允许的访问,包括交互方式、网络方式、批方式或服务方式,如果当前所请求的登录不符合数据库中允许

    的访问方式,则此次登录被终止。如果当前请求的登录是允许的,则 LSASS 会加入一些额外的安全ID(SID),然后在策略数据库中查找用户所有SID的已经被授予的权限,并且把这些特权加入到用户的访问令牌中。

  3. 当 LSASS 已经积累了所有这些必要的信息时,会调用执行体来创建 访问令牌。执行体

    • 为交互式登录或服务方式登录创建一个主访问令牌
    • 为网络方式登录创建一个模仿令牌

    创建成功后, LSASS 复制此令牌,创建一个可将此令牌传递给 WinLogon 的句柄,然后关闭自身句柄。

综上就是 Windows 初始令牌的创建过程。

之后,则是通过 WinLogon 中的令牌创建进程、线程。 进程持有一个主令牌,线程则使用的模拟令牌。

0x02 授权令牌和模拟令牌

访问令牌(Access Token)是Windows操作系统用描述进程或者线程安全上下文的一个对象。

Windows下有两种类型的Token令牌:授权令牌和模拟令牌。

授权令牌(Delegation Token)

也叫主令牌,是由 Windows 内核创建并分配给进程的默认访问令牌,每一个进程有一个主令牌,它描述了与当前进程相关的用户帐户的安全上下文。用于交互式登录(如rdp登录访问)。

模拟令牌(Impersonation Token)

所在进程的主令牌会自动附加到当前的线程上,作为线程的安全上下文。而线程可以运行在另一个非主令牌的访问令牌下执行,而这个令牌被称为模拟令牌。用于非交互式的会话(利用WMI进行远程访问)。


注:两种令牌会在系统重启或者关机后才会全部清除,不然将会一直在内存中存留。也就是说,如果机器不关机或者重启的话,就会存在散落的令牌。在系统注销后,具有授权令牌的用户会变为模拟令牌 Impersonation Token,但依然有效。默认情况下,当前用户只能看到当前用户自己和比自己权限低的所有访问令牌。

每个进程都有一个主要令牌,用于描述与该进程关联的用户帐户的安全上下文。默认情况下,当进程的线程与安全对象进行交互时,系统使用主令牌。
此外,线程可以模拟客户端帐户。模拟允许线程使用客户端的安全上下文与安全对象进行交互。模拟客户端的线程同时具有主令牌和模拟令牌。(出现这种情况是因为服务操作是在寄宿进程中执行,在默认的情况下,服务操作是否具有足够的权限访问某个资源(比如文件)取决于执行寄宿进程Windows帐号的权限设置,而与作为客户端的Windows帐号无关。在有多情况下,我们希望服务操作执行在基于客户端的安全上下文中执行,以解决执行服务进行的帐号权限不足的问题。简单来说就是我们希望不同客户端来访问服务时,服务可以模拟客户端的身份去访问服务,而不是用自己的主进程Token身份去访问。)

为什么使用模拟令牌

使用模拟令牌有助于实现权限分离。即使进程本身可能拥有较高的权限,但通过模拟令牌,可以以较低权限的用户身份执行一些敏感操作,从而减小潜在的安全风险。

除权限分离以外,Windows 令牌机制带来了单点登录和访问控制等众多好处。

管理员登录时,将为用户创建两个单独的访问令牌:标准用户访问令牌和管理员访问令牌。标准用户访问令牌包含与管理员访问令牌相同的特定于用户的信息,但删除了管理员的 Windows 特权和 SID。此外,执行 explorer.exe 也通过标准令牌来显示桌面,而 explorer.exe 是父进程,所有其他用户启动的进程都从中继承其访问令牌。因此,除非用户批准应用程序使用完整的管理访问令牌,否则所有应用程序都会以标准用户身份运行。

0x03 关于令牌的补充

  • Token 在系统重启后会清除

【权限与会话】Windows 令牌
https://hodlyounger.github.io/A_OS/Windows/权限与会话/【权限与会话】Windows 令牌/
作者
mingming
发布于
2024年2月7日
许可协议