【windows 访问控制】一、访问令牌

 

访问令牌(Access tokens)

访问令牌是描述进程或线程的安全上下文的对象。令牌中的信息包括与进程或线程关联的用户帐户的标识和特权信息。当用户登录时,系统通过将用户密码与安全数据库(如域认证中的NTDS或本地认证中的SAM文件)中存储的信息进行比较来验证用户密码。如果密码经过验证,则系统将生成访问令牌。代表该用户执行的每个进程都有此访问令牌的副本。(通常我们在输入密码登陆进入Windows界面时就是一个生成访问令牌的过程)当线程与安全对象进行交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户。访问令牌包含以下信息:

 Access Token的组成

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

 

Windows Access Token分两种:       

访问令牌(Access Token)是Windows操作系统用描述进程或者线程安全上下文的一个对象。
Windows下有两种类型的Token令牌:授权令牌和模拟令牌。

  • 授权令牌(Delegation Token)

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

  • 模拟令牌(Impersonation Token)

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

主令牌与进程相关;模拟令牌与模拟令牌的线程相关。

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

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

Windows Access Token的产生过程

  1. 使用凭据(用户密码)进行认证
  2. 当前登录会话(Session)的创建
  3. Windows此时会返回用户sid和用户组sid
  4. LSA(Local Security Authority)创建一个Token
  5. 依据该token创建进程、线程(如果CreaetProcess时自己指定了 Token, LSA会用该Token, 否则就继承父进程Token进行运行)

 

特权 (Privilege)

 

系统有一个帐户数据库,存储了用户或用户群的特权。当用户登录后,系统产生一个访问令牌(access token)包含了用户的特权清单,这包含用户所在群的特权。注意特权仅限于本地计算机,域帐户在不同计算机上有不同特权。

当用户试图执行一个特权操作,系统检查用户的访问令牌以确定使用是否具有必要的特权。调用GetTokenInformation函数可以检查特权。

另外,还有令牌中的权限列表,权限与对象访问无关,所以与安全描述符,SID等无关。当线程执行一些管理相关的操作时,系统会检查该线程的令牌中是否含有特定的权限,如果有,则允许线程执行该操作,否则拒绝。

命令行获取访问令牌的信息

获取 当前登录的用户的访问令牌信息:whoami /all

    WHOAMI /UPN   //用户主体 (User Principal) 格式显示用户名 名称 (UPN)格式。
    WHOAMI /FQDN    // 用完全合格的 (Fully Qualified) 格式显示用户名 可分辨名称(FQDN) 格式。        
    WHOAMI /LOGONID  //  显示当前用户的登录 ID。
    WHOAMI /USER    //  显示当前用户的信息以及安全标识符 (SID)。
    WHOAMI /USER /FO LIST
    WHOAMI /USER /FO CSV
    WHOAMI /GROUPS   //显示当前用户的组成员信息、帐户类型和安全  标识符 (SID) 和属性。
    WHOAMI /GROUPS /FO CSV /NH   //NH指定在输出中不显示列标题。只对 TABLE 和 CSV 格式有效。
    WHOAMI /PRIV    // 显示当前用户的安全特权。
    WHOAMI /PRIV /FO TABLE    //指定要显示的输出格式。有效值为 TABLE、LIST、     CSV。CSV 格式不显示列标题。默认格式是 TABLE。
    WHOAMI /USER /GROUPS
    WHOAMI /USER /GROUPS /PRIV
    WHOAMI /ALL   //显示当前用户名、属于的组以及安全标识符(SID) 和当前用户访问令牌的特权。
    WHOAMI /ALL /FO LIST
    WHOAMI /ALL /FO CSV /NH
    WHOAMI /?    //显示此帮助消息。

 

编写一个模拟令牌demo

https://www.anquanke.com/post/id/204721

 

posted @ 2021-12-01 18:09  小林野夫  阅读(2752)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/