创建自定义虚拟服务账户
继上一篇博客文章之后,如果你无法将任意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
权限的用户身份运行。
|
|
因此,我们现在有了SID为S-1-5-100-1
的AWESOME DOMAIN\USER
账户。现在,在我们登录账户之前,你需要授予它登录权限。如果你想要一个服务账户,这通常是SeServiceLogonRight
,但你可以指定任何你喜欢的登录权限,甚至是SeInteractiveLogonRight
(遗憾的是,我认为你无法实际使用虚拟账户登录,至少不容易)。
如果你获取最新版本的NtObjectManager(在撰写本文时来自github),你可以使用Add-NtAccountRight
命令添加登录类型。
|
|
一旦授予登录权限,你可以使用Get-NtToken
命令登录账户并返回令牌。
|
|
如你所见,我们已经验证了虚拟账户并获取了令牌。由于我们选择以交互类型登录,令牌还将分配INTERACTIVE
组。总之,目前就这些。我猜由于可用的RID数量有限(这是人为限制),微软不想记录这些功能,尽管这对普通开发人员可能是有用的。