使用 C# 的服务 SACL ||使用 C# 获取具有 ACCESS_SYSTEM_SECURITY 权限的服务的句柄

2024-05-01

有人知道如何使用 C# 获取远程服务上的 SACL 吗?我尝试了很多不同的方法,但基本上没有什么效果。我可以在本地计算机上获取 DACL 和 SACL,但在远程计算机上获取其中任何一个似乎都不可能。

我所做的是创建一个名为ServiceSecurity继承自NativeObjectSecurity并且行为很像RegistrySecurity班级。以下是我拥有的两个构造函数:

public ServiceSecurity(string serviceName, AccessControlSections includeSections)
        : base(true, ResourceType.Service, serviceName, includeSections, null, null)
    {
    }

    public ServiceSecurity(System.Runtime.InteropServices.SafeHandle handle, AccessControlSections includeSections)
        : base(true, ResourceType.Service, handle, includeSections)
    {
    }

第一个使用服务名称,而第二个则需要服务的句柄。显然,第一个可以很好地获取 DACL 和 SACL,因为它都是本地的,但为了获取远程计算机,我正在使用ServiceController类来查找远程计算机上的服务。得到它后,我通过了ServiceHandle服务的财产ServiceSecurity我构建了一个类,此时我收到了未经授权的访问异常,这似乎不对,因为我的用户帐户是该域的域管理员,并且是目标框上的本地管理员。我也有SeSecurityPrivilege是的,这应该允许我访问。

有人有主意吗?似乎是SafeHandle我得到的是不对的,但是SafeHandle属性说它没有关闭并且它是一个有效的句柄,所以我不太知道发生了什么。

这是我用来尝试检索数据的代码:

ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceName, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);

上述内容适用于本地权限和审核设置(DACL 和 SACL)。但它被设计为在本地机器上工作。如果我这样做:

ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceHandle, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);

ServiceSecurity 构造函数在本地和远程服务器上对于 SACL 均失败,如下所示,但对于 DACL 仍然有效:

System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.
   at System.Security.AccessControl.Win32.GetSecurityInfo(ResourceType resourceType, String name, SafeHandle handle, AccessControlSections accessControlSections, RawSecurityDescriptor& resultSd)
   at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
   at System.Security.AccessControl.NativeObjectSecurity..ctor(Boolean isContainer, ResourceType resourceType, SafeHandle handle, AccessControlSections includeSections)

对于 accessSections,我仅指定其中一个AccessControlSections,无论是审核还是访问,每次我通过考试时审核似乎都会失败ServiceHandle.


更新: 所以也许真正的问题应该是,我如何获得具有以下功能的服务的句柄:ACCESS_SYSTEM_SECURITY权利以便我可以获得 SACL?


您从 ServiceController 获得的句柄将不具有 ACCESS_SYSTEM_SECURITY 权限,因此您无法使用它访问 SACL。

为了做到这一点,您需要掌握这一权利。您可能需要使用 DuplicateHandle 来获取额外的权限,但为远程系统启用 SeSecurityPrivilege 可能会很棘手。

您是否尝试过使用带有远程名称的命名服务构造函数?

我需要检查一下并回复您。如果明天之前没有人给出更好的答案,我会为你找出答案。

编辑:通过命名服务构造函数,我的意思是尝试创建一个 ServiceSecurity 对象,其服务名称格式为 \\server_name\service_name 或 \\IP_address\service_name。理论上它应该可以工作,但可能不会,因为 SeSecurityPrivilege 将在本地计算机上而不是远程计算机上启用。

为了获得具有 ACCESS_SYSTEM_SECURITY 权限的句柄,您必须执行以下步骤:

  • 检索句柄(从 ServiceController 或通过互操作)
  • 为当前令牌启用 SeSecurityPrivilege(这是棘手的部分),请参阅:调整Token权限 http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspx, TOKEN_PRIVILEGES http://msdn.microsoft.com/en-us/library/aa379630(VS.85).aspx, LUID_AND_ATTRIBUTES http://msdn.microsoft.com/en-us/library/aa379263(VS.85).aspx, etc.
  • Call 重复句柄 http://msdn.microsoft.com/en-us/library/aa446616(VS.85).aspx在句柄上请求您需要的任何权限,包括 ACCESS_SYSTEM_SECURITY 来检索具有适当权限的新句柄。
  • 禁用 SeSecurityPrivilege(如上所述)。

不幸的是,我没有设置适当的测试环境来测试它,所以我不能保证它适用于远程服务。为远程服务器启用 SeSecurityPrivilege 似乎是主要的障碍。无论如何,我希望这至少有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C# 的服务 SACL ||使用 C# 获取具有 ACCESS_SYSTEM_SECURITY 权限的服务的句柄 的相关文章

随机推荐