创建自定义虚拟服务账户:深入Windows安全标识符映射技术

本文详细介绍了如何使用LsaManageSidNameMapping函数创建Windows虚拟服务账户,包括SID映射、访问令牌生成和登录权限配置等技术细节,适用于系统安全和账户管理场景。

创建自定义虚拟服务账户

继上一篇博客文章之后,如果你无法将任意SID映射到名称以更好地显示功能,那么LsaManageSidNameMapping的目的是什么?其主要目的是促进虚拟服务账户的创建。

虚拟服务账户允许你创建一个访问令牌,其中用户SID是服务SID,例如NT SERVICE\TrustedInstaller。虚拟服务账户不需要配置密码,这使它们成为限制服务的理想选择,而不必处理默认服务账户并使用WSH锁定它们或指定带有密码的域用户。

要创建虚拟服务账户的访问令牌,你可以使用LogonUserExEx并指定未文档化的(AFAIK)LOGON32_PROVIDER_VIRTUAL登录提供程序。你必须具有SeTcbPrivilege权限才能创建令牌,并且账户的SID必须将其第一个RID包含在80到111的范围内。从上一篇博客文章回顾,这正是LsaManageSidNameMapping所覆盖的相同范围。

LogonUserExEx API仅接受域和用户名的字符串,你不能指定SID。使用LsaManageSidNameMapping函数允许你将用户名和域映射到虚拟服务账户SID。LSASS防止你在SCM或任务计划程序服务之外使用RID 80(NT SERVICE)和87(NT TASK)(参见此反向LSASS代码片段以了解其检查方式)。然而,RID范围内的所有其他内容都是公平的游戏。

因此,让我们创建自己的虚拟服务账户。首先,你需要使用上一篇博客文章中的工具添加你的域和用户名。所有这些命令都需要以具有SeTcbPrivilege权限的用户身份运行。

1
2
SetSidMapping.exe S-1-5-100="AWESOME DOMAIN"
SetSidMapping.exe S-1-5-100-1="AWESOME DOMAIN\USER"

因此,我们现在有了SID为S-1-5-100-1AWESOME DOMAIN\USER账户。现在,在我们登录账户之前,你需要授予它登录权限。如果你想要一个服务账户,这通常是SeServiceLogonRight,但你可以指定任何你喜欢的登录权限,甚至是SeInteractiveLogonRight(遗憾的是,我认为你无法实际使用虚拟账户登录,至少不容易)。

如果你获取最新版本的NtObjectManager(在撰写本文时来自github),你可以使用Add-NtAccountRight命令添加登录类型。

1
PS> Add-NtAccountRight -Sid 'S-1-5-100-1' -LogonType SeInteractiveLogonRight

一旦授予登录权限,你可以使用Get-NtToken命令登录账户并返回令牌。

1
2
3
PS> $token = Get-NtToken -Logon -LogonType Interactive -User USER -Domain 'AWESOME DOMAIN' -LogonProvider Virtual
PS> Format-NtToken $token
AWESOME DOMAIN\USER

如你所见,我们已经验证了虚拟账户并获取了令牌。由于我们选择以交互类型登录,令牌还将分配INTERACTIVE组。总之,目前就这些。我猜由于可用的RID数量有限(这是人为限制),微软不想记录这些功能,尽管这对普通开发人员可能是有用的。

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