首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >获取交互式服务帐户外壳

获取交互式服务帐户外壳

作者头像
Khan安全团队
发布2022-01-18 14:18:52
发布2022-01-18 14:18:52
8830
举报
文章被收录于专栏:Khan安全团队Khan安全团队

有时您希望手动与运行服务帐户的 shell 交互。为 SYSTEM 获得一个工作的交互式 shell 非常容易。作为管理员,选择一个以 SYSTEM 身份运行的具有适当访问令牌的进程(例如services.exe)并使用它作为父进程生成一个子进程。只要您指定一个交互式桌面,例如 WinSta0\Default,那么新进程将自动分配给当前会话,您将获得一个可见窗口。

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

PS> $p = Start-Win32ChildProcess powershell

现在,您将看到一个带有 PowerShell 副本的控制台窗口。如果您想生成本地服务或网络服务怎么办?您可以尝试以下操作:

PS> $user = Get-NtSid -KnownSid LocalService

PS> $p = Start-Win32ChildProcess powershell -User $user

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

PS> $p.ExitNtStatus

STATUS_DLL_INIT_FAILED

错误代码 STATUS_DLL_INIT_FAILED基本上意味着初始化失败。追踪这一点在背后是一件痛苦的事,尤其是在诸如WinDBG之类的调试器通常控制进程之前发生故障时。您可以启用 Create Process 事件过滤器,但您仍然需要追踪它失败的原因。

我会为您省去痛苦,运行交互式服务进程的问题是本地服务/网络服务令牌无权访问会话的桌面/窗口站/BaseNamedObjects 等。它适用于 SYSTEM,因为该帐户几乎总是通过 SYSTEM 或 Administrators SID 被授予对所有内容的完全访问权限,但低特权服务帐户却没有。

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

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

PS> $sess = Get-NtToken -Session

我们现在可以打印出登录会话 SID,感兴趣:

PS> $sess.LogonSid.Sid

Name Sid

---- ---

NT AUTHORITY \LogonSessionId_0_41106165 S-1-5-5-0-41106165

现在使用以下命令创建本地服务令牌(或网络服务、IUser 或任何服务帐户):

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

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

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

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

本文系转载,前往查看

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

本文系转载前往查看

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档