使用 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
我目前正在尝试改进我负责的 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