-
-
[翻译]Windows 授权指南
-
发表于: 2022-5-11 13:20 7155
-
目录:
基本访问检查
安全描述符、DACL 和 SACL
完整性级别检查/强制完整性控制 (MIC)
特权
UAC RID-500er 本地管理员的 UAC
为非 RID-500er 管理员禁用 UAC
UAC 和远程访问
UAC 和传递哈希
访问令牌
模拟
使用标识令牌提升权限
通过泄漏令牌提升权限
开始
与 Linux 相比,Window 的授权过程相当复杂,涉及的参与者和对象也不少。
因此,为了理解该主题,首先得了解许多术语和首字母缩略词。
要了解本指南所涵盖的内容,请看此术语和首字母缩略词概述图:
面对这写满缩写的图,我想说进入这个复杂环境的最好方法是直接深入并交叉引用所有新术语。
对于以下所有内容(一般而言),有一个 Windows 安全术语表 Windows Security Glossary
(https://msdn.microsoft.com/en-us/library/windows/desktop/ms721532(v=vs.85).aspx)
可以使用它来查找以下使用的任何缩写词或术语。
SD:Security Descriptors 安全描述符:
LSA:Local Security Authority 计算机上本地安全机构
SID:Security Identifier 安全标识符。
ACL :Access Control List 访问控制列表(DACL+SACL)
DACL:Discretionary Access Control List
SACL:System Access Control List
ACE:Access Control Entry 访问控制项
AES:Access Control Entries 访问控制项
SDDL:Security Descriptor Definition Language 安全描述符定义语言
SAM:Security Account Manager安全账户管理
identifier authority:标志符的颁发机构
security principal:安全主体
Basic Access Check
基本访问检查
从最简单的一个场景开始:
登录到 Windows 系统并想要打开一个文件。
谁决定您是否获得访问权限以及如何做出此决定?
作为参考,回顾一下这个决定是如何在 Unix 系统上做出的。
在 Unix 系统上,您的用户有一个用户 ID 和组 ID,并且访问目标(本场景中的文件)有一个相关的访问权限列表,如下所示:
-rwxr-xr-- 1 root root 2048 Jun 13 10:00 file.txt
Unix 操作系统检查这些文件权限,认为每个人都获得了读取访问权限,并授予登录的 Unix 用户读取访问权限。
大多数 Unix 授权决策都可以分为这个非常简单的访问检查。
现在让我们深入了解 Windows 世界:
让我们从简单的开始:
当用户登录到他的 Windows 机器时(无论是本地用户还是加入域的用户),都会为该用户创建一个访问令牌。
确切地说,这意味着该访问令牌是为该用户的登录线程创建的。
当该登录用户尝试打开文件时,会生成一个访问请求,该请求指定用户想要对该文件执行的操作(访问权限)。
在我们的例子中,用户只是想读取一个映射到 GENERIC_READ 访问权限的文件。
有一组不同的访问权限,归根结底,它们都只是代表数字的位掩码,用作全局参考,以明确定义用户请求做什么。
最重要的访问权限是通用访问权限和所谓的标准访问权限。
用户的访问请求由称为 安全引用监视器 (SRM) 的 Windows 组件处理,该组件获取请求的访问权限以及用户的访问令牌,并将这些信息位与所请求文件的定义访问权限进行比较,这由称为 安全描述符 (Security Descriptor)的结构组成。
这里需要注意的重要一点:每个安全对象,包括文件、目录、注册表项和许多其他内容,都有一个安全描述符。
好,让我们把这些知识总结一下:
每个用户登录线程都有一个 访问令牌 (每个用户都被分配了一个访问令牌)
必需的操作,例如打开文件,以访问权限表示,例如GENERIC_READ 每个安全对象都有一个安全描述符,它定义了谁可以对该对象执行什么操作。
安全引用监视器 (SRM) 是负责评估某个进程是否应被授予访问所请求对象的访问权限的软件组件。
在 SRM 中授予或拒绝访问的关键函数称为 SEAcessCheck。
因为我很喜欢用直观的图像表现事物,所以用下面的图片来概括一下刚刚介绍的内容:
(我基于 James Forshaw 在 2015 BlackHat Talk(https://www.youtube.com/watch?v=QRpfvmMbDMg) 中使用的一个表示)
现在已经介绍了 Windows 世界中访问检查的基本概念,让我们更深入地研究各个组件。
The Security Descriptor, DACL & SACL
安全描述符、自定义访问控制列表** DACL ( discretionary access control list )和 系统访问控制列表 SACL ( system access control list** )
本节将介绍上图所示的 Owner- Check和 DACL-Check。
如前所述,每个安全对象 Securable Object.aspx)都有一个 安全描述符 。
安全描述符 定义了一个对象结构来记录所引用的对象属于谁(所有者和组)以及哪些操作被授予(或拒绝)访问权限。
描述一个安全对象的安全信息,如什么样的用户的什么访问请求可以被允许,什么样的用户或者组的什么访问要被拒绝。
安全描述符 具体由ACL、 对象拥有者SID 、此拥有者所在主群的SID、安全描述符中意思相符的控制位集合一起组成。
控制访问列表 ACL 由 自定义访问控制列表 (DACL) 和系统访问控制列表 (SACL)组成。
为了了解它看起来是什么样子,以下截图显示了正在运行的 explorer.exe 进程的安全描述符(作为内核对象):
这里最基本的部分是所有者和组字段,它们由安全标识符(Secure Identifier)(SID)表示。
在 Windows 世界中,SID 只是标识安全主体security principal的唯一字符串,
例如用户帐户、计算机帐户或在用户或计算机帐户的安全上下文中运行的线程或进程。
SID 由三个块组成:
第一部分 总是以"S"开头来描述,例如域所有人 (S-1-1-0)、匿名 (S-1-5-7)、经过身份验证的用户 (S-1-5-11),可以在注册表中查找已知 SID。
第二部分 是 唯一的域 ID (也存在于每个默认 WORKGROUP 中)(S-1-5-21),例如S-1-5-21-2884053423-3431565070-78458365-...
最后一部分 称为 相对 ID (relative ID) ( RID ),它描述了 安全组内的用户组 ,
例如内置管理员组 (S-1-5-32-544) 或内置访客组 (S-1-5-32-546)
或我通常称为 RID- 500 Admin 的著名 默认管理员帐户 的组 (S-1-5-21-2884053423-3431565070-78458365-500)。
请注意前两个组如何位于同一个安全组 (S-1-5-32-...) 中,而 RID-500 (管理员)位于 域安全组 中。
现在回到上面的示例(上图):
所有者设置为 S-1-5-21-.....-1001 的 SID,这是我 当前用户 的唯一值,
组设置为S-1-5-21-…-513 的 SID,即域用户组。
某些 SID 的值在所有系统中都是恒定的 。 在安装操作系统或域时创建它们。
它们称为 已知 SID ,因为它们标识通用用户或通用组。
您可以在注册表中查找这些 SID 以获取 已知** SID**( Well-known SIDs)
补充注释
/**
安全标识符体系结构
下图演示SID 的结构
kd\> dt nt!_SID
+0x000 Revision : UChar
+0x001 SubAuthorityCount : UChar
+0x002 IdentifierAuthority : _SID_IDENTIFIER_AUTHORITY
+0x008 SubAuthority : [1] Uint4B
当使用标准表示法将 SID 从二进制转换为字符串格式时,SID 的组件更易于可视化:
S-R-X-Y1-Y2-Yn-1-Yn
在此表示法中,SID 的组件表示如下表所示。
SID 的最重要的信息包含在一系列子身份验证值中。
(-Y1-Y2-Yn-1) 是域标识符。
SID 的此元素在具有多个域的企业中变得十分重要,因为域标识符将一个域颁发的SID 与企业中所有其他域颁发的SID 区相区分。
企业中没有任何两个域共享同一域标识符。
子身份验证值系列中的最后一(-Yn) 是相对标识符。
它将一个帐户或组与域中的所有其他帐户和组区分。
任何域中没有两个帐户或组共享同一相对标识符。
例如,内置SID 的SID 管理员组以标准SID 表示法表示为以下字符串:
S-1-5-32-544
此SID 有四个组件:
内置帐户和组的SID 始终具有相同的域标识符值:32。
此值标识域Builtin, 该域存在于运行Windows Server 操作系统版本的每台计算机中。
永远不需要区分一台计算机的内置帐户和组与另一台计算机的内置帐户和组,因为它们是作用域中的本地帐户和组。
它们是单台计算机的本地计算机,或者对于网络域的域控制器,它们对于充当一台计算机的几个计算机是本地的。
内置帐户和组需要在 内置 域范围内彼此区分。
因此,每个帐户和组的SID 都有唯一的相对标识符。
相对标识符值544 是内置属性管理员组。
Builtin 域中的其他帐户或**** 组没有最终值为544 的SID。
在另一个示例中,考虑全局组Domain Admins 的SID。
企业中的每个域都有一个Domain Admins 组,并且每个组的SID 不同。
以下示例表示Contoso,Ltd. 域中Domain Admins 组的SID (Contoso\Domain Admins) :
S-1-5-21-1004336348-1177238915-682003330-512
Contoso\Domain Admins 的SID 具有:
Contoso\Domain Admins 的SID 通过域标识符(21-1004336348-1177238915-6820033330)
与同一企业中其他Domain Admins 组的SID 进行区分。
企业中没有任何其他域将此值用作其域标识符。
Contoso\Domain Admins 的SID 通过相对标识符512 与在Contoso 域中创建的其他帐户和组的SID 不同。
域中的其他帐户或组没有最终值为512 的SID。
**/ 补充注释结束
安全描述符标识对象的所有者,除了 explorer.exe 进程的所有者和组之外,上面显示的安全描述符还包含两个列表:
自定义访问控制列表 ( DACL ) 和系统访问控制列表 ( SACL ):
DACL 是由安全描述符所有者控制的列表,用于标识允许或拒绝访问对象的用户和组
SACL 是一个由系统管理员控制的列表,它包含两种类型的控制条目:
强制完整性标签 MANDATORY_INTEGRITY_LABEL (稍后会详细介绍)
用于生成审计消息的控制条目(我们现在忽略)
对于 SACL,请记住 强制完整性标签 MANDATORY_INTEGRITY_LABEL 存储在此处(我们暂时忽略其余部分……)。
DACL则是用于授权过程的重要控制列表。
查看上面的屏幕截图,可以看到呈现的 DACL 实际上包含三个 访问控制项 Access Control Entry ( ACE )。
每个 ACE 指定一组访问权限,并包含一个 SID,用于标识允许、拒绝或审核其权限的受信者。
受信者可以是用户帐户、组帐户或 登录会话
We'll define the structure of the predefined ACE types.
Pictorallythe structure of the predefined ACE's is as follows:
Mask is the access mask associated with the ACE.
This is either theaccess allowed, access denied, audit, or alarm mask.
Sid is the Sid associated with the ACE.
对于三个 ACE 中的每一个,都设置了以下重要字段:
SID :
SID 定义了 ACE 应用到的安全主体(用户或组)。
S-1-5-21-…..-1001 引用了一个特定的域用户。
S-1-5-18 引用本地系统帐户。
该用户的访问权限的掩码(** Read , write , execute **) :
访问掩码是一个数值,类似于多个访问权限的组合(加法),例如GENERIC_READ。
访问掩码是此处 Microsoft Docs 中描述的数据结构。
ACE** 的类型**:
AceType 根据给定的访问掩码定义是否应该允许或拒绝给定安全主体 (SID) 的访问。
总共有三种:Access-denied ACE,Access-allowed ACE,System-audit ACE。
前两种是DACL类型,最后一种是SACL类型。
#define ACCESS_ALLOWED_ACE_TYPE (0x0)
#define ACCESS_DENIED_ACE_TYPE (0x1)
在上面的示例中,给出了三个具有ACCESS_ALLOWED_ACE_TYPE 的 ACE,
这意味着如果安全引用监视器 (SCM) 在任何这些 ACE 中为请求用户找到匹配的访问掩码,则将授予访问权限。
这一部分内容,重要的是:
SCM 将审查所请求对象的安全描述符并遍历安全描述符的 DACL 中的每个 ACE,
并检查请求用户(由其 SID 和请求的访问权限(例如 GENERIC_READ)标识)是否与 ACE 内的访问掩码匹配。
如果找到匹配项,则该 ACE 的 AceType 将确定是授予还是拒绝访问。
关于空 DACL 的注释:
如果安全描述符的 DACL 设置为 NULL ,也就是安全描述符没有 DACL,则授予所有人完全访问权限,代表着这个对象不受任何保护,即可以被任何令牌代表的主体访问
如果安全描述符的 DACL 为 空 ,即存在 DACL,但不包含任何 ACE,则不会授予对该对象的访问权限,代表该对象没有显式地赋予任何主体任何访问权限,即不允许被访问
缺少的最后一点信息是请求用户的身份。 SRM 从给定的用户访问 令牌 中获取请求用户的身份。
稍后将给出有关此令牌的外观的见解,现在重要的是要知道此 令牌包含请求用户的 SID 以及用户组的 SID 。
现在让我们来看看 SeAccessCheck 的全貌:
在 完整性级别检查 (IL-Check) (将在下一节中描述)之后
安全引用监视器 (SRM) 查询请求对象的安全描述符以获取以下信息:
谁是请求对象的所有者?
如果请求用户是请求对象的所有者:授予访问权限 Grant Access
如果请求用户不是所有者,则 遍历安全描述符的 DACL 中的所有 ACE 并确定 :
– ACE 是否通过将 ACE SID 与用户 SID 和他的组 SID 进行比较来申请请求用户?
– 访问掩码是否包含请求的访问权限,例如访问掩码是否包含 GENERIC_READ 访问权限?
– 访问类型是设置为允许访问还是设置为拒绝访问?
如果有任何和 ACCESS_DENIED_ACE_TYPE 匹配用户和请求的访问权限:拒绝访问
如果没有 ACCESS_DENIED_ACE_TYPE, 但 ACCESS_ALLOWED_ACE_TYPE 匹配用户和请求的访问权限:授予访问权限
除了所有者和 DACL 检查之外,想要理解 SeAccessCheck,还缺少一个要素
即 完整性级别检查 (IL-Check)。
所以让我们深入研究一下。
Integrity Level Check / Mandatory Integrity Control (MIC)
完整性级别检查** / 强制完整性控制 (MIC)**
本节将介绍上图所示的完整性级别检查。
完整性级别检查旨在强制执行另一个 Windows 控制层,
称为强制完整性控制 Mandatory Integrity Control ( MIC )。
强制完整性控制 (MIC) 提供了一种用于控制对安全对象的访问的机制。
此机制是对自主访问控制的补充,并在评估针对对象的自由访问控制列表 (DACL) 的访问检查之前评估访问。
来源:强制性完整性控制 Mandatory Integrity Control.aspx)
现在你脑海中应该出现的第一个问题是:
为什么我们需要MIC?
我们得到了 DACL 检查,这与在 Unix 系统中进行的检查基本相同——这还不够吗?
这个问题的答案是:
是的, DACL 检查是授权检查的核心 ,绝大多数访问请求将根据 DACL 检查被授予或拒绝。
MIC 只是 Microsoft 在 Windows Vista 中与用户访问控制 User Access Control** ** (UAC) 一起添加的另一层,
用于获得更细粒度的控制并防止受损进程访问敏感资源。
这是对一个简单问题的非常抽象的答案,下面对 MIC 和 UAC 的介绍有望使你对此有所了解。
每个安全对象Securable Object.aspx) 都在其 SACL 中设置了一个 MANDATORY_INTEGRITY_LABEL 。
此标签将四个可能的完整性级别 (IL) 之一分配给对象
(如 Windows 完整性机制设计中所定义Windows Integrity Mechanism Design):
低(SECURITY_MANDATORY_LOW_RID 0x00001000)
中(SECURITY_MANDATORY_MEDIUM_RID 0x00002000)
高(SECURITY_MANDATORY_HIGH_RID 0X00003000)
系统(SECURITY_MANDATORY_SYSTEM_RID 0x00004000)
这些完整性级别标记了已分配给安全对象的"安全保护"程度。
默认情况下,所有对象都分配有中等完整性标签。
作为示例,请参考之前的安全描述符屏幕截图,注意该对象(explorer.exe 进程)的安全描述符得到以下 MANDATORY_INTEGRITY_LABEL:SID:S-1-16-8192
快速查看 已知 SIDs 会发现该 SID 描述了"中等强制级别"(所有对象的默认值)。
完整性标签的完整描述是 防止较低级别的完整性进程访问较高级别的完整性对象 。
另一个例子:当启动 Internet Explorer 时,会产生一个低完整性级别的 IE 进程(见下面的截图)。
此低级 IE 进程是用户用于上网的进程。
如果此过程受到损害,例如通过利用 IE/Flash/等漏洞,该进程将无法访问用户的文档,因为这些文档是使用默认的中等完整性级别标签创建的(并且 IE 进程以低完整性运行)。
这是完整性级别检查应该开始有意义的地方。
想象一下没有 MIC 的受损 IE 场景。
IE 进程已由登录用户启动,因此归登录用户所有。
因此,DACL 检查将授予受感染的 IE 进程访问用户资源的权限。
通过强制执行 IL-Check,受感染的 IE 进程拒绝访问用户资源。
那么我是说当具有较低完整性级别的进程尝试访问具有较高完整性级别的资源时,访问通常被拒绝?
当然不是——为什么要这么简单……
在完整性级别检查期间,SRM 将请求进程的完整性级别与被请求对象的完整性级别进行比较,并根据为该对象定义的完整性级别策略决定进行 DACL 检查或拒绝访问。
对象的完整性级别策略基于以下三个已定义状态(在 SYSTEM_MANDATORY_LABEL_ACE 结构中定义):
SYSTEM_MANDATORY_LABEL_NO_WRITE_UP (0x1)
SYSTEM_MANDATORY_LABEL_NO_READ_UP (0x2)
SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP (0x4)
再次参考上一节中给出的正在运行的 explorer.exe 的安全描述符。
请注意, SACL 的 ACE SYSTEM_MANDATORY_LABEL_ACE_TYPE 的访问掩码设置为 0x00000003,
这意味着此完整性策略拒绝来自完整性级别低于该对象的完整性级别的进程的 READ 和 WRITE 访问尝试。
这就是完整性级别检查的描述。
回到最开始的图片并仔细思考现在这是否有意义。
Privileges
特权
引入 Privileges 的最佳方式是使用 MSDN 官方解释official MSDN explanation.aspx):
特权是一个帐户(如用户或组帐户)在本地计算机上执行各种系统相关操作(如关闭系统、加载设备驱动程序或更改系统时间)的权限。
特权在两个方面不同于访问权限:
特权控制对系统资源和系统相关任务的访问,而访问权限控制对安全对象的访问。
系统管理员为用户和组帐户分配权限,而系统根据对象的 DACL 中的 ACE 中授予的访问权限授予或拒绝对安全对象的访问权限。
每个系统都有一个帐户数据库,用于存储用户和组帐户所拥有的权限。
当用户登录时,系统会生成一个访问令牌,其中包含用户权限列表,包括授予用户或用户所属组的权限。
请注意,权限仅适用于本地计算机;域帐户可以在不同的计算机上具有不同的权限。
来源:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379306(v=vs.85).aspx
要枚举您的用户拥有的权限,只需运行以下命令并在输出结果的末尾找到权限列表
C:\> whoami /all
请注意,在以"以管理员身份运行"开头的 cmd 中运行该命令后权限如何扩展:
要交叉检查或查找您获得的权限,您可以使用以下 MSDN 资源:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx.aspx)
UAC
用户访问控制
用户访问控制 (UAC) 的唯一目的 是对管理执行进行更细粒度的控制 ,并防止管理用户在不需要时使用其管理员执行权限。
回想一下,通过登录到您的 Windows 计算机,您的登录线程被分配了一个用户访问令牌,并且该用户启动的所有子进程都将继承此令牌
对于非管理员用户,这是具有您的默认权限的中等完整性令牌。
在 Windows Vista 管理员用户获得具有所有管理权限的高完整性令牌之前,启动的每个子进程都将继承此令牌。
这意味着 由管理员用户生成的所有进程都将以高权限运行 ,即使该进程不需要这些高权限(例如,由管理员启动的 explorer.exe 将以高完整性令牌和完全管理员权限运行,而不需要这些权限)。
UAC 被引入来解决这个问题。
注意:以下所有解释都假设 UAC 已启用,并且我们正在谈论的管理用户不是本地 RID后缀为500 的管理员(我们稍后会遇到这种特殊情况)
由于 UAC 是在 Windows Vista 中引入的,因此当管理员登录时会创建两个访问令牌:
完整的管理员令牌** Full Admin Token**,通常也称为"非过滤令牌"Non-filtered Token或"完整令牌"Full Token,具有高完整性级别Integrity Level (IL) 和所有管理权限
过滤的管理员令牌** filtered admin token**,通常也称为"标准令牌"Standard Token或"受限令牌"Restriced Token,具有中等完整性级别 (IL) 和降低的权限
这两个令牌在内核中链接在一起,因此执行线程可以在需要时访问这两个令牌。 现在,如果管理员用户登录到他的帐户并启动 cmd.exe,则该进程将使用过滤的中等完整性令牌生成(请记住:UAC 已启用且用户不是 RID-500 管理员)。因此,不需要这些权限的进程不会获得高访问权限。
但是,如果管理员用户需要以完全管理员权限运行进程,他可以要求操作系统使用他的完整管理员令牌提升此进程权限,这就是"以管理员身份运行"按钮。
这将导致弹出突出的"同意"提示 (C:\Windows\System32\consent.exe),如下面的屏幕截图所示:
通过接受此同意提示,系统将创建具有完全管理员权限的提升进程(在本例中为 cmd.exe),如下面的屏幕截图所示:
左侧显示由管理员启动且未提升权限的 cmd.exe 进程(注意 conhost.exe 是 cmd.exe 创建的子进程),右侧显示通过点击"以管理员身份运行"提升的 cmd.exe .
还要比较这些进程的完整性级别和权限,以确定哪个是哪个。
UAC for the RID-500er local Admin
RID** 为 500 的 本地管理员的 ** UAC
以上所有解释仅适用于RID不为500的本地管理员的本地或域管理员。
Windows 的每个安装都 附带一个本地管理员帐户 (默认情况下禁用),可以通过 500 的相对标识符 (RID) 标识(SID:S-1-5-21-DomainID-500)。
RID-500 本地管理员是默认情况下此帐户未注册 UAC。
这意味着,如果您使用 RID-500本地管理员帐户登录 Windows 计算机,您将立即获得一个高权限的完全访问令牌(并且不会获得"过滤"的中等完整性令牌)。
如果您使用 RID-500 本地管理员运行 cmd.exe(或其他任何东西),即使没有指定"以管理员身份运行",那么 cmd.exe 将以完全管理权限和高完整性级别生成(因为您只有一个cmd.exe 进程可以继承的完整令牌)。
如果您使用 RID-500er 本地管理员点击"以管理员身份运行",则不会出现同意提示。
默认情况下,RID-500er 管理员未在 UAC 中注册,但可以通过将以下注册表项设置为"1"来注册:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\FilterAdministratorToken
如以下屏幕截图所示,在此实例中,FilterAdminstratorToken 已设置为"1",这会在 UAC 中注册 RID-500 管理员(因此前面提到的所有规则也适用于该用户)。
Disabling UAC For Non-RID-500er Admins
为非** RID-500 的管理员禁用 UAC**
因此,默认情况下,RID-500管理员未在 UAC 中注册, 但所有其他管理员(即管理组中的本地或域用户)都在 UAC 中注册 。
现在,由于 RID-500er 管理员用户可以在 UAC 中注册,非 RID-500er 管理员也可以通过将 LocalAccountTokenFilterPolicy 设置为"1"从 UAC 中取消注册。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy
默认情况下未设置此注册表项,因此如果缺少此注册表项,则所有非 RID-500er 帐户都将在 UAC 中注册:
UAC and Remote Access
UAC 和远程访问
以上所有内容都适用于本地访问,这意味着您的用户在本地登录计算机并执行进程。
现在,对于远程访问,故事还有另一个补充。
简短版本:
对于远程访问(例如通过 wmic** ),域管理员将获得一个完整的高完整性访问令牌,但本地非 RID-500 管理员将仅获得一个中等完整性受限令牌。**
用微软的方式来称呼它:
1) 本地管理员的远程访问(非 RID-500):
来源:https://support.microsoft.com/en-us/help/951016/description-of-user-account-control-and-remote-restrictions-in-windows
当作为目标远程计算机上本地管理员组成员的用户建立远程管理连接时……他们不会以完全管理员身份连接。
用户在远程计算机上没有提升权限的潜力,并且用户无法执行管理任务。
如果用户想要使用安全帐户管理器 (SAM) 帐户管理工作站,则用户必须以交互方式登录到要使用远程协助或远程桌面进行管理的计算机。
2) 域管理员的远程访问:
来源:https://support.microsoft.com/en-us/help/951016/description-of-user-account-control-and-remote-restrictions-in-windows
当具有域用户帐户的用户远程登录到 Windows Vista 计算机并且该用户是管理员组的成员时,
该域用户将使用远程计算机上的完整管理员访问令牌运行,并且该用户在该会话的远程计算机上禁用 UAC。
此对 UAC 的补充适用于远程管理访问,这不会影响远程桌面连接(被视为本地登录)。
UAC And Pass-the-Hash
UAC 和传递哈希
让我们面对以下问题:
问:
以下帐户尝试通过 pth-attack (pass-the-hash) (使用 psexec 或 wmic) 与默认设置的计算机建立远程连接。
谁能够建立成功的远程连接,为什么?
a) 本地"管理员" SID:S-1-5-21DomainID-500
b) 作为本地管理员组成员的本地用户"LocalAdm"(SID:S-1-5-32-544)
c) 没有管理权限的标准域用户"Lab\Frank"是
d) 作为域管理员组成员的域用户"Lab\Bob"
————剧透/答案————
答案:a) & d) 是正确的
原因如下:
a) –\> 默认情况下,本地 500管理员未注册 UAC。默认情况下会收到一个完整的访问令牌,并且可以建立远程连接。
b) –\> 非 500本地管理员在 UAC 中注册,但未收到完整访问令牌。 完整的情况是:非 RID-500 管理员尝试登录并获得标准/中等访问令牌。
远程连接访问需要启动用户没有的完整令牌管理访问过程(获得了中等令牌)。因此,他的连接被拒绝。
c) –\> 与非 500er 本地管理员的情况相同。得到一个标准(中等)令牌并被拒绝。
d) –\> 域管理员已在 UAC 中注册, 但会自动提升 。与本地访问相比,这是适用于远程访问的例外。
完整的情况是:域管理员尝试登录,自动接收完整/管理员访问令牌(而不是标准/中等访问令牌)并且能够获得远程shell。
如果您仍然感兴趣,我还建议您阅读harmj0y 的博客文章
Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy
如前所述, UAC 远程规则不适用于远程桌面连接 。
因此,如果您的用户是远程桌面用户组的一部分,您也可以通过远程桌面传递哈希,如下所述:
https://www.kali.org/penetration-testing/passing-hash-remote-desktop/
Access Tokens
访问令牌
到目前为止,在谈论基本访问检查或 UAC 时,引入了用户"访问令牌"。
此访问令牌包含有关当前用户和用户组的信息,例如,安全参考监视器 (SRM) 使用该令牌来确定谁在请求访问。
这些令牌与访问检查具有主要相关性,并且在某些特权升级攻击中也起作用。
因此,值得仔细研究访问令牌。
一开始只有两种令牌:
分配给进程的主令牌
Primary Tokens
注*:也叫授权令牌(Delegation Token)是由windows内核创建并分配给进程的默认访问令牌
每一个进程有一个主令牌,它描述了与当前进程相关的用户帐户的安全上下文。
用于交互式登录(如rdp登录访问)。
分配给线程的模拟令牌
Impersonation Token
注*:所在进程的主令牌会自动附加到当前的线程上,作为线程的安全上下文。
而线程可以运行在另一个非主令牌的访问令牌下执行,而这个令牌被称为模拟令牌。
用于非交互式的会话(利用WMI进行远程访问)
两种令牌,如上所说。
"过滤令牌"、"受限令牌"、"完整令牌"、"管理员令牌"或一般的"访问令牌"只是用于描述令牌的名称,但所有这些都是 模拟令牌 。
主令牌和模拟令牌都包含以下主要字段 :
用户 SID:用户的 SID(模拟令牌)或创建进程的用户的 SID(主令牌) 用户账户的安全标识符(SID)
Group SIDs:用户所属的组的SID
登录 SID:用于标识当前登陆会话的登陆SID
特权:用户的特权列表(模拟令牌或进程具有)
Primary Group SID:标识被模拟用户的主要组(模拟令牌),例如"域用户"
默认 DACL:当用户创建安全对象而不指定安全描述符时系统使用的默认 DACL(类似于 Linux umask)
类型:令牌是主要还是模拟的信息
模拟级别:允许模拟的程度(级别)。
Integrity Level:完整性级别的SID
…
它是传递给 SRM 以确定进程是否有权访问对象的令牌,因此如果 您能够获得高特权令牌,则可以升级您的权限 。
为了亲身体验令牌, James Forshaw开发了很棒的工具 Token Viewer(包含在Sandbox-AttackSurface-Analysis-Tools中),如下所示:
在右侧窗口中显示了进程列表。
高完整性 cmd.exe 进程之一的令牌已打开并显示在左侧窗口中。
请注意,令牌类型是主要的(因为它是一个进程),并且完整性级别 (IL) 设置为高(因为 cmd.exe 进程是由管理员作为提升的进程启动的)。
请记住,每个进程都有一个分配给它的令牌,并且此令牌始终是主令牌。
现在让我们转到线程。
从介绍中记住,一旦用户登录,就会为用户分配一个令牌,更准确地说,这意味着为用户的登录线程分配了一个模拟令牌。
一个进程只能有一个主令牌,但一个线程可以有一个模拟令牌和一个主令牌,在这种情况下,模拟令牌将始终取代主令牌。
(……是的,我知道。微软在命名方面很糟糕)
下面给出了一个模拟令牌的示例:
请注意,令牌类型现在显示为"Impersonation",并且现在"Impersonation Level"字段也设置为"Impersonation"。
模拟级别 是影响令牌是否可以模拟的重要字段(下一节将详细介绍)。
这里的关键是进程和线程只有两种类型的令牌。
Impersonation
模拟
模拟过程在Windows授权过程中非常重要且经常使用。
要理解为什么使用模拟,我们首先必须退后一步:
假设用户想要删除远程文件共享上的文件。
现在托管文件的服务器需要确定是否允许用户这样做。
服务器无法访问用户的访问令牌,因为该令牌在远程服务器的内存中不可访问 (该令牌存储在请求删除文件的用户的计算机上)。
服务器可以做的是从 Active Directory (AD) 中查询用户的帐户和组信息,并手动检查是否允许用户删除文件,但此任务很繁琐且容易出错。
因此,实施了另一种方法,称为"模拟"。
基本思想是服务器只是 假装是请求用户并执行请求的操作 ,就好像服务器是用户一样。
因此,服务器所做的是 复制用户的模拟令牌并使用该复制令牌请求操作 (例如删除文件)(就好像服务器是用户一样)。
模拟是一个强大的功能,它使一个进程能够伪装成其他人。
重量级想法:我只是冒充高权限用户的令牌,并获得即时的权限升级!
……好主意,但显然不可能那么容易。
有两个障碍:
a) 并非每个模拟令牌都可用于执行操作
b) 您需要特殊权限才能"模拟"令牌(这在技术上意味着复制令牌)
第一个障碍是并非每个令牌实际上都是"有价值的"。
这意味着每个模拟令牌都有一个称为模拟级别的属性,该属性可以具有以下值之一:
匿名级别
服务器可以模拟客户端,但令牌不包含有关客户端的任何信息。
匿名级别仅支持进程间通信(例如命名管道)。所有其他传输都默默地将其提升到"识别级别"
识别级别
这是默认值。服务器可以获取客户端的身份以便进行 ACL 检查。
您可以使用该令牌来读取有关模拟用户的信息或检查资源 ACL,但您实际上无法访问该资源(读/写/执行)
模拟级别
服务器可以模拟客户端的安全上下文以访问本地资源。
如果服务器是本地的,它可以访问本地和网络资源。
如果服务器是远程的,它只能访问与服务器相同的机器上的资源。
委托级别
最强大的模拟级别。
服务器可以模拟客户端的安全上下文来访问本地或远程资源。
因此, 您需要的是一个模拟或委托级别模拟令牌 ,以便能够实际执行任何操作(下一节将对此进行更多介绍)。
您遇到的第二个障碍是您需要特殊权限才能复制(模拟)另一个令牌。
该特殊权限是 TOKEN_DUPLICATE (在访问令牌对象的访问权限中指定)。
但如果您不拥有此特权,您复制令牌的请求不会被拒绝
您仍然会得到一个复制的令牌,但是一个具有较低模拟级别的令牌。
复制/模拟另一个令牌的流程如下所示:
因此,
您要么持有 TOKEN_DUPLICATE 特权(或破坏了持有此特权的进程)
要么最终获得了一个标识级别令牌,这对攻击者来说毫无用处,因为您无法使用它执行任何操作。
在此刻,我们几乎完成了令牌。
以下部分旨在让您了解基于令牌的权限升级攻击的思维方式......
Privilege Escalation With Identification Tokens
使用标识令牌提升权限
上一节描述了获取标识令牌非常容易。
为了再次强调这是真的,我在我的 Windows 机器上激活了本地管理员帐户并使用 Forshaw 的令牌查看器工具Forshaw's Token Viewer来模拟管理员模拟令牌
(有关更多详细信息,请查看他的 2015 BlackHat 谈话His 2015 BlackHat Talk):
我用标准的非管理员用户运行了这个工具,并且仍然可以访问管理员令牌。
感觉很奇怪,但根据上一节中介绍的对重复令牌的访问检查,这一切都应该是这样。
请注意,我只获得了一个识别模拟令牌。
我不能用那个令牌做太多事情,尤其是不能执行管理任务或访问受保护的资源......
…当然,除非某些程序员忘记检查为授权检查而呈现的令牌的模拟级别。
James Forshaw发现某些 Windows 组件发生了这种情况,导致 CVE-2015-0002 ,如本 PoC中所示。
我强烈建议查看 James 2015 BlackHat Talk 以了解此漏洞的全部影响和应用,但基本情况是某个 Windows 组件进行了访问检查以验证提供的模拟令牌是否属于管理员,但是组件只检查了模拟类型和关联的组,完全忽略了模拟级别,这导致任何可以使用管理组提供高完整性标识令牌的用户都可以访问……惊人的发现!
Privilege Escalation By Leaky Tokens
通过泄漏令牌提升权限
Forshaw发现的另一个提权漏洞是他所谓的"Leaky Tokens"。
这种漏洞的基本思路如下:
内核代码可以访问任何类型的令牌来读取和操作它。
那么,如果您发现一个 Windows 内核组件只是将其访问过的令牌返回给用户呢?!
这听起来有点太明显了,这是有缺陷的,但 Forshaw 发现存在一个未记录的 win32k 系统调用,它将以前使用的令牌直接传递回用户。
此缺陷存在于 Windows 剪贴板(用于复制+粘贴)的内核代码中。
因此,一旦管理员复制了某些内容(例如,说来自编辑器的文本),任何用户都可以调用未记录的函数 NtUserGetClipboardToken 并取回以前使用的管理员访问令牌。
这是 Forshaw 在 CVE-2015-0087中提出的。
原文:https://csandker.io/2018/06/14/AWindowsAuthorizationGuide.html#uac-and-pass-the-hash
部分名词翻译参考Windows Internals