PrintSpoofer:滥用Windows 10和Server 2019上的模拟特权

本文介绍了PrintSpoofer工具,它利用Windows 10和Server 2019上的模拟特权进行权限提升。通过模拟用户权限,攻击者可以创建进程并在其他用户的上下文中运行代码。文章讨论了模拟特权的概念,包括SeAssignPrimaryToken和SeImpersonatePrivilege,以及如何通过命名管道来获取和使用这些特权。此外,文章还探讨了如何防范模拟攻击,包括微软实施的安全措施及其局限性。
摘要由CSDN通过智能技术生成

概述

在过去的几年中,类似于RottenPotato、RottenPotatoNG或Juicy Potato这样的一些Windows特权模拟工具,已经在攻防安全社区中非常流行。但是,随着操作系统不断的升级,其中也有意或无意地降低了在Windows 10和Windows Service 2016/2019上使用这些工具的效果。而我们本次分析的是一个全新的工具,将有助于渗透测试人员再次轻松地利用这些特权。

需要请大家注意的是,在这里我们介绍的是一种新的工具,而不是新的技术。实际上,我将配合该工具,讨论两种可以结合在一起的知名技术,从而实现从本地服务/网络服务到系统的特权提升。目前,可能并没有其他研究人员公开讨论过这种使用的特殊技巧。

关于模拟特权

要介绍模拟特权,我想首先引用@decoder_it的一句话:“如果你具有了SeAssignPrimaryToken或SeImpersonate特权,那么你就具有了SYSTEM的权限”。显然,这句话说得太过简单,但事实也并非遥不可及。

这两个特权确实非常强大,通过这两个特权,我们可以在其他用户的上下文中运行代码,甚至创建新的进程。如果我们拥有SeImpersonatePrivilege特权,就可以调用CreateProcessWithToken();如果我们拥有SeAssignPrimaryTokenPrivilege特权,就可以调用CreateProcessAsUser()。

在讨论这两个特定的函数,我们首先来看看标准的CreateProcess()函数是什么样的:

 

前两个参数可以让我们指定要执行的应用程序或命令行。然后,可以调整许多设置,奇热以自定义环境和子进程的安全上下文。最后一个参数是对PROCESS_INFORMATION结构的引用,该函数将在成功执行后返回。其中,包含目标进程和线程的句柄。

现在,让我们来看一下CreateProcessWithToken()和CreateProcessAsUser()

PrintSpoofer:滥用Windows 10和Server 2019上的模拟特权

我们看到,这两个函数与标准的CreateProcess()函数并没有太大的区别。但是,它们都需要令牌的句柄。根据文档,hToken必须是“代表用户的主要令牌的句柄”。在文档中还写着,“要获取代表指定用户的主令牌,[...]我们可疑调用DuplicateTokenEx函数将模拟令牌转换为主令牌。这将允许模拟客户端的服务器应用程序创建具有客户端安全上下文的进程。”

当然,在官方文档之中,并没有告诉我们首先要如何获取这个令牌,因为获取令牌并非是这两个函数的功能。但是,文档告诉了我们应该在什么类型的场景中使用它们。这些函数允许服务器应用程序在客户端的安全上下文中创建进程。比如,对于公开RPC/COM接口的Windows服务,这确实是非常普遍的一种实现方式。当我们调用由高特权帐户运行的服务公开的RPC函数时,该服务就有可能调用RpcImpersonateClient(),以在我们的安全上下文中运行某些代码,从而降低了特权提升漏洞的风险。

总而言之,只要我们拥有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege特权,就可以在另一个用户的安全上下文中创建一个进程。不过,我们需要的是该用户的令牌。但问题在于——如何使用自定义服务器应用程序来捕获到此类令牌呢?

使用命名管道模拟用户

Potato家族的漏洞利用工具都是基于相同的思想——将网络身份验证从回环TCP终端中继到NTLM协商程序。为了完成这一任务,工具利用IStorage COM接口的某些特殊功能,使NT AUTHORITY\SYSTEM帐户连接,并对其控制的RPC服务器进行身份验证。

在身份验证过程中,所有消息都会在客户端(这里是SYSTEM帐户)与本地NTLM协商程序之间中继。这个协商器只是几个Windows API调用(例如:AcquireCredentialsHandle()和AcceptSecurityContext())的组合它们通过ALPC与lsass进程进行交互。最后,如果一切顺利,我们将获得原本需要的SYSTEM令牌。

遗憾的是,由于某些核心的更改,该技术目前不再适用于Windows 10操作系统,因为现在仅在TCP/135端口上允许从目标服务到“Storage”的基础COM连接。

我们前面提到过的@decoder_it曾发表过一篇文章,在文章中表示,实际上可以绕过该限制,但是得到的令牌不能用于模拟。

现在,我们来盘点一下有哪些替代方案?RPC并不是在这种中继方案中唯一可以使用的协议,但是我们将不做过多的展开。相反,我们想讨论一种涉及管道的古老技术。正如我在前言中所述,我希望能按照自己的方式来介绍事务,即使大多数人都觉得这些点已经掌握了,但实际上还是能从中掌握到一些基本知识。

根据官方文档记载,“管道是用于通信的进程的共享内存中的一部分。管道服务器是创建管道的进程,而管道客户端则是连接到管道的进程。一个进程负责将信息写入到管道,然后另一个进程从管道读取信息。”

换句话说,管道是在Windows上实现进程间通信(IPC)的众多方式之一,其他方式还有RPC、COM或者套接字。

管道可以是两种类型之一

1、匿名管道:匿名管道通常在父进程和子进程之间传输数据。它们通常用于在子进程与其父进程之间重定向标准的输入和输出。

2、命名管道:命名管道可以在不相关的进程之间传输数据,前提是管道的权限允许对客户端进程具有适当的访问权限。

在第一部分中,我提到了RpcImpersonateClient()函数。RPC服务器可以使用它来模拟RPC客户端。事实证明,命名管道与ImpersonateNamedPipeClient()函数具有相同的功能。所以接下来,我们就首先对命名管道进行一些模拟尝试。

也许上面所解释的内容过于理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值