A Windows Authorization Guide

Windows权限指南

声明:这是翻译、总结的文章,好文章不应被语言所限制,如有侵权,请联系删除。

原文链接

https://csandker.io/2018/06/14/AWindowsAuthorizationGuide.html

全文简单总结

​ windows中的权限控制和五个方面紧密相关:

  1. ACL, 访问控制列表
  2. IL, 完整性级别
  3. privilege, 特权
  4. User Access Control, UAC
  5. Access Tokens, 访问令牌

基本的访问控制都是通过SRM来完成的:首先将发出访问请求的进程的完整性级别与目标的SACL中的完整性级别(SID中的rid表示)做比较(更低则直接失败),然后比较该进程的所有者和文件的所有者是否是同一人(若是直接许可,不是则校验DACL),最后将该进程对应的访问令牌中的SID信息,与被访问对象的安全描述中的DACL做匹配,做出对应的响应。

​ 每一个安全对象(比如文件、注册表等)都有一个安全描述符,ACL是其重要组成部分。ACL又分为DACL和SACL,DACL负责控制安全对象执行的读、写、执行等操作,对用户访问不属于自己的资源进行了限制;SACL从完整性级别角度出发,对用户访问属于自己的资源做了更细粒度的限制,限制了相同用户的不安全进程对安全资源的访问。

ACL是由多个ACE组成的,每个ACE又包含三个重要属性:1. SID 2. Mask 3. AceType。 SID又由三部分组成,S开头,中间的域ID(指定一个组),末尾的RID(指定一个用户,著名的500结尾代表默认管理员),用来指定特定组、特定用户、特定规则;Mask用来描述文件的某些权限;AceType指示满足条件时,对应的是Access还是Deny操作。当对安全对象的一个动作请求到达SRM后,SRM可以从该动作发出线程中的访问令牌获取到对应的SID,用于与ACE中的SID做匹配,对mask指定的权限做出与AceType配对的操作。

完整性级别有四种:low\medium\high\system,都是由SID来表示的(其RID分别是: 0X1000/0X2000/0X3000/0X4000),拥有较低完整性级别的进程对较高安全对象的读、写、执行是受到该对象SACL中mask的限制的。

​ 说完了ACL和完整性级别,再考虑privilege。特权是分配给用户的,与安全描述符限制的访问权限无关。每一个系统都有一个账户数据库,用于存储用户和组账户所拥有的权限,当用户登录时,系统会为登录进程生成一个访问令牌,其中包含用户的权限列表,比如SeDebugPrivilege等权限,错误配置的用户特权往往会导致本地权限提升。

​ 再来说UAC,用户访问控制和完整性级别实现了更细粒度的访问控制。UAC保证管理员账户再不需要使用管理员权限时不会使用管理员权限。

  1. 当非管理员登录时,获得的是具有默认特权的中等完整性令牌;

  2. 当管理员登录时,登录线程将会获得两个访问令牌,full admin token具有高完整性和所有管理权限,filtered admin token具有中等完整性级别和较低的权限。

  3. 好处是,当管理员登录后,默认使用filtered admin token来创建子进程,子进程也只能继承该低特权、中等完整性的令牌;但是通过UAC弹窗可以切换到full admin token来创建子进程。

    1. 默认情况下,RID=500的管理员账户没有注册UAC,因此它登陆后默认就使用full admin
    2. 对于远程访问,只有目标机器的本地rid=500的管理员和域管理员能够获得高完整性访问令牌,其余都只能获取中等完整性令牌,因而无法建立远程连接。只能通过交互式的RDP来登录。
    3. 因为这个原因,PTH(pass-the-hash)只能对rid=500的本地管理员和域管理员才能成功。(在打了补丁后)

​ 最后是访问令牌,其作用是提供当前线程代表的用户表示、特权、ACL等信息,复制了令牌就相当于伪造了身份,不同模拟级别的令牌可以操作的资源不同。访问令牌分为主令牌和模拟令牌,一个进程只能拥有主令牌,一个线程可以同时拥有主令牌和模拟令牌(模拟令牌优先)。"Full Tokens\Admin Tokens\Filtered token"等都是说的模拟令牌,令牌中包括user sid/group sid/privilege/IL/模拟级别/默认的dacl等。模拟级别分为:Anonymous Level/Identification Level/Impersonate Level/Delegate Level。 任何情况下都可以复制令牌,但是条件不满足的话,只能获得identification level的令牌。

