使用 NTLM 验证 RPC 服务器

Authenticating RPC Server with NTLM

我目前正在尝试改进我负责的 RPC 服务器,服务器和客户端都在本地同一台机器上 运行,但是我想限制服务器,以便它只允许管理员 (包括内置 /LocalSystem 帐户)以通过命名管道连接到 rpc 服务器。

首先,我使用以下库作为 RPCserverApi/RPCClientApi 的包装器: https://github.com/csharptest/CSharpTest.Net.RpcLibrary

我是这样创建服务器的:

server = new RpcServerApi(IId, MaxCalls, ushort.MaxValue, true);
server.AddProtocol(RpcProtseq.ncacn_np, Id, MaxCalls);
// Set authentication
server.AddAuthentication(RpcAuthentication.RPC_C_AUTHN_WINNT);

然而,当我检查命名管道的安全性时,它仍然显示它根本不受限制,即使我尚未更改它以指定身份验证,我的客户端仍然可以连接。

此外,我可以检查对该命名管道的访问,我得到:

\.\pipe\myNamedPipe
  RW Everyone
  RW NT AUTHORITY\ANONYMOUS LOGON
  RW BUILTIN\Administrators

好的,对于 运行 遇到此问题的任何其他人来说,我需要做一些事情,但我使用的库中没有公开这些事情。所以我创建了自己的包装器。

当使用 RpcServerRegisterIf2() 注册 Rpc 接口时,我必须通过标志: RPC_IF_ALLOW_SECURE_ONLY

然后另外在为RpcServer设置协议时:RpcServerUseProtseqEp()我还必须通过一个SDDL,来描述端点的限制。您可以在此处找到 SDDL 的描述: https://docs.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-definition-language

为此,我创建了一个 Ace 字符串,然后使用 ConvertStringSecurityDescriptorToSecurityDescriptor() 创建了正确的对象。然后锁定终点,如:

\.\pipe\myNamedPipe 
  RW BUILTIN\Administrators

但它也在服务器上强制执行,只有经过身份验证的帐户才能访问它

我最初报告的问题充满了对 RPC 服务器和命名管道的误解,我强烈建议阅读和理解以下文章,因为它们对我很有帮助。

https://csandker.io/2021/01/10/Offensive-Windows-IPC-1-NamedPipes.html https://csandker.io/2021/02/21/Offensive-Windows-IPC-2-RPC.html