Part 1 详解令牌篡改攻击( 二 )


首先 , 我们来观察TOKEN结构 。

Part 1 详解令牌篡改攻击

文章插图
 
在上图中 , 我们可以看到TOKEN数据的完整结构 , 该结构中包含其他一些数据结构 , 这些结构用来定义与令牌有关的各种属性及信息 , 与登录用户密切相关 。
该结构中包含TokenId、Privileges数组 , 定义了对应该用户所分配的所有特权 , TokenType定义了令牌类型:Primary或者Impersonation等 。
接下来观察TOKEN结构中的部分数据结构 。
Part 1 详解令牌篡改攻击

文章插图
 
SEP_TOKEN_PRIVILEGES结构中包含与令牌相关的特权的所有信息 , 其中Present为令牌当前可用的权限;Enabled为已启用的权限;EnabledByDefault为默认情况下已启用的权限 。
Part 1 详解令牌篡改攻击

文章插图
 
TOKEN_TYPE为枚举类型 , 其中定义了令牌类型是否为Primary或者Impersonation(后续文章中会详细分析这方面内容) 。
Part 1 详解令牌篡改攻击

文章插图
 
SECURITY_IMPERSONATION_LEVEL也是一个枚举类型 , 其中指定了不同常量 , 用来决定调用进程可以在哪种级别模拟目标进程 。
常量的定义可参考微软官方文档 , 具体如下:
Part 1 详解令牌篡改攻击

文章插图
 
我们将使用TOKEN_TYPE及SECURITY_IMPERSONATION_LEVEL常量来模拟令牌 , 可根据具体情况来设置相应值 , 比如是使用Primary令牌来创建进程 , 或者是使用Impersonation令牌来模拟某个进程 。
Part 1 详解令牌篡改攻击

文章插图
 
SID_AND_ATTRIBUTES结构定义了SID(安全标识符)及SID的属性 。
0x02 特权
一般而言 , 特权(Privilege)这个词指的是上级单位根据某些条件赋予某人或者某个组织的一种特殊权利 。
与之类似 , 在Windows系统中 , 管理员可以为用户分配某些特权以执行系统相关的活动 。默认情况下系统会给用户分配一些特权 , 而管理员也可以使用“本地安全策略设置”在本地为用户分配一些特权 。
Part 1 详解令牌篡改攻击

文章插图
 
特权决定哪个用户可以控制系统资源 , 以执行系统相关任务 , 如关机、调试被其他进程使用的进程内存、将驱动载入内存中、备份文件及目录等 。
Windows系统中可用的特权常量可参考此处资料 。
在上文中 , 我们提到SEP_TOKEN_PRIVILEGES结构中包含Enabled及EnabledByDefault成员 , 这意味着分配给用户的所有特权默认情况下不一定处于启用状态 , 只有某些特权在分配时被启用 , 如果需要其他特权来执行系统相关任务 , 则必须通过外部方式启用这些特权 。
标准用户已启用的特权如下图所示:
Part 1 详解令牌篡改攻击

文章插图
 
如上图所示 , 只有SeChangeNotifyPrivilege特权处于启用状态 , 分配给用户的其他特权处于禁用状态 。为了使用这些特权 , 我们首先必须执行启用操作 。
在本系列文章中 , 我们将启用SE_DEBUG_NAME特权 , 该特权可以帮我们调试无法访问的进程或者运行在SYSTEM账户下的进程 。
下面来观察不同用户所对应的令牌 , 这里我们来观察运行在标准用户及管理员用户安全上下文中的notepad进程所对应的令牌 。
我们使用WinDbg来查看目标进程(这里为notepad.exe)的令牌 。
标准用户的令牌状态如下:
Part 1 详解令牌篡改攻击

文章插图
 
上图中可以看到进程对应的Session ID(已登录的会话)、Impersonation Level、TokenType等 , 该进程的令牌类型为Primary 。此外上图顶部的输出信息表明对应的线程没有处于模拟状态 , 使用的是Primary令牌 。
从图中可知分配给该进程的特权与分配给普通用户的特权一样 , 因为该进程运行在标准用户的安全上下文中 。
Elevation Type的值为3(Limited , 受限) , 这表明这是一个受限令牌 , 其中剔除了管理员特权 , 禁用了管理员组 。


推荐阅读