​ 其检查流程如下:先检查令牌的模拟级别是否小于Impersonate Level,再检查尝试复制令牌的进程是否由TOKEN_DUPLICATE特权,再检查该进程的完整性级别是否低于令牌的完整性级别,再检查进程的所有者和令牌的所有者是否是同一个(即使是同一个也无法获取额外权限)。

  1. 如果组件没有去验证令牌的模拟级别,那么该组件涉及到的访问控制可能被打破,因为任何人都可以复制一份管理员的identification level的令牌。
  2. 如果能够复制模拟级别的令牌,那么就能够操作相应的本地资源;如果能够复制委派级别的令牌,甚至可以操作相应的网络资源。

大纲

Windows中的认证相关:

image-20230530111154307


  1. Basic Access Check

当用户登录到他的 Windows 机器时(无论是本地用户还是加入域的用户),都会为该用户创建一个访问令牌。准确地说,这个访问令牌是为该用户的登录线程创建的。

  1. Security Reference Monitor

该组件用于接收请求的访问权限以及用户的访问令牌。

  1. Security Descriptor

  2. 小总结

  1. Each user logon thread has an access token
  2. A required action, e.g. to open a file, is expressed in an Access Right, e.g. GENERIC_READ
  3. Each Securable Object has a Security Descriptor, which defines who can do what with that object.
  4. 安全参考监视器 (SRM) 是负责评估某个进程对所请求的对象是否授予了所请求的权限。
  5. 在 SRM 中授予或拒绝访问的关键功能称为 SEAcessCheck。

下图是用户访问操作的权限鉴定流程:

https://www.youtube.com/watch?v=QRpfvmMbDMg // 流程图的出处,2015年BlackHat talk

image-20230602144530880


The Security Descriptor, DACL & SACL

安全描述符定义了一个对象结构来记录引用的对象属于谁(所有者和组)以及授予(或拒绝)哪些操作的访问权限。

  1. Owner 和 Group 字段

它们由安全标识符 (SID) 表示.SID由三部分组成:

  1. The first part - always beginning with an ‘S’ - describes the group, e.g. Domain Everyone (S-1-1-0), Anonymous (S-1-5-7), Authenticated Users (S-1-5-11), which can be looked up in the register for Well-known SIDs. (第一部分S开头表示组)

  2. The second part is a unique domain ID (also present in each default WORKGROUP) (S-1-5-21), e.g. S-1-5-21-2884053423-3431565070-78458365-….(第二部分表示域ID,S-1-5-21表示默认工作组)

  3. The last part is called the relative ID (RID), which describes a user group inside a security group, e.g. the group of builtin Administrator group (*S-1-5-*32-544) or the builtin Guests group (*S-1-5-*32-546) or the famous default Admin account - by me often referred to as RID-500 Admin - (S-1-5-21-2884053423-3431565070-78458365-500). Note how the first two groups are in the same security group (S-1-5-32-…), while the RID-500 admin is in the domain security group.

(最后一部分称为相对 ID (RID),它描述了安全组内的用户组,例如内置管理员组 (S-1-5-32-544) 或内置访客组 (S-1-5-32-546) 或著名的默认管理员帐户 - 我通常称为 RID-500 管理员- (S-1-5-21-2884053423-3431565070-78458365-500)。请注意前两个组如何位于同一安全组 (S-1-5-32-…) 中,而 RID-500 管理员位于域安全组中。)

下图中Owner的SID是:S-1-5-21-XXX-1001,Group的SID是:S-1-5-21-XXX-513.

