Meterpreter如何使用getsystem的技巧1:Service - Named Pipe Impersonation后以System身份执行cmd命令

How does Meterpreter execute cmd commands as System after using getsystem's technique 1: Service - Named Pipe Impersonation

我试图弄清楚 Meterpreter 如何在使用 getsystem 的 技术 1 模拟该帐户 (NT AUTHORITY\System) 的安全上下文后以系统身份执行 cmd 命令: Service - Named Pipe Impersonation (In Memory/Admin).

为此,我编写了一个小的 C# 代码来创建一个命名管道 A,生成一个新的服务 B 运行ning 作为系统,然后强制服务 B 在 A 上写入一些数据,这允许我通过 client impersonation funcionality for named pipes.

模拟客户端

现在,一旦模拟完成,我所拥有的是一个进程,其 主令牌指向本地管理员用户 (运行ning 用户c# 代码,假设它是用户 管理员 ) 和此进程的一个线程,带有指向系统帐户 的 模拟令牌。由模拟系统的线程执行的活动显然是在模拟帐户的安全上下文下 运行,但是如果我想执行一个 cmd 命令(假设是一个像 whoami 这样的微不足道的命令),我需要产生一个 新进程 以便 运行 cmd.exe。在那一刻,新进程的主要令牌是我的初始进程的主要令牌,而不是来自模拟系统线程的模拟令牌,因此命令 whoami 的输出是 Administrator 而不是 System.

我猜 Meterpreter 没有使用 CreateProcessAsUser 因为 A) 它只有一个模拟令牌,而不是主要令牌(有什么方法可以将模拟令牌变成主要令牌)和 B) 一些特殊的需要权限才能使用该功能,我已经检查过 none 我计算机的用户已授予该权限,尽管我已经能够通过 Meterpreter 使用此技术提升我的权限。

所以这引出了我的主要问题:在使用 getsystem 的技术 1 后,Meterpreter 如何将 cmd 命令作为系统执行?

经过一些(更多)研究,我想我找到了这个问题的答案。

尽管您需要 SE_INCREASE_QUOTA_NAMESE_ASSIGNPRIMARYTOKEN_NAME 才能使用 CreateProcessAsUser(我的用户中没有人已授予该权限),您可以使用仅需要 SE_IMPERSONATE_NAME 的函数 CreateProcessWithTokenW。我猜 Meterpreter 正在使用这个,因为这实际上是我的一些用户授予的特权,而且它似乎是一个限制较少的功能。我已经能够通过 C# 使用此 API 调用重现 getsystem 行为。

另一方面,您可以使用 DuplicateToken 函数将模拟标记转换为主要标记(反之亦然)。