跨平台双通道端口转发

先说几句废话。论坛里面的机油有些时候会会问类似的问题,比如这两个求助帖关于某内网3389端口转发不出来 内网转发的问题求助,都是内网无法转出来,使用我上次发布的工具很容易就转出来了。再比如这几个求助帖:提权,内网,国外的服务器,转发的时候出现这种情况 ,虽然我没有试过,但是目测和上面的情况差不多。至于是什么原因,我在这里简单说一下:

原因很简单,我们可以把端口转发工具(如lcx等)想象成一个桥,由于客户端和远程主机无法直接连接,需要一个桥梁才可以建立连接,正常情况下,这个桥梁建立起来后,就不会被自动拆掉。但是有一些特殊情况,比如,服务端负载较多,版本不一致,连接客户端太多等问题,都会导致桥梁建立起来后会被服务器自动拆掉。如果是直接连接,mstsc客户端会自动重连,而服务器端收到自动重连,会正常建立起连接来,也就是说有些情况需要2次或者更多次,才可以建立成功的连接。而如果转发工具没有考虑到这一点,就会在服务器拆掉桥梁后无法再次把桥梁自动架起来,导致转发失败,典型的失败效果如下图所示:

知道原因后,解决方法就很简单,那就是让工具支持自动重连就OK了,可以轻松秒掉。说了半天废话,下面说今天的重点内容。

说明:
四月份,我写了端口转发工具第一版,只支持TCP传输,Windows平台。后来,又想要支持端口复用,于是对工具升级。端口复用没有成功,但是还是对程序做了大的改进,目前支持UDP和TCP双通道转发,支持WINDOWS和LINUX平台(跨平台,双通道端口转发)。如果防火墙对TCP有限制,可以试试UDP通道(不一定绝对可以通过)。至于LINUX的转发,也是有实际意义的,我就用它来SSH登录过内网的LINUX主机。(话说这次改进很心酸,写了好几天,主要是遇到各种蛋疼问题,唉~~我把遇到的问题也记录下来了,各种蛋疼啊。。)

下面开始正文:
1.端口复用尝试
1).通过SOCKET的选项SO_REUSEADDR来进行复用测试:


 

 

实验测试,在一台2003的机子上复用失败,此路放弃。2).API HOOK,来截获80端口,从而实现复用
经测试,此路在用户态下,无法完成。原因如下:IIS是在PID为4的进程下启动的,System进程。远程线程注入无法打开System进程的句柄,更无法完成注入。
3).原始套接字:
原始套接字无须指定端口号,处于TCP下层,从而理论上,可以复用80端口。但是这个依然失败,原因为:从Windows XP SP2以后,windows不再允许原始套接字发送TCP数据包,因此,此路不通。
4).Winpcap编程:
此路不予考虑,因为很多主机上没有安装Winpcap。由于复用端口此路受阻,就想到了暂时放弃此路,想到了UDP传输,因为有些防火墙可能防TCP,但是不一定能防UDP。所以,考虑使用UDP通道进行中转。
二.UDP通道    使用UDP通道,远程登录报奇怪的错误,如协议错误,或者加密数据失败等等奇怪错误。这是TCP不曾有的。我考虑到,原因如下:UDP是不可靠的传输,而TCP是稳定的,UDP无法保证数据一定可达,也不能保证数据有序。对于加密数据而言,这是致命的,因为会导致后续数据全部错误。 因此,使用UDP作为转发通道,必须字节实现TCP的能力,也就是保证数据的有序性和稳定性。需要设置超时重传,ACK确认等等。后来,加了ACK和超时重传机制,终于成功。不过速度不如TCP,我使用的不是滑动窗口。三.跨平台的实现
实现了windows下的TCP,UDP双通道后,接着移植到Linux平台。注意,这里有两点需要注意的地方:1).Select函数。Windwos下,第一个参数可以任意,而Linux第一个参数需要设为套接字的最大值加1.

2).Windwos的远程桌面和Linux的SSH,建立连接后,第一个包的发起者不同。前者是客户端发送第一个包,后者是服务端发送第一个包。这一点, 对Windows和Linux的转发的流程,和使用顺序有影响。

四.程序使用说明

程序参数如下:

1.jpg
        由于-trans,也就是中转通道作用不大,后面的升级中,没有考虑-trans。其中,-udp参数是可选的,如果指定,就是使用UDP传输。-listen模式最后面如有有-linux参数。如果目标主机是linux系统,则中转主机即-listen,后面需要加-linux参数。        此外,windows和linux的顺序相反。首先,都是中转主机-listen进行监听,如果目标主机是linux,后面跟上-linux。如果使用UDP通道,使用-udp参数。       下面进行实际测试。
1.Linux下的TCP通道测试:假设以Windows为中转主机,需要SSH登录到远程Linux主机上。第一步,Windows主机-listen监听,最后跟-linux参数,以表明目标主机是Linux主机。

2.jpg
      如果目标是Linux,需要客户端先连接中转程序:
3.png

然后,linux的SSH反弹回来:

4.jpg

这样,就可以成功登录SSH了:

5.jpg

2.Windows下的UDP通道测试。

同样,先在主机上监听端口,后面不要加-linux参数,而是加-udp参数:

6.jpg

然后,远程主机反弹回来:

7.jpg

然后,mstsc连接过去:

8.jpg

        登录成功:
9.jpg
附:建议最好使用TCP通道,因为TCP通道更稳定,更快速。      如果TCP通道不可用,可以尝试UDP通道。使用的时候,如果远程是Linux主机,需要SSH客户端先连接;如果远程是Windows,则远程端先反弹,然后客户端才连接。
link:http://team.f4ck.net/
本文由网络安全攻防研究室(www.91ri.org)信息安全小组收集整理,转载请注明出处。