image-20230602144916189


  1. 除了 explorer.exe 进程的所有者和组之外,上面显示的安全描述符还包含两个列表,即自由访问控制列表 (DACL) 和系统访问控制列表 (SACL)
  1. DACL 是由安全描述符的所有者控制的列表,它指定特定用户或组可以对该对象拥有的访问权限。(DACL 是用于授权过程的重要控制列表。查看上面的屏幕截图,可以看到所提供的 DACL 实际上包含三个访问控制条目 (ACE)。对于三个 ACE 中的每一个,都设置了以下重要字段:)

    • SID:SID 定义 ACE 适用的安全主体(用户或组)。

      • S-1-5-21-……-1001 对一个特定域用户的引用。
      • S-1-5-18 引用本地系统帐户。
    • Mask:The access mask is a numeric value, which resembles a combination (addition) of multiple Access Rights, e.g. GENERIC_READ. The access mask is a data structure described in the Microsoft Docs here.

    • AceType:AceType基于给定的访问掩码 定义了是允许还是拒绝SID指定的安全主体 的访问。

      ​ 在上面的示例中,给出了三个 AceType 为 ACCESS_ALLOWED_ACE_TYPE 的 ACE,这意味着如果安全参考监视器 (SCM) 在这些 ACE 中的任何一个中找到请求用户的匹配访问掩码,访问将被授予。

  2. SACL 是一个由系统管理员控制的列表,它包含两类控制条目:

    • SACL 持有 MANDATORY_INTEGRITY_LABEL(稍后详细介绍)(强制完整性标签)

    • SACL 包含用于生成审计消息的控制条目(我们暂时忽略)

  3. 小总结

    ​ SCM 将审查所请求对象的安全描述符并遍历安全描述符的 DACL 中的每个 ACE,并检查请求用户 - 由其 SID 标识和请求的访问权限(例如 GENERIC_READ)是否与 ACE 内的访问掩码匹配。如果找到匹配项,则该 ACE 的 AceType 将确定是授予还是拒绝访问。

    • 如果安全描述符的 DACL 设置为 NULL,也就是安全描述符没有 DACL,那么每个人都将获得完全访问权限。
    • 如果安全描述符的 DACL 为空,又名 DACL 存在,但不包含任何 ACE,则不会授予对该对象的访问权限。

​ 最后是请求用户的身份从何而来。 SRM 从给定的用户访问令牌中获取请求用户的身份。稍后将给出有关此令牌外观的见解,现在重要的是知道此令牌包含请求用户的 SID 以及用户组的 SID。

安全参考监视器 (SRM) 查询所请求对象的安全描述符以获取以下信息:

谁是所请求对象的所有者?

  1. 如果请求用户是所请求对象的所有者:授予访问权限
  2. 如果请求用户不是所有者,则遍历安全描述符的 DACL 中的所有 ACE 并确定:(通过用户SID和用户所在组的SID来判断当前ACE是否用于该请求用户)
  • ACE中的访问掩码是否包含请求用户想要请求的访问权限,例如访问掩码是否包含 GENERIC_READ 访问权限?
  • 访问类型是设置为允许访问还是设置为拒绝访问?
    • 如果任何 ACCESS_DENIED_ACE_TYPE 与用户和请求的访问权限匹配:拒绝访问
    • 如果没有 ACCESS_DENIED_ACE_TYPE 并且ACCESS_ALLOWED_ACE_TYPE 与用户和请求的访问权限匹配:授予访问权限

根据上面的图,现在只缺少对 SeAccessCheck的理解,即完整性级别检查 (IL-Check)。因此,让我们深入研究一下。(Owner check 和 DACL check在本段已经讲述了)


The Integrity Level check is meant to enforce another Windows control layer, called Mandatory Integrity Control (MIC). ===> 这个是定义在SACL中的。
完整性级别检查旨在强制执行另一个 Windows 控制层,称为强制完整性控制 (MIC)。

  1. 微软文档

Mandatory Integrity Control (MIC) provides a mechanism for controlling access to securable objects. This mechanism is in addition to discretionary access control and evaluates access before access checks against an object’s discretionary access control list (DACL) are evaluated.
强制完整性控制 (MIC) 提供了一种机制来控制对安全对象的访问。此机制是自主访问控制的补充,并在评估针对对象的自主访问控制列表 (DACL) 的访问检查之前评估访问。(在鉴定DACL前需要先鉴定MIC)
Source: Mandatory Integrity Control

  1. MIC 只是 Microsoft 在 Windows Vista 中与用户访问控制 (UAC) 一起添加的另一层,用于获得更细粒度的控制并防止受损进程访问敏感资源。

每个安全对象都在其 SACL 中设置了 MANDATORY_INTEGRITY_LABEL。此标签将四种可能的完整性级别 (IL) 之一分配给对象(如 Windows 完整性机制设计中所定义):

  1. Low (SECURITY_MANDATORY_LOW_RID 0x00001000)
  2. Medium (SECURITY_MANDATORY_MEDIUM_RID 0x00002000)
  3. High (SECURITY_MANDATORY_HIGH_RID 0X00003000)
  4. System (SECURITY_MANDATORY_SYSTEM_RID 0x00004000)

These Integrity Levels label the degree of ‘security protection’ that has been assigned to a Securable Object.

By default all objects are assigned with a Medium Integrity Label.(默认情况下,所有对象都分配有中等完整性标签。)

​ 作为示例,请参考之前的安全描述符屏幕截图,请注意该对象(explorer.exe 进程)的安全描述符获得以下 MANDATORY_INTEGRITY_LABEL:SID:S-1-16-8192.

