1.Access Token
1.1.Access Token简介
访问令牌(Access Token)是Windows操作系统用描述进程或者线程安全上下文的一个对象。Windows下有两种类型的Token令牌:授权令牌和模拟令牌。
- 授权令牌(Delegation Token),也叫主令牌,是由windows内核创建并分配给进程的默认访问令牌,每一个进程有一个主令牌,它描述了与当前进程相关的用户帐户的安全上下文。用于交互式登录(如rdp登录访问)。
- 模拟令牌(Impersonation Token),所在进程的主令牌会自动附加到当前的线程上,作为线程的安全上下文。而线程可以运行在另一个非主令牌的访问令牌下执行,而这个令牌被称为模拟令牌。用于非交互式的会话(利用WMI进行远程访问)。
主令牌与进程相关,模拟令牌与模拟令牌的线程相关。
注:两种令牌会在系统重启或者关机后才会全部清除,不然将会一直在内存中存留。也就是说,如果机器不关机或者重启的话,就会存在散落的令牌。在系统注销后,具有授权令牌的用户会变为模拟令牌Impersonation Token,但依然有效。默认情况下,当前用户只能看到当前用户自己和比自己权限低的所有访问令牌。
1.2.组成
Windows Access Token 组成如下:
- 用户帐户的安全标识符(SID)
- 用户所属的组的SID
- 用于标识当前登录会话的登录SID
- 用户或用户组所拥有的权限列表
- 所有者SID
- 主要组的SID
- 访问控制列表
- 访问令牌的来源
- 令牌是主要令牌还是模拟令牌
- 限制SID的可选列表
- 目前的模拟等级
- 其他统计数据
1.3.Local administrator
当本地管理员登录时,系统会创建两个 AccessToken: 一个具有管理员权限,另一个具有普通权限,当此用户执行进程时,将使用具有普通权限(非管理员)的 AccessToken 来进行操作。当用户尝试以管理员身份执行任何操作的时候,需要通过 UAC 后,才可使用具有管理员权限的 AccessToken。
1.4.令牌中的Privilege
特权是一个用户或组在本地计算机执行各种系统相关操作(关闭系统、装载设备驱动程序、改变系统时间)的权限,特权与访问权限的区别如下:
特权控制账户对系统资源和系统相关任务的访问,而访问权限控制对安全对象(可以具有安全描述符的对象)的访问
系统管理员为用户或组指派特权,而系统根据对象的DACL中的ACE授予或拒绝对安全对象的访问,有时拥有特权可以忽略ACL的检查
上文中我们介绍Access Token 组成,其中有一部分表示了该用户及该用户所属组所拥有的特权,如下图所示:
默认情况下大部分特权是禁用状态,在使用时需要启用,但是bypassUAC之后,就会获取完整特权。
其中不乏危险特权,这里举例几个最常用的,不一一赘述,这里直接贴一下大佬的研究,有兴趣的自行查看。
1.4.1.危险的特权--SeDebugPrivilege
Ps:仅列出危险特权以及危害,不做具体演示
通常情况下,用户只对属于自己的进程有调试的权限,但如果该用户Token中被赋予SeDebugPrivilege
并启用时,该用户就拥有了调试其他用户进程的权限,此时就可以对一些高权限进程执行操作以获取对应的权限。在我们使用mimikatz
时,第一条命令privilege::debug
其实开启的就是SeDebugPrivilege
特权。
1.4.2.危险的特权--SeAssignPrimaryTokenPrivilege
该特权表示可以为进程分配主令牌,经常与 SeImpersonatePrivilege
特权配合使用在potato的提权中。拥有该特权时,我们可以使用非受限的令牌调用CreateProcessAsUser()
;或者先创建挂起的进程,再通过NtSetInformationProcess()
来替换进程的 token
1.4.3.危险的特权--SeImpersonatePrivilege
当SeImpersonatePrivilege
特权分配给用户时,表示允许该用户运行的程序模拟客户端,默认Service账户(如MSSQL、IIS的服务账户)和管理员账户会拥有该权限。
该权限也是一些potato提权的重要条件,可以通过printbug+ImpersonateNamedPipeClient()
等等许多方式获取到高权限令牌,进而执行模拟
2.Login Session
2.1.简介
根据 Microsoft 文档,登录会话是一个计算会话,它在用户身份验证成功时开始,并在用户注销系统时结束。
当用户成功通过身份验证时,身份验证包会创建登录会话并将信息返回到用于为新用户创建令牌的本地安全机构 (LSA)。该令牌包括登录会话的本地唯一标识符 (LUID),称为登录 ID。
从安全事件的角度来看,当成功的身份验证事件发生时,首先会看到 logon_id。根据 Microsoft 和 OSSEM 提供的文档,审核登录子类别中的事件与登录会话的创建相关,并发生在被访问的计算机上。对于交互式登录,在登录的计算机上生成事件。对于网络登录(例如访问共享),将在承载所访问资源的计算机上生成事件。
2.2.Logon Sessions and Access Tokens
当用户以物理方式登录到 Windows 工作站时(即以交互方式),他们提供用户名和密码,然后由本地安全机构(LSA) 检查。如果该帐户是本地帐户(即,仅在该特定计算机上有效),LSA 将根据其自己的安全数据库检查凭据。在 Windows Active Directory 域环境的情况下,身份验证尝试被称为最近的域控制器 (DC),它将处理请求并对用户进行身份验证。
一旦用户成功通过身份验证,LSA 将创建一个新的登录会话并生成一个访问令牌,如上所示。一个登录会话可以有多个与之关联的访问令牌,但一个访问令牌只能链接到一个登录会话。
每个新的登录会话都可以通过 64 位本地唯一标识符 (LUID)(称为登录 ID)来识别,并且每个访问令牌都必须包含一个身份验证 ID(或 AuthId)参数,该参数通过此 LUID 识别源/链接登录会话。
3.安全描述符
3.1.简介
SID(Security Identifiers)即安全描述符。
安全描述符标识对象的所有者,并包含以下访问控制列表:
1、Discretionary Access Control List (DACL) 自由访问控制列表
2、System Access Control List (SACL) 系统访问控制列表
每一种控制列表中都存在若干条ACE(Access Control Entries)
用这个链接下的一个图可以很清晰的说明什么是安全描述符:
3.2.DACL
高级安全设置中的权限就是DACL的列表
3.3.SACL
高级安全设置中的审核就是SACL的列表
3.4.ACE
ACE是针对特定用户或特定组的单个权限授予(或拒绝权利)的配置结构。ACE有许多不同类型,但是在Active Directory的权限中,只有四种不同的含义,两种分别用于授予和拒绝权限。
3.5.直观理解
Windows访问控制模型中会用到ACL,比如文件、注册表的权限都包含ACL,用来表示哪些用户(组)具有哪些操作权限
例如用户对某个文件进行访问,系统将做以下判断:
- 如果没有DACL,系统将允许访问
- 如果存在DACL,但没有ACE,系统将拒绝所有访问
- 如果存在DACL,也存在ACE,那么会按照每个ACE指定允许或拒绝
4.总结
完整的登录过程和访问检查示例