获取交互式服务账户Shell的实用技巧

本文详细介绍了如何在Windows系统中为Local Service或Network Service等低权限服务账户获取交互式Shell的方法,解决了STATUS_DLL_INIT_FAILED错误,并提供了使用NtObjectManager模块的具体操作步骤。

获取交互式服务账户Shell

有时您需要手动与运行服务账户的Shell进行交互。为SYSTEM账户获取可用的交互式Shell相当容易。作为管理员,选择一个以SYSTEM身份运行且具有适当访问令牌的进程(例如services.exe),并使用该进程作为父进程生成子进程。只要您指定交互式桌面(例如WinSta0\Default),新进程将自动分配到当前会话,并且您将看到一个可见窗口。

为了使这更容易,NtObjectManager实现了Start-Win32ChildProcess命令,其工作方式如下:

1
PS> $p = Start-Win32ChildProcess powershell

现在您将看到一个带有PowerShell副本的控制台窗口。如果您想改为生成Local Service或Network Service怎么办?您可以尝试以下操作:

1
2
PS> $user = Get-NtSid -KnownSid LocalService
PS> $p = Start-Win32ChildProcess powershell -User $user

进程启动,但您会发现它立即死亡:

1
2
PS> $p.ExitNtStatus
STATUS_DLL_INIT_FAILED

错误代码STATUS_DLL_INIT_FAILED基本上意味着初始化过程中的某些内容失败。追踪这个问题非常麻烦,特别是在WinDBG等调试器通常获得进程控制权之前发生故障时。您可以启用Create Process事件过滤器,但仍然需要追踪失败的原因。

我来帮您解决这个问题,运行交互式服务进程的问题在于Local Service/Network Service令牌无权访问会话的Desktop/Window Station/BaseNamedObjects等。这对SYSTEM有效,因为该账户几乎总是通过SYSTEM或Administrators SID被授予对所有内容的完全访问权限,但低权限服务账户则不是。

解决这个问题的一种方法是找到所有可能的安全资源并添加服务账户。这并不十分可靠,遗漏一个资源可能仍然无法工作,或者可能在某个不确定的时间失败。相反,我们执行操作系统所做的操作,我们需要使用登录会话SID创建服务令牌,这将授予我们访问会话资源的权限。

首先使用Start-Win32ChildProcess命令在当前桌面上创建SYSTEM powershell命令。接下来获取当前会话令牌:

1
PS> $sess = Get-NtToken -Session

我们现在可以打印出登录会话SID,以供参考:

1
2
3
4
PS> $sess.LogonSid.Sid
Name                                    Sid
----                                    ---
NT AUTHORITY\LogonSessionId_0_41106165   S-1-5-5-0-41106165

现在使用以下命令创建Local Service令牌(或Network Service,或IUser,或任何服务账户):

1
PS> $token = Get-NtToken -Service LocalService -AdditionalGroups $sess.LogonSid.Sid

您现在可以使用以下命令在当前桌面上创建交互式进程:

1
PS> New-Win32Process cmd -Token $token -CreationFlags NewConsole

您应该发现它现在可以工作了 :-)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计