​ A quick look up to the Well-known SIDs Register reveals that this SID describes the ‘Medium Mandatory Level’ (default for all objects).

  1. 为什么要MIC?

完整性标签的整个故事是为了防止较低级别的完整性进程访问较高级别的完整性对象。*

下图是一个示例:

image-20230602161622433

  1. 启动 Internet Explorer 时,将生成一个低完整性级别的 IE 进程(见下面的屏幕截图)。这个低级别的 IE 进程是用户用来上网的进程。

  2. 如果此过程受到损害,例如通过利用 IE/Flash/等。漏洞,该进程将无法访问用户的文档,因为这些文档是使用默认的中等完整性级别标签创建的(并且 IE 进程以低完整性运行)。

  3. 这是完整性级别检查意义所在。想象一下没有 MIC 的受损 IE 场景。IE 进程已由登录用户启动,因此归登录用户所有。因此,DACL 检查将授予受感染的 IE 进程访问用户资源的权限。

既然如此,当具有较低完整性级别的进程试图访问具有较高完整性级别的资源时,访问通常会被拒绝吗?


在完整性级别检查期间,SRM 将请求进程的完整性级别与请求对象的完整性级别进行比较,并根据为该对象定义的完整性级别策略决定进行 DACL 检查或拒绝访问。

对象的完整性级别策略基于以下三个定义的状态(如 SYSTEM_MANDATORY_LABEL_ACE 结构中所定义):

  1. SYSTEM_MANDATORY_LABEL_NO_WRITE_UP ( 0x1 )
  2. SYSTEM_MANDATORY_LABEL_NO_READ_UP ( 0x2 )
  3. SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP ( 0x4 )

再次参考上一节中给出的正在运行的 explorer.exe 的安全描述符。请注意,SACL ACE SYSTEM_MANDATORY_LABEL_ACE_TYPE 的访问掩码设置为 0x00000003,这意味着此完整性策略拒绝来自完整性级别低于 Medium(该对象的完整性级别,此例中MANDATORY_INTEGRITY_LABEL:SID:S-1-16-8192)的进程的 READ 和 WRITE 访问尝试。



Privileges <==> 特权与访问权限的区别

The best way to introduce Privileges is with the official MSDN explanation:

A privilege is the right of an account, such as a user or group account, to perform various system-related operations on the local computer, such as shutting down the system, loading device drivers, or changing the system time. Privileges differ from access rights in two ways:
特权是一个帐户(例如用户或组帐户)在本地计算机上执行各种与系统相关的操作的权利,例如关闭系统、加载设备驱动程序或更改系统时间。特权在两个方面不同于访问权限:

  • Privileges control access to system resources and system-related tasks, whereas access rights control access to securable objects.
    特权控制对系统资源和系统相关任务的访问,而访问权限控制对安全对象的访问。
  • A system administrator assigns privileges to user and group accounts, whereas the system grants or denies access to a securable object based on the access rights granted in the ACEs in the object’s DACL.
    系统管理员将权限分配给用户和组帐户,而系统根据对象的 DACL 中的 ACE 授予的访问权限来授予或拒绝对安全对象的访问权限。

Each system has an account database that stores the privileges held by user and group accounts. When a user logs on, the system produces an access token that contains a list of the user’s privileges, including those granted to the user or to groups to which the user belongs. Note that the privileges apply only to the local computer; A domain account can have different privileges on different computers.
每个系统都有一个帐户数据库,用于存储用户和组帐户所拥有的权限。当用户登录时,系统会生成一个访问令牌,其中包含用户权限列表,包括授予用户或用户所属组的权限。请注意,权限仅适用于本地计算机;域帐户可以在不同的计算机上具有不同的权限。
Source: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379306(v=vs.85).aspx

查看管理员未UAC前用户权限:

image-20230602171247045

查看管理员UAC后用户权限:

image-20230602171427509



UAC

​ 用户访问控制 (UAC) 的唯一目的是对管理执行进行更细粒度的控制,并保证管理用户在不需要使用管理员权限时不使用其管理员权限。

  1. 通过登录到您的 Windows 计算机,您的登录线程会被分配一个用户访问令牌,并且该用户启动的所有子进程都将继承此令牌。对于非管理员用户,这是具有默认权限的中等完整性令牌。
  1. 在 Windows Vista 之前,管理员用户获得具有所有管理权限的高完整性令牌,并且启动的每个子进程都将继承此令牌。这意味着由管理员用户生成的所有进程都将以高权限运行,即使该进程不需要这些高权限(例如,由管理员启动的 explorer.exe 将以高完整性令牌和完全管理员权限运行,而不需要这些权限). UAC 的引入就是为了解决这个问题。

