命名管道是进程间通信中常用的一种机制,它提供了高效、安全的双向数据传输能力,尤其适用于同一台计算机上的多个进程之间通信,甚至可以通过网络与远程计算机进行数据交换。在 .NET 中,NamedPipeServerStream 类是实现命名管道服务器端的核心工具,支持多客户端连接、双向通信以及灵活的安全配置。
接下来,我们将深入了解其核心构造函数、常用属性与方法,并通过示例代码展示如何创建一个简单的命名管道服务器。
在Windows操作系统中,通过命名管道实现进程间通信是一种常见的技术。而在权限提升场景下,命名管道常用于客户端与服务端通信,同时为实现令牌模拟提供支持。
在 .NET 中通常使用 PipeSecurity 类为管道设置访问控制规则,用于管理命名管道的访问控制列表(ACL)。通过这个类,可以为命名管道配置精细化的安全权限,从而控制哪些用户或用户组能够访问管道,以及他们可以执行的操作。
最常用的方法是 AddAccessRule,用于向命名管道的访问控制列表中添加一条新的访问规则。
以下代码展示了如何使用 PipeSecurity 和 PipeAccessRule 配置管道的访问权限。
using System;
using System.IO.Pipes;
using System.Security.AccessControl;
class Program
{
static void Main()
{
PipeSecurity pipeSecurity = new PipeSecurity();
pipeSecurity.AddAccessRule(new PipeAccessRule(
"Everyone",
PipeAccessRights.ReadWrite,
AccessControlType.Allow));
using (NamedPipeServerStream namedPipeServerStream = new NamedPipeServerStream(
"TestPipe",
PipeDirection.InOut,
1,
PipeTransmissionMode.Message,
PipeOptions.None,
128,
128,
pipeSecurity))
{
Console.WriteLine("管道已创建,等待客户端连接...");
namedPipeServerStream.WaitForConnection();
Console.WriteLine("客户端已连接!");
}
}
}
何使用 PipeSecurity 和 PipeAccessRule不过,在生产环境中,应限制对管道的访问,仅允许特定用户组使用。例如,可以使用管理员组。
pipeSecurity.AddAccessRule(new PipeAccessRule("Administrators", PipeAccessRights.FullControl, AccessControlType.Allow));
NamedPipeServerStream 是 .NET 提供的命名管道服务器端实现类,用于实现进程间通信。允许创建一个命名管道服务器,以便客户端通过管道名称连接,并与服务器进行数据交换。
命名管道是双向通信的一种机制,可以用于同一台计算机上的不同进程之间通信,或者通过网络与远程计算机通信,具体使用代码如下所示。
上述代码中,pipeName 表示管道名称,客户端需要通过该名称连接。direction 参数表示管道的方向,可以是 In(只读)、Out(只写)或 InOut(读写)。public NamedPipeServerStream(
string pipeName,
PipeDirection direction,
int maxNumberOfServerInstances = NamedPipeServerStream.MaxAllowedServerInstances,
PipeTransmissionMode transmissionMode = PipeTransmissionMode.Byte,
PipeOptions options = PipeOptions.None,
int inBufferSize = 0,
int outBufferSize = 0,
PipeSecurity pipeSecurity = null
)
using System;
using System.IO;
using System.IO.Pipes;
using System.Text;
class Program
{
static void Main()
{
string pipeName = "TestPipe";
using (NamedPipeServerStream pipeServer = new NamedPipeServerStream(
pipeName,
PipeDirection.InOut,
NamedPipeServerStream.MaxAllowedServerInstances,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous))
{
Console.WriteLine($"管道已创建: {pipeName}");
Console.WriteLine("等待客户端连接...");
pipeServer.WaitForConnection();
Console.WriteLine("客户端已连接");
byte[] message = Encoding.UTF8.GetBytes("Hello from server");
pipeServer.Write(message, 0, message.Length);
Console.WriteLine("消息已发送");
byte[] buffer = new byte[256];
int bytesRead = pipeServer.Read(buffer, 0, buffer.Length);
string receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"收到客户端消息: {receivedMessage}");
}
}
}
Sharp4Tokenvator 便是这样一款基于命令管道实现的 Windows 令牌访问工具,主要用于模拟低权限用户到高权限用户。通过工具,用户可以借助系统中高权限进程的令牌,创建新的进程并以高权限运行,从而实现权限提升。
其中,3576为目标进程PID,如下图所示。Steal_Token /Process:3576 /Command:cmd.exe
从漏洞分析到安全攻防,我们涵盖了 .NET 安全各个关键方面,为您呈现最新、最全面的 .NET 安全知识,下面是公众号发布的精华文章集合,推荐大伙阅读!