前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >令牌模拟

令牌模拟

作者头像
Khan安全团队
发布2022-01-18 12:34:02
1.3K0
发布2022-01-18 12:34:02
举报
文章被收录于专栏:Khan安全团队

在入侵过程中,令牌盗窃和用户冒充可以提供很大帮助,节省我们大量时间并帮助我们尽可能保持隐秘,仅使用 Microsoft Windows 操作系统本身提供的功能和工具。

在开始之前并作为提醒,Microsoft Windows 操作系统中的令牌是一种安全元素,当进程和线程想要对安全系统对象(文件、注册表、服务......)执行操作时,它为它们提供标识。

在接下来的几行中,我们将了解如何仅使用两种不同的技术来窃取计算机上运行的几乎任何进程的令牌,只要我们拥有能够执行它的必要特权和权限。

由于这个世界上的一切都是从以前的工作开始的,所以调查的挑战和灵感来自于 SpecterOps 的 Justin Bui (@slyd0g) 的这篇精彩的帖子,我们将从中反驳他的一些结论,以及 Chintan Shah 的结论MacAfee 《Access TokenTheft and Manipulation 的技术分析》,其中引用了前者。

但是为什么我们会对从系统中的特定进程或线程中窃取令牌感兴趣呢?

快速而简短的答案是提升权限并执行使用当前令牌无法执行的操作,或者横向移动到网络上的另一台计算机。您在上一篇文章“ TrustedInstaller,停止 Windows Defender ”中有第一个示例,尽管现在我们会看到更多。

能够窃取令牌的通用公式通过:

  1. 访问远程进程(Winapi Openprocess调用)。
  2. 访问您的令牌。
  3. 在我们正在运行的进程的当前线程上设置该令牌,即模拟。

我们将看到如何实现我们的目标,窃取团队进程中存在的任何令牌,这三个动作将通过使用两组不同的Winapi调用来执行。

能够执行模拟操作以及我们进程的当前执行线程获取受害进程/线程身份的关键基于以下因素:

  • 基于自主控制的足够访问权限,即我们是谁以及我们属于什么组。
  • 有权在我们运行的进程中进行模拟(SeImpersonatePrivilege)
  • 令人惊讶的是,强制性完整性控制,即我们的过程与目标相比的完整性水平,不会影响,将所有工作委托给上述任意控制。

考虑到以上所有因素,我们将展示对WinApi的第一组调用(我们将其称为Technique1),这将允许我们从团队正在运行的进程的一部分中窃取令牌,并由我们在上面提到的帖子中的 SpecterOps 同事。

技巧一

  1. 启用 SeDebugPrivilege
  2. OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION)
  3. OpenProcessToken(TOKEN_DUPLICATE | TOKEN_QUERY)
  4. ImpersonateLoggedOnUser()

在此顺序的这组调用中,突出显示带有打开请求PROCESS_QUERY_LIMITED_INFORMATION的Openprocess

这是 Justin 的一个很好的发现,因为只有这个打开权限请求允许我们访问能够读取 Token 的可能性,尽管这并不意味着我们可以使用它,这将取决于自主控制(权限)相同的(在上述帖子中没有考虑到的方面)。当我们面对 PPL(受保护的进程)类型的进程时,这将非常有用。

至于启用SeDebugPrivilege,我们不需要,我们会看到原因。

作为概念证明,已经制作了一个名为“ StealAllTokens ”(我将其留在 Github 上)的小应用程序,它运行机器的所有运行进程并尝试使用 Technique1 窃取 Token。

请注意,我们将在 Windows 10 Pro 20H2 上以“高”完整性和属于管理员组的用户运行该程序,暂时避免将其作为 SYSTEM 启动。

我们看到,即使没有启用 SeDebugPrivilege,我们也能够使用 Technique1 从机器上超过一半的正在运行的进程中窃取 Token !我们不需要这个,因为大多数进程都允许管理员组使用PROCESS_QUERY_LIMITED_INFORMATION打开进程

这对于保持尽可能隐蔽非常重要,因为许多 EDR 密切关注哪些进程启用了此特权。有趣的…

但是为什么我们不能做剩下的呢?是什么阻止了我们?

让我们看一下SpecterOps 帖子中讨论的进程示例,即“spoolsv.exe”。简而言之,我们同事得出的结论是不可能的,因为BUILTIN\Administrator组必须是TOKEN_OWNER才能执行OpenProcessToken()从而窃取令牌。

从我的角度来看,事实并非如此,让我们看看为什么。

在现代 Microsoft Windows 操作系统中,一切都被认为是安全对象(请参阅Sysinternals 精彩的 Winobj工具),当我说一切都是:进程、注册表、线程、管道、ALPC 端口、桌面……一个 TOKEN!

也就是说,所有这些元素都呈现 DACL(自由访问控制列表),控制谁访问对象以及访问对象的目的。调用某个WinAPI以获取对象句柄与保护它的 DACL 集之间存在关系。让我们看两个例子,以提到的进程“ spoolsv.exe ”作为分析元素。

开放进程()

当我们调用此函数时,操作系统会根据与“进程”对象关联的 DACL 集验证请求的访问类型,以允许或不允许访问其处理程序。