注意:以下所有解释均假设启用了 UAC,并且我们正在谈论的管理用户不是本地 RID-500er 管理员(我们稍后会讨论这种特殊情况)

​ 由于 UAC 是在 Windows Vista 中引入的,当管理员登录时会创建两个访问令牌:

  1. A Full Admin Token, also often referred to as ‘Non-filtered Token’ or ‘Full Token’, with high Integrity Level (IL) and all administrative privileges.

    (完整的管理令牌,通常也称为“非过滤令牌”或“完整令牌”,具有高完整性级别 (IL) 和所有管理权限)

  2. A filtered admin token, also often referred to as ‘Standard Token’ or ‘Restriced Token’, with medium integrity level (IL) and reduced privileges

    (过滤后的管理令牌,通常也称为“标准令牌”或“受限令牌”,具有中等完整性级别 (IL) 和较低的权限)

​ 这两个令牌在内核中链接在一起,以便执行线程可以在需要时访问这两个令牌。

​ 现在,如果管理员用户登录到他的帐户并启动 cmd.exe,将使用过滤后的中等完整性令牌生成此进程(记住:UAC 已启用且用户不是 RID-500 管理员)。因此,不会将高访问权限授予不需要这些权限的进程。

​ 但是,如果管理员用户需要以完全管理员权限运行进程,他可以要求操作系统使用他的完全管理员令牌提升此进程的权限,这是“以管理员身份运行”按钮。这将导致突出的“同意”提示弹出(C:\Windows\System32\consent.exe),如下面的屏幕截图所示:

image-20230602172142964

通过接受此同意提示,系统将创建具有完全管理员权限的提升进程(在本例中为 cmd.exe),如下面的屏幕截图所示:

image-20230602172214583

左侧显示的是管理员在未提升的情况下启动的 cmd.exe 进程(注意 conhost.exe 是 cmd.exe 创建的子进程),右侧显示的是通过点击“以管理员身份运行”提升的 cmd.exe 。


UAC for the RID-500er local Admin

以上所有解释仅适用于非 RID-500er 本地管理员的本地或域管理员(上一段)。 Windows 的每个安装都带有一个本地管理员帐户(默认情况下禁用),可以通过相对标识符 (RID) 500 (SID: S-1-5-21-DomainID-500) 进行识别。

  1. RID-500 本地管理员的故事是默认情况下此帐户未注册 UAC。

这意味着如果您使用 RID-500er 本地管理员帐户登录您的 Windows 计算机,您将立即获得一个高特权的完全访问令牌(并且不会获得“过滤的”中等完整性令牌)。如果您使用 RID-500 本地管理员运行 cmd.exe(或其他任何东西),即使没有指定“以管理员身份运行”,那么 cmd.exe 将产生完全管理权限和高完整性级别(因为您只有一个cmd.exe 进程可以继承的完整标记)。如果您使用 RID-500er 本地管理员点击“以管理员身份运行”,则不会出现同意提示。

  1. 默认情况下,RID-500er 管理员未在 UAC 中注册,但可以通过将以下注册表项设置为“1”来注册
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\FilterAdministratorToken

FilterAdminstratorToken 设置为“1”时,这会在 UAC 中注册 RID-500er 管理员(因此前面提到的所有规则也将适用于该用户)。(上一段)


Disabling UAC For Non-RID-500er Admins

默认情况下,RID-500er 管理员未注册到 UAC,但所有其他管理员(即管理组中的本地或域用户)都注册到 UAC。RID-500er 管理员用户可以在 UAC 中注册,非 RID-500er 管理员也可以从 UAC 中取消注册

  1. 非 RID-500er 管理员从 UAC 中取消注册,方法是将 LocalAccountTokenFilterPolicy 设置为“1”。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy
  1. 默认情况下未设置此注册表项,因此如果缺少此注册表项,所有非 RID-500er 帐户都会在 UAC 中注册

UAC and Remote Access

以上所有内容都适用于本地访问,这意味着您的用户在本地登录到计算机并执行进程。现在对于远程访问,故事还有另一个补充。

