【权限与会话】Windows 令牌
概述:Winodws 令牌详解,关于 windows 初始令牌、主令牌,模拟令牌,关联令牌等概念的说明。
0x01 初始令牌
初始令牌也称访问令牌,是描述进程或线程的安全上下文的对象。令牌中的信息包括与进程或线程关联的用户帐户的标识和特权信息。
当用户登录时,系统通过将用户密码与安全数据库(如域认证中的NTDS或本地认证中的SAM文件)中存储的信息进行比较来验证用户密码。
如果密码经过验证,则系统将生成访问令牌。代表该用户执行的每个进程都有此访问令牌的副本。(通常我们在输入密码登陆进入Windows界面时就是一个生成访问令牌的过程)当线程与安全对象进行交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户。
访问令牌包含以下信息:
flowchart LR A[访问令牌] --> 用户所在组SID A --> C[用户账户的安全描述符 SID] A --> D["标识当前登录会话(logon session)的登录SID"] A --> E["特权(privilege):用户或用户组拥有的特权列表"] A --> F["其他数据"]
Access Token的组成
- 用户账户的安全标识符(SID)
- 用户所属的组的SID
- 用于标识当前登陆会话的登陆SID
- 用户或用户组所拥有的权限列表
- 所有者SID
- 主要组的SID
- 访问控制列表
- 访问令牌的来源
- 令牌是主要令牌还是模拟令牌
- 限制SID的可选列表
- 目前的模拟等级
- 其他统计的数据
初始令牌的创建过程
Windows Access Token 创建过程,可以参考下 《深入解析 Windows 操作系统 第6版》第六章第8节相关描述
-
登录主要分为两种形式,一种是非交互式的,一种是交互式的
-
非交互式的,用户在输入用户名和密码后,由
WinLogon
调用 LSASS(Local Security Authority Subsystem Service) 中的相关函数(LasLogonUser
)传递登录信息给认证包 -
对于交互式登录,Windows使用两个标准的认证包∶
Kerberos
和MSV1_0
-
-
认证通过后,LSASS 在本地策略中查找该用户有哪些允许的访问,包括交互方式、网络方式、批方式或服务方式,如果当前所请求的登录不符合数据库中允许
的访问方式,则此次登录被终止。如果当前请求的登录是允许的,则 LSASS 会加入一些额外的安全ID(SID),然后在策略数据库中查找用户所有SID的已经被授予的权限,并且把这些特权加入到用户的访问令牌中。
-
当 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 在系统重启后会清除