Sharp4TranPort是一款高效且易于使用的端口转发工具,在内网环境中,很多系统和服务受到防火墙和网络隔离的保护,通过使用Sharp4TranPort 在本地和远程主机之间创建隧道,攻击者可以将内网服务端口转发到外部,从而达到绕过这些安全防护策略。
基本用法
使用Sharp4TranPort进行端口转发非常简单,假设需要将本地计算机的8899端口转发到远程主机192.168.101.86的3389端口,可以运行以下命令:
Sharp4TranPort.exe -a pf -lp 8899 -rh 192.168.101.86 -rp 3389
执行上述命令后,Sharp4TranPort将开始监听本地的8899端口,并将所有通过该端口的数据转发到远程主机的3389端口。这样,就可以通过访问本地的8899端口登陆远程主机的终端桌面。
该工具各参数说明如下所示。
-a pf:指定操作类型为端口转发(port forwarding)。
-lp 8899:指定本地端口为8899。
-rh 192.168.101.86:指定远程主机IP地址为192.168.101.86。
-rp 3389:指定远程端口为3389。
编码实现
Sharp4TranPort原理上通过指定本地和远程端口,实现本地到远程主机的端口转发,为了确保通信稳定性,工具使用TCP协议进行转发传输。下面我们将分别介绍该工具实现的细节。首先定义了一个start方法,用于通过传递本地端口、远程主机地址和远程端口来启动一个端口进行转发操作。具体代码如下所示。
public static void start(int lport, string rehost, int report)
{
Tran tran = new Tran
{
inputConn_Port = lport,
outputConn_Host = rehost,
outputConn_Port = report
};
Console.WriteLine(string.Concat(new string[]
{
"[*]: ",
DateTime.Now.ToString("[HH:mm:ss.fff]"),
"开始监听转发:",
lport.ToString(),
"-->",
rehost,
":",
report.ToString()
}));
tran.StartLinstening();
}
代码中创建了一个Tran对象,并设置其属性inputConn_Port(本地端口)、outputConn_Host(远程主机)和outputConn_Port(远程端口),并且调用tran对象的StartLinstening方法,开始监听本地端口的连接请求。而StartLinstening方法负责在指定的本地端口上开始监听传入的连接请求,具体代码如下所示。
public void StartLinstening()
{
TcpHelp.Listening(this.inputConn_Port, new OnConnected(this.OnInputConnected), null);
}
StartLinstening方法内部使用TcpHelp类的Listening方法,在inputConn_Port端口上开始监听。并且使用委托方法OnConnected进行回调,将OnInputConnected方法作为参数进行回调传递,当有连接到达时,触发该回调进行处理。OnConnected委托方法定义如下所示。
namespace Forward
{
public delegate void OnConnected(TcpClient client);
}
OnInputConnected方法用于处理每个新的TCP连接,当有新的客户端连接到本地端口时,OnInputConnected方法被触发,用于建立与远程主机的连接,并在本地和远程之间建立数据桥接。具体实现代码如下所示。
private void OnInputConnected(TcpClient inputClient)
{
try
{
string RemoteEndPoint = inputClient.Client.RemoteEndPoint.ToString();
TcpClient outputClient = new TcpClient();
outputClient.Connect(this.outputConn_IPAddress, this.outputConn_Port);
bool flag = TcpHelp.Bridge(inputClient, outputClient);
if (flag)
{
string[] array = new string[8];
array[0] = "[+]: ";
array[1] = DateTime.Now.ToString("[HH:mm:ss.fff]");
array[2] = "转发成功:";
array[3] = this.inputConn_Port.ToString();
array[4] = "-->";
int num = 5;
IPAddress outputConn_IPAddress = this.outputConn_IPAddress;
array[num] = ((outputConn_IPAddress != null) ? outputConn_IPAddress.ToString() : null);
array[6] = ":";
array[7] = this.outputConn_Port.ToString();
Console.WriteLine(string.Concat(array));
}
}
}
这里通过创建一个新的TcpClient对象,并连接到预设的远程主机和端口上,本地和远程之间交互通过使用TcpHelp.Bridge方法进行桥接,将本地客户端和远程客户端连接起来,实现数据的转发。该方法的定义如下所示。
public static bool Bridge(TcpClient clientA, TcpClient clientB)
Bridge方法实现了一个TCP连接桥接器,将两个TCP对象clientA和clientB连接起来,通过一个客户端发送的数据可以通过桥接传输到另一个客户端。具体代码如下所示。
new Task(delegate()
{
try
{
using (NetworkStream reader = clientA.GetStream())
{
using (NetworkStream writer = clientB.GetStream())
{
byte[] buffer = new byte[1024];
for (;;)
{
int size = reader.Read(buffer, 0, buffer.Length);
bool flag2 = size > 0;
if (flag2)
{
writer.Write(buffer, 0, size);
}
else
{
bool flag3 = !TcpHelp.TcpClientIsConnected(clientA, 500);
if (flag3)
{
break;
}
}
}
}
}
}
new Task(delegate()
{
try
{
using (NetworkStream reader = clientB.GetStream())
{
using (NetworkStream writer = clientA.GetStream())
{
byte[] buffer = new byte[1024];
for (;;)
{
int size = reader.Read(buffer, 0, buffer.Length);
bool flag2 = size > 0;
if (flag2)
{
writer.Write(buffer, 0, size);
}
else
{
bool flag3 = !TcpHelp.TcpClientIsConnected(clientB, 500);
if (flag3)
{
break;
}
}
}
}
}
}
该桥接代码通过创建两个独立的Task对象任务,实现了clientA和clientB之间的双向数据传输。第二个任务Task与第一个任务类似,但它处理的是从clientB到clientA的数据传输,使得clientA和clientB之间的数据能够双向流动每个任务负责一个方向的数据流动,并在连接断开时关闭客户端。
小结
通过这三个方法,Sharp4TranPort实现了在内网渗透环境中简单而高效的端口转发功能。start方法用于初始化和启动转发,StartLinstening方法负责在本地端口上监听连接请求,而OnInputConnected方法处理具体的连接和数据转发逻辑。通过这些方法用户可以轻松实现本地端口到远程主机端口的数据转发。