对于远程访问(例如通过 wmic),域管理员将获得完整的高完整性访问令牌,但本地非 RID-500er 管理员将仅获得中等完整性限制令牌。(请注意,远程访问需要启动高权限进程,并认为没有办法远程提升权限。

  1. Remote Access for Local Admins (Non-RID-500er):

Source: https://support.microsoft.com/en-us/help/951016/description-of-user-account-control-and-remote-restrictions-in-windows

​ When a user who is a member of the local administrators group on the target remote computer establishes a remote administrative connection … they will not connect as a full administrator. The user has no elevation potential on the remote computer, and the user cannot perform administrative tasks. If the user wants to administer the workstation with a Security Account Manager (SAM) account, the user must interactively log on to the computer that is to be administered with Remote Assistance or Remote Desktop.
当目标远程计算机上本地管理员组成员的用户建立远程管理连接时,他们不会以完全管理员身份连接。用户在远程计算机上没有提升潜力,并且用户无法执行管理任务。如果用户想要使用安全帐户管理器 (SAM) 帐户管理工作站,则用户必须以交互方式登录到要使用远程协助或远程桌面进行管理的计算机。

  1. Remote Access for Domain Admins:

Source: https://support.microsoft.com/en-us/help/951016/description-of-user-account-control-and-remote-restrictions-in-windows

When a user with a domain user account logs on to a Windows Vista computer remotely, and the user is a member of the Administrators group, the domain user will run with a full administrator access token on the remote computer and UAC is disabled for the user on the remote computer for that session.
当具有域用户帐户的用户远程登录到 Windows Vista 计算机,并且该用户是 Administrators 组的成员时,该域用户将使用远程计算机上的完全管理员访问令牌运行,并且 在那台远程电脑的此次会话中UAC 对该用户是禁用的(没有UAC的限制)。

  1. UAC 的上述限制适用于远程管理访问,但这不会影响远程桌面连接(被视为本地登录)。


UAC And Pass-the-Hash

以下帐户尝试通过 pth 攻击(pass-the-hash)(使用 psexec 或 wmic)与具有默认设置的计算机建立远程连接。谁能够建立成功的远程连接,为什么?

  1. The Local ‘Administrator’ - SID: S-1-5-21DomainID-500
  2. The Local user ‘LocalAdm’ who is member of the local Administrators Group (SID: S-1-5-32-544)
  3. The domain user ‘Lab\Frank’ who is a standard domain user without administrative privileges
  4. The domain user ‘Lab\Bob’ who is a member of the domain Administrators group

请注意,远程访问需要启动高权限进程,并认为没有办法远程提升权限。

答案:

1,4

原因:

  1. 默认情况下,本地 500er 管理员未注册 UAC。 500er 管理员默认会收到一个完整的访问令牌,并且可以建立远程连接。
  2. 非 500er 本地管理员在 UAC 中注册,没有获取到完全访问令牌。
    (非 500er 管理员尝试登录并获取标准/中等访问令牌。远程连接访问需要启动完整的令牌管理访问过程,而用户没有(他/她获得了中等令牌)。因此他的连接被拒绝。)
  3. 与非 500 人本地管理员的情况相同。他/她获得标准(中等)令牌并被拒绝。
  4. 域管理员已在 UAC 中注册但会自动提升权限。与本地访问相比,这是适用于远程访问的例外情况。
    (域管理员尝试登录,自动接收完整/管理员访问令牌(而不是标准/中等访问令牌)并能够获得远程 shell。)

UAC 的上述限制适用于远程管理访问,但这不会影响远程桌面连接(被视为本地登录)。

“用户帐户控制 (UAC) 影响对 WinRM 服务的访问”



Access Tokens

​ 到目前为止,在谈论基本访问检查或 UAC 时,引入了用户“访问令牌”。此访问令牌包含有关当前用户和用户组的信息,例如,安全参考监视器 (SRM) 使用它来确定谁在请求访问。

这些令牌与访问检查密切相关,并且还对某些特权升级攻击起作用。因此,值得仔细研究访问令牌。

令牌只有两种:

  1. Primary Tokens, which are assigned to processes
  2. Impersonation Tokens that are assigned to threads

‘Filtered tokens’, ‘Restricted Tokens’, ‘Full Tokens’, ‘Admin Tokens’, or in general ‘Access Tokens’, are just names given to describe the token, but all of these are Impersonation Tokens.

“过滤令牌”、“受限令牌”、“完整令牌”、“管理令牌”或一般的“访问令牌”只是用来描述令牌的名称,但所有这些都是模拟令牌。

Both, primary and impersonation tokens, consist of the following major fields:(两者令牌的共有字段)

  • User SID: the SID of the user (impersonation token) or the SID of the user that created the process (Primary token)
    User SID:用户的SID(模拟令牌)或创建进程的用户的SID(Primary token)
  • Group SIDs: Group SIDs of the corresponding user (User SID)
    Group SIDs:对应用户的组SID(User SID)
  • Logon SID: Identifies the current logon session
    登录 SID:标识当前登录会话
  • Privileges: List of Privileges the User (impersonation token or process has)
    特权:用户的特权列表(模拟令牌或进程具有)
  • Primary Group SID: identifies the primary group of the impersonated user (impersonation token), e.g. ‘Domain Users’
    主要组 SID:标识模拟用户的主要组(模拟令牌),例如“域用户”
  • Default DACL: The default DACL that the system uses when a user creates a securable object without specifying a security descriptor (comparable to Linux umask)
    Default DACL:当用户在没有指定安全描述符的情况下创建安全对象时系统使用的默认DACL(相当于Linux umask)
  • Type: Information if token is primary or impersonation
    类型:令牌是主要令牌还是模拟令牌
  • Impersonation Level: The degree (level) of allowed impersonation.
    模拟级别:允许模拟的程度(级别)。
  • Integrity Level: SID of integrity level
    Integrity Level:完整性级别的SID

它是传递给 SRM 以确定进程是否可以访问对象的令牌,因此如果您能够获得高特权令牌,则可以提升您的特权。

有个工具可以查看令牌的相关信息:

To get a hands on experience with tokens, James Forshaw develop the great tool Token Viewer (contained in the Sandbox-AttackSurface-Analysis-Tools), which is shown below:

image-20230602175843324

在右侧窗口中显示了进程列表。高完整性 cmd.exe 进程之一的令牌已打开并显示在左侧窗口中。请注意,令牌类型是主要的(因为它是一个进程)并且完整性级别 (IL) 设置为高(因为 cmd.exe 进程是由管理员作为提升的进程启动的)。


每个进程都有一个分配给它的令牌,并且此令牌始终是主要令牌。

现在让我们转到线程。记住,一旦用户登录,用户就会被分配一个令牌,更准确地说,这意味着用户的登录线程被分配了一个模拟令牌。一个进程只能有一个主令牌,但是一个线程可以有一个模拟令牌和一个主令牌,在这种情况下,模拟令牌将始终优先于主令牌。

image-20230602180038578

请注意,令牌类型现在显示为“模拟”,并且现在“模拟级别”字段也设置为“模拟”。模拟级别是一个重要字段,它会影响令牌是否可以被模拟(下一节将详细介绍)。

The key take away here is that there are only two types of tokens for processes and threads.



Impersonation

​ 模拟过程非常重要,在 Windows 授权过程中经常使用。要理解为什么使用模拟,我们首先必须退后一步:

想象一下,用户想要删除远程文件共享上的文件。现在托管文件的服务器需要确定用户是否被允许这样做。服务器无法访问用户的访问令牌,因为该令牌在远程服务器的内存中不可访问(令牌存储在请求删除文件的用户的计算机上)。服务器可以做的是从 Active Directory (AD) 中查询用户的帐户和组信息,并手动检查是否允许用户删除文件,但这项工作繁琐且容易出错。因此,另一种方法被实施并称为“模拟”。

​ 基本思想是服务器简单地伪装成发出请求的用户并执行请求的操作,就好像服务器就是用户一样。所以服务器所做的是复制用户的模拟令牌并使用该复制令牌请求操作(例如删除文件)(就好像服务器是用户一样)。

​ OK Million dollar idea: I just impersonate the token of a high privileged user and gain instant privilege escalation! … Nice thought, but obviously it cannot be that easy. There are two obstacles in the way:(模拟高特权令牌,用户就可以随意提权了,但是有两个难点):

  • Not every impersonation token can be used to carry out actions 并非每个模拟令牌都可用于执行操作

  • You need special privileges to be able to ‘impersonate’ a token (which technically means duplicate a token) 您需要特殊权限才能“模拟”令牌(从技术上讲,这意味着复制令牌)

第一个难点:

每个模拟令牌都有一个名为模拟级别的属性,该属性可以具有以下值之一:

  • Anonymous Level - the server can impersonate the client, but the token does not contain any information about the client. Anonymous level is only supported for inter process communication (e.g. for named pipes). All other transports silently promote this to ‘Identification Level’
    • 匿名级别 - 服务器可以模拟客户端,但令牌不包含有关客户端的任何信息。匿名级别仅支持进程间通信(例如命名管道)。所有其他运输工具默默地将其提升到“识别级别”
  • Identification Level - This is the default. The server can obtain the identity of the client in order to do ACL checks. You can use that token to read information about the impersonated user or check the resources ACL, but you can’t actually access that resource (read/write/execute)
    • 识别级别 - 这是默认值。服务器可以获得客户端的身份,以便进行 ACL 检查。您可以使用该令牌读取有关模拟用户的信息或检查资源 ACL,但您无法实际访问该资源(读/写/执行)
  • Impersonate Level - The server can impersonate the security context of the client in order to access local resources. If the server is local, it can access local and network resources. If the server is remote it can only access resources on the same machine as the server.
    • 模拟级别-服务器可以模拟客户端的安全上下文以访问本地资源。如果服务器是本地的,它可以访问本地和网络资源。如果服务器是远程的,它只能访问与服务器在同一台机器上的资源。
  • Delegate Level - The most powerful impersonation level. The server can impersonate the security context of the client to access local or remote resources.
    • 委派级别 - 最强大的模拟级别。服务器可以模拟客户端的安全上下文来访问本地或远程资源

第二个难点:

需要特殊权限才能复制(模拟)另一个令牌。该特殊权限是 TOKEN_DUPLICATE(如访问令牌对象的访问权限中所指定)。如果您不拥有此特权,您复制令牌的请求不会被拒绝,您仍然会得到一个复制的令牌,但模拟级别较低(Identification Level)

复制/冒充另一个令牌的流程如下所示:

image-20230602181348873

因此,在一天结束时,您要么持有 TOKEN_DUPLICATE 特权(或破坏持有此特权的进程),要么最终得到一个身份级别令牌,这对攻击者来说毫无用处,因为您无法执行任何操作。(也不一定,下面有一种使用Identification Tokens的方法,需要特殊条件配合)


Privilege Escalation With Identification Tokens

上一节描述了获取身份令牌非常容易。

To once more underline the fact that this is true, I activated the local administrator account on my windows machine and used Forshaw’s Token Viewer tool, to impersonate the Administrators Impersonation token (for more details check out His 2015 BlackHat Talk):
(为了再次强调这是真的,我在我的 Windows 机器上激活了本地管理员帐户,并使用 Forshaw 的 Token Viewer 工具来模拟 Administrators Impersonation 令牌(有关更多详细信息,请查看他的 2015 BlackHat Talk))

image-20230602182044435

​ 我使用标准的非管理员用户运行此工具,但仍然可以访问管理员令牌。感觉很奇怪,但是根据上一节中介绍的重复令牌的访问检查,这一切都是应该的。

​ 我不能用那个令牌做很多事情,尤其是不能执行管理任务或访问受保护的资源。当然,除非某些程序员忘记检查为授权检查提供的令牌的模拟级别。 James Forshaw 发现某些 Windows 组件会发生这种情况,从而导致 CVE-2015-0002,如本 PoC 中所示。

​ 我强烈建议查看 James 2015 BlackHat Talk 以了解此漏洞的全部影响和应用,但基本情况是:某个 Windows 组件进行了访问检查以验证所提供的模拟令牌是否属于管理员,但是组件只检查模拟类型和相关组,完全忽略模拟级别,这导致任何可以向管理组提供高完整性**标识令牌(Identification Level Token)**的用户都可以访问……惊人的发现!


Privilege Escalation By Leaky Tokens <==> 泄漏令牌的特权升级

Forshaw 发现的另一个特权升级漏洞是他所谓的“Leaky Tokens”。这种漏洞的基本思路如下:

  1. 内核代码可以访问任何类型的令牌并读取和操作它。如果您发现一个 Windows 内核组件只是将其已访问的令牌返回给用户怎么办?!
  2. Forshaw 发现存在一个未记录的 win32k 系统调用,该调用将以前使用的令牌直接返回给用户。

​ This flaw exited in the kernel code for the Windows clipboard (used for copy+paste). So once an administrator copied something (e.g. say text from an editor), any user could call the undocumented function NtUserGetClipboardToken and get back the previously used admin access token.

​ (Windows 剪贴板(用于复制+粘贴)的内核代码中存在此缺陷。因此,一旦管理员复制了某些内容(例如,从编辑器中复制文本),任何用户都可以调用未记录的函数 NtUserGetClipboardToken取回之前使用的管理员访问令牌。)

This was raised by Forshaw in CVE-2015-0087.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值