在这种情况下,我们看到Spoolsv.exe进程的访问控制列表如何允许我们使用访问类型PROCESS_QUERY_INFORMATION PROCESS_QUERY_LIMITED_INFORMATION执行Openprocess() 但其余的则不然。

同样,我们有第二个打开令牌的示例。

OpenProcessToken()

因此,应用于BUILTIN\Administrator组的 DACL仅允许我们打开令牌以执行TOKEN_QUERY,而不会被另一个进程窃取和使用,我们将缺乏TOKEN_DUPLICATE权限。

好吧,一旦我们看到了原因并使用了令人难以置信的ProcessHacker工具,如果我们将此权限添加到 Token,我们就会看到使用 Technique1 我们如何能够从“spoolsv.exe”进程中窃取 Token

可是等等!这是作弊,如果我们使用像 System ( ProcessHacker ) 这样的进程进行这些权限更改,那么实际上,令牌不会被盗……

好吧,既然我们在一个黑客博客中,让我们看看黑客跳过应用于 Token 对象的自主控制,从而能够模拟该 Token。

为此,我们将介绍 Technique2,它利用了 Native API ( ntdll.dll ) 的魔力,更具体地说是NtImpersonateThread()函数。

这个函数的美妙之处在于它允许我们模拟一个远程线程,但要注意!如果这个线程没有提供关联的令牌,而是模拟进程的主令牌或主令牌(O_o)。奢侈品,对吧?

我们唯一需要记住的是不要运气不好,并且该线程此时正在冒充特权较少的用户,这将非常罕见,尽管我们应该在代码中检查这种可能性。

请注意,有两个条件:您必须使用PROCESS_QUERY_INFORMATION打开进程,对于那些不允许我们这样做的进程,启用SeDebugPrivilege。因此,让我们看一下技术2的公式。

技巧二

  1. 我们激活SeDebugPrivilege
  2. 开放进程(PROCESS_QUERY_INFORMATION)
  3. 我们列出远程进程的线程
  4. 我们调用NtImpersonateThread()

我们将把第二种技术添加到我们的“ StealAllTokens ”应用程序中,我们将针对技术1 没有为我们工作的任何进程运行它,获得以下结果:

我们看到我们现在已经成功盗取了 327 个代币,而我们只剩下 10 个在流水线中。让我们看看它们是什么以及为什么。

  • DoSvc 服务
    • 描述:执行任务以优化 P2P 内容在网络上的分发
    • 原因:管理员组的Opentoken()没有分配权限,不会使用PROCESS_QUERY_INFORMATION打开它
  • 防风服务
    • 说明:Windows Defender 防病毒软件
    • 原因:管理员组的Opentoken()没有分配权限,不会使用PROCESS_QUERY_INFORMATION打开它
  • SgRm经纪服务
    • 描述:监控和验证 Windows 平台的完整性。 
    • 原因:管理员组的Opentoken()没有分配权限,不会使用PROCESS_QUERY_INFORMATION打开它
  • wscsvc 服务
    • 描述:WSCSVC(Windows 安全中心)服务监控和报告计算机安全健康设置
    • 原因:管理员组的Opentoken()没有分配权限,不会使用PROCESS_QUERY_INFORMATION打开它
  • 安全健康服务服务
    • 说明:Windows 安全服务控制统一的设备保护和状态信息。
    • 原因:管理员组的Opentoken()没有分配权限,不会使用PROCESS_QUERY_INFORMATION打开它
  •  MpCopyAccelerator 服务
    • 描述:Microsoft 恶意软件保护复制加速器实用程序
    • 原因:管理员组的Opentoken()没有分配权限,不会使用PROCESS_QUERY_INFORMATION打开它
  • NisSrv 服务
    • 描述:Microsoft 网络实时检查服务,是 Defender 的一部分。
    • 原因:管理员组的Opentoken()没有分配权限,不会使用PROCESS_QUERY_INFORMATION打开它
  • sppsvc 服务
    • 描述:微软软件保护平台服务
    • 原因:管理员组的Opentoken()没有分配权限,不会使用PROCESS_QUERY_INFORMATION打开它
  • 对于剩下的两个,通过在 Technique1 中启用SeDebugPrivilege,我们将获得他们的令牌。

正如我们所见,它们是 svchost.exe 进程(服务),其中大部分的目的是控制操作系统的完整性和安全性。

我们没有成功的原因是管理员组没有使用令牌的权限,所以只需从任何允许它并模拟它的系统进程中窃取令牌就足够了,然后采取行动使用新身份执行对ImpersonateLoggedOnUser()的新调用。

有了这个,我们将覆盖 100% 的系统进程,即使是最小类型的那些,例如“内存压缩”!

结论

  • 我们能够直接使用属于管理员组的用户从 97% 的系统进程中窃取令牌。
  • 剩下的 3% 可以通过SYSTEM用户来完成。
  • 在超过一半的进程中没有必要为此使用SeDebugPrivilege,因此我们的操作会更加不被注意。例如通过从Winlogon.exeLsass.exe窃取令牌来从 Admin 爬升到 System 。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 技巧一
    • 开放进程()
      • OpenProcessToken()
      • 技巧二
      • 结论
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档