记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

跨平台双通道端口转发

2013-06-10 12:25

附:
先说几句废话。论坛里面的机油有些时候会会问类似的问题,比如这两个求助帖关于某内网3389端口转发不出来 ,内网转发的问题求助,都是内网无法转出来,使用我上次
发布的工具很容易就转出来了。再比如这几个求助帖:提权,内网,国外的服务器,转发的时候出现这种情况 ,虽然我没有试过,但是目测和上面的情况差不多。至于是什么原因,我在这里简单说一下:
原因很简单,我们可以把端口转发工具(如lcx等)想象成一个桥,由于客户端和远程主机无法直接连接,需要一个桥梁才可以建立连接,正常情况下,这个桥梁建立起来
后,就不会被自动拆掉。但是有一些特殊情况,比如,服务端负载较多,版本不一致,连接客户端太多等问题,都会导致桥梁建立起来后会被服务器自动拆掉。如果是直接连接,
mstsc客户端会自动重连,而服务器端收到自动重连,会正常建立起连接来,也就是说有些情况需要2次或者更多次,才可以建立成功的连接。而如果转发工具没有考虑到这一点,就
会在服务器拆掉桥梁后无法再次把桥梁自动架起来,导致转发失败,典型的失败效果如下图所示:

知道原因后,解决方法就很简单,那就是让工具支持自动重连就OK了,可以轻松秒掉。

说了半天废话,下面说今天的重点内容。

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

下面开始正文:
1.端口复用尝试

1).通过SOCKET的选项SO_REUSEADDR来进行复用测试:

ServerAddr.sin_family=AF_INET;
             ServerAddr.sin_addr.s_addr=inet_addr("10.104.171.216");//本地对外ip。也就是本机的公网IP地址
            ServerAddr.sin_port=htons(RECV_PORT);
            val=TRUE;
           if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)//设置socket选项用来重绑定端口
          {
                 printf("设置socket选项错误!\n");
                 return(-1);
          }
         if(bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)//绑定端口
        {
               printf("socket绑定失败!");
               return(-1);
          }

实验测试,在一台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,则远程端先反弹,然后客户端才连接。

  • 想收藏或者和大家分享这篇好文章→复制链接地址
  • “跨平台双通道端口转发”共有0条留言

    发表评论

    姓名:

    邮箱:

    网址:

    验证码:

    公告

    关注公众号hackdig,学习最新黑客技术

    推广

    工具

    标签云