这篇文章将会对Windows 令牌窃取及防御技术进行介绍,所使用的环境是上一篇文章中搭建的环境:搭建一个简单的Windows域环境
1. 什么是访问令牌 Windows 访问令牌(Access Tokens) 是一个描述进程或线程安全上下文的对像。 令牌中的信息包括与进程或线程关联的用户帐户的标识和特权。当用户登录时,系统通过将用户密码与安全数据库中存储的信息进行比较来验证用户密码。如果密码通过身份验证,则系统将生成访问令牌。该用户执行的每个进程都有此访问令牌的副本。 当线程与安全对象进行交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户。访问令牌包含以下信息:
- 用户帐户的安全标识符(SID)
- 用户帐户所属的用户群的SIDs
- 一个logon SID,标识当前登录会话
- 用户或用户群的特权清单
- 所有者的SID
- 基本群的SID
- 当用户创建可安全对象(securable object)且没有给出安全描述符时,系统使用的缺省的自主访问控制列表(DACL)
- 访问令牌资源
- 是否为primary或impersonation token
- 限制性SIDs的可选列表
- 当前impersonation级别
- 其他统计
攻击者可以使用访问令牌在不同的用户或系统安全性上下文下进行操作,以执行操作并逃避检测。 攻击者可以使用内置的Windows API函数来复制现有进程中的访问令牌。这被称为令牌窃取。 攻击者必须已经在特权用户上下文(即管理员)中才能窃取令牌。攻击者通常使用令牌窃取将其安全上下文从管理员级别提升到SYSTEM级别。如果帐户对远程系统具有适当的权限,则对手可以使用令牌作为该令牌的帐户向远程系统进行身份验证。 攻击者可以通过以下三种方法来利用访问令牌: 令牌模拟/盗窃 -使用 DuplicateToken(Ex) 函数创建一个新的访问令牌,该令牌复制自现有令牌。然后可以将该令牌用于 ImpersonateLoggedOnUser 函数,允许调用线程模拟已登录用户的安全上下文,或者使用 SetThreadToken 函数将模拟令牌分配给线程。当目标用户在系统上具有非网络登录会话时,这很有用。 使用令牌创建进程 - 通过DuplicateToken(Ex)复制令牌,并使用CreateProcessWithTokenW 把复制的令牌用于创建在模拟用户的安全上下文下运行的新进程。这对于在其他用户的安全上下文下创建新进程很有用。 制作和模拟令牌 - 攻击者具有用户名和密码,但用户未登录到系统。可以使用LogonUser 函数为用户创建登录会话。该函数将返回新会话的访问令牌的副本,并且可以使用 SetThreadToken 函数用来将令牌分配给线程。 任何标准用户都可以使用 runas 命令和 Windows API 函数来创建模拟令牌。它不需要访问管理员帐户。
2.如何窃取令牌
下面是窃取 SYSTEM 账号访问令牌的流程, SYSTEM 账号(超级管理员)权限比管理员权限更高,如可以修改一些系统注册表、修改一些系统文件。
- 首先,我们需要是管理员,如果不是,可以使用 bypass uac 等技术进行提权。
- 复制访问令牌的进程需要启用 SeDebugPrivilege 权限。
- 使用 OpenProcess 函数获取具有 SYS