使用LsaManageSidNameMapping为SID添加名称映射

本文探讨了如何使用未公开的LSA API函数LsaManageSidNameMapping为安全标识符(SID)添加名称映射,包括技术限制和实际应用场景,并提供了一个.NET工具实现临时映射管理。

使用LsaManageSidNameMapping为SID添加名称映射

在研究服务SID如何映射回名称时,我发现了API LsaLookupManageSidNameMapping。毫不意外,这个API在MSDN或Windows SDK中都没有正式文档。不过,LsaManageSidNameMapping 倒是有文档(大部分)。经过一番挖掘,发现它们最终都指向LSASS中的同一个RPC函数,只是名称不同:

  • LsaLookupManageSidNameMapping → lsass!LsaLookuprManageCache
  • LsaManageSidNameMapping → lsasrv!LsarManageSidNameMapping

它们最终都会调用 lsasrv!LsarManageSidNameMapping。我不清楚为什么会有两个版本,以及为什么一个有文档而另一个没有。耸肩。当然,尽管MSDN上有这个函数的条目,但在Ntsecapi.h头文件中似乎并没有实际文档。再次耸肩。我找到的最好的文档是这个头文件。

这让我思考是否可以通过LSASS映射所有AppContainer命名功能,这样普通应用程序就可以解析它们,而不必我自己处理。这比修改SAM或类似的技巧要容易。遗憾的是,虽然你可以添加一些SID到名称的映射,但这个API不允许你为功能SID这样做,因为有以下的调用限制:

  • 调用者需要SeTcbPrivilege(这对于LSA API是给定的)。
  • 要映射的SID必须在NT安全机构(5)中,且域的第一个RID必须在80到111之间(包含)。
  • 你必须先注册一个域SID的名称,才能使用包含它的SID。

基本上,第二点阻止了我们为功能添加子域SID,因为它们使用包安全机构(15),而且我们不能直接添加SID到名称,因为需要先用API注册域,仅域存在是不够的。也许有其他简单的方法,但这不是。

相反,我刚刚整理了一个.NET工具来添加或删除你自己的SID到名称映射。它已经在github上。映射是临时的,所以如果你搞砸了什么,重启应该就能修复。:-)

发布者: tiraniddo
时间: 16:23

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