目录
0、前言
1、场景介绍
2、环境准备
2.1 下载frp
2.2 配置一台VPS
2.3 socks5客户端
2.5 网络环境准备
3、Frp设置
3.1 一层代理
3.1 二层代理
4、Frp总结
0、前言
FRP是比较老牌的也是比较流行的反向代理、内网穿透软件。FRP用途和使用场景可以看官方文档,或下面的场景介绍。
官网介绍:frp is a fast reverse proxy that allows you to expose a local server located behind a NAT or firewall to the Internet. It currently supports TCP and UDP, as well as HTTP and HTTPS protocols, enabling requests to be forwarded to internal services via domain name.
frp是一种快速反向代理,允许您将位于NAT或防火墙后面的本地服务器暴露给Internet。它目前支持TCP和UDP,以及HTTP和HTTPS协议,使请求能够通过域名转发到内部服务。
1、场景介绍
今天借着proxifier和一个复杂一点的场景测试一下frp的基础功能和多级代理功能。其实我在某视频网站发过一次视频,由于水平有限没多少播放量,而且时间长了自己都忘了某些细节,所以今天用文字记录一下。
下图是测试场景,比如渗透测试过程中黑客利用了S1对外映射的某Web服务的漏洞,通过该漏洞上传了webshell,控制了S1。这时候就想通过其他方式连接该服务器,比如3389端口,或者把S1当成跳板来进行横向渗透S2。这种情况下就可以使用frp最基础的功内网穿透。
这个功能可以想象成把内网中的端口通过隧道主动送到互联网拥有公网IP地址的服务器上,这时候连接这个VPS的某端口实际就是连接S1的某端口。
socks代理的功能可以认为S1把自己的某个端口运行代理然后主动送到VPS上,把相关软件的代理设置为VPS的相应端口就可以进行内网的扫描和横向跳转。
再来点复杂的需求,根据上图,比如客户内部有一台S2, S2有双网卡,另一个网卡连接更为私密的网络。假如防火墙上对S2流量进行了双向阻断,也就是说S2没有对外映射也不能出网。我们想攻击S2并把S2当成跳板再去攻击S3,所以不能反向代理S2的端口,就需要用到多级代理,就是先通过一级代理S1连接到S2,再通过二级代理S2连接到S3。下面逐步实现这个需求。
2、环境准备
2.1 下载frp
目前版本0.58.1,现在版本不再支持win7,而且配置文件由原来的ini变成了toml。
linux 64位:
https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
win 64位:
https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_windows_amd64.zip
2.2 配置一台VPS
如果仅仅做实验可以不需要VPS,使用虚拟机的各种网卡模式搭配出来也能达到效果。
如果想实际使用的话需要购买一台VPS。
如果家里的宽带能获得公网IP的话也可以用路由器端口映射加DDNS的方式实现VPS的功能。我测试成功过。
VPS需要注意的是一般会有安全组,需要在规则里添加允许的端口。
2.3 socks5客户端
socks5客户端可以让不支持通过代理服务器工作的程序能通过HTTPS或SOCKS代理或代理链。我这里使用proxifier。
在模拟黑客主机上运行该软件,理解代理服务器和规则的设置。
2.5 网络环境准备
我是用的是vmware workstation pro,现在也免费了不用担心版权问题了。
运行S1、S2、S3,三台win10虚拟机,通过不同的网卡模式获得以上的网络结构。
物理主机充当黑客主机。
为了能贴近真实网络环境,我用pfsense模拟防火墙。pfsense安装完毕后接口设置没问题的情况下就自动生成源地址转化,内网主机自动就能上网。单独设置S2的阻断策略。
设置正确的wan口、lan口和对应ip地址。
使用web登录以后停止DNS服务,启用DNS转发,设置dns服务器地址。
在lan口设置拒绝S2服务器安全策略。 源是192.168.100.12,目的是所有。
3、Frp设置
3.1 一层代理
首先在VPS上配置frps.toml文件,为了简单点不配置web服务、日志、密码验证等功能。
在S1上运行frpc.exe,指定配置文件。
这时在黑客主机上使用远程桌面连接1.94.22.223:6000
可以看到成功连接。下一步开启S1的socks代理。
停止隧道,编辑frpc.toml,增加socks代理内容。
新版的frp配置和以前不一样,以前的socks代理:
[target1]
type = tcp
remote_port = 1234
plugin = socks5
新版的配置:
[[proxies]]
name = "socks5"
type = "tcp"
remotePort = 6001
[proxies.plugin]
type = "socks5"
编辑好以后运行frpc.exe -c frpc.toml
这时候需要用到proxifier,配置代理服务器。
为了安全起见在实际使用中建议加上认证字段。配置好以后可以点击测试。下一步增加代理规则。
指定目标范围和使用的代理。运行mstsc。
可以在proxifier看到代理中的流量:
也可以看到登录S2的界面:
也可以通过浏览器代理访问S2上面的业务,提前在S2上面通过chfsgui运行一个简单的web页面。通过在proxifier添加代理规则可以测试。
可以在代理软件中看到相关流量,也能这正常打开页面。也可以直接使用浏览器代理功能或者SwitchyOmega插件,但是直接使用浏览器或浏览器插件的话不支持socks登录验证。所以还是使用代理软件方便和安全。
3.1 二层代理
当以上功能实现后,如拓扑图所示,希望在S2上再运行一层代理,去攻击S3的情况下就需要二层代理。
保持以上设置不变,在S1上运行一次frps,也就是服务端,在S2上运行一次frpc,也就是客户端。这样就把代理串联起来了,也叫代理链。
S1上运行服务端:
这里的7000是S1上的7000,和VPS不冲突。
S2上运行客户端:
由于可以通过S1的代理完全访问S2,所以不需要把S2的端口送出来,只开启S2上面的socks就可以。
socks代理链已经准备好了,现在设置代理软件。
增加代理服务器:
这里不能测试,因为需要通过第一代理才能通。
这时候点击proxy chains,打开代理链设置,增加一个代理链。然后把上面的代理拖下来。注意顺序。
设置相关代理规则,目的地址是10.0.0.0的流量走代理链。在设置的时候不小心把2个代理的端口都设置成为6001了,本来以为会冲突,因为可能会在S1上冲突,实际发现并没有冲突。没有冲突的原因是S1在一层代理的时候并没有打开6001端口,而是在VPS上打开6001端口,通过7000端口的隧道到达S1,S1上开放的6001端口实际是S2的socks代理端口。
使用远程桌面测试,可以在代理软件中看到流量,也从客户端看到登录验证信息。
这时候就实现通过代理连访问S3服务器的相关端口,当然也可以通过浏览器访问上面的业务系统。
4、Frp总结
以上就是通过Frp实现多重代理(代理链)的过程,还是比较顺利的。现在网上好多frp配置都是基于老版本的,而且代理连的比较少。代理链能不能用在msf或者nmap上没有测试过,我印象当中msf可以设置代理,nmap官方文档中说三层的扫描流量可以走代理。 在linux中的proxychains是支持代理链的,这次没有测试,但是网上的资料确定是可以的。