前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >抓住黑客-爆破frp

抓住黑客-爆破frp

作者头像
Gamma实验室
发布2022-03-29 16:45:19
2.6K0
发布2022-03-29 16:45:19
举报
文章被收录于专栏:Gamma安全实验室Gamma安全实验室

起因

以前一直以为只有我一个人用frp来做内网的socks5代理,后来不知道为啥越来越多的人也用frp来做内网socks5了。在上次的攻防演练中发现了其他攻击队上传的一个frpc.ini打开发现里面frpc和frps没有做验证。所以在想能不能写一个工具去批量验证frps有没有密码,以及爆破frps的token。

frpc请求分析

环境:

frpc:192.168.153.154 frps:192.168.153.135

在不使用token的情况下。直接用wireshark抓取frpc和frps的连接数据包,前三个数据包就是经典的TCP三次握手。从第四个包到第六个包可以看出来frpc和frps应该是用的一个私有协议的认证。主要的数据位于第六个数据包中,从数据包的长度就可以看出来!

为了查看,我把主要内容复制到下面了。可以看见,frpc会向frps传递frpc的版本以及系统架构时间戳和key等信息。

代码语言:javascript
复制
{"version":"0.37.0","hostname":"","os":"windows","arch":"amd64","user":"","privilege_key":"3900738c9c817bab438548f48a6d2823","timestamp":1629082109,"run_id":"","metas":null,"pool_count":1}

尝试模拟frpc

直接使用简单暴力的办法把四到六组数据包中的tcp payload拿出来用用socket发送就行了。垃圾代码如下

代码语言:javascript
复制
import socket
import binascii
host="192.168.200.132"
port=7000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
hex1="000100010000000100000000"
hex2="0000000000000001000000c5"
hex3="6f00000000000000bc7b2276657273696f6e223a22302e33372e30222c22686f73746e616d65223a22222c226f73223a2277696e646f7773222c2261726368223a22616d643634222c2275736572223a22222c2270726976696c6567655f6b6579223a223339303037333863396338313762616234333835343866343861366432383233222c2274696d657374616d70223a313632393038323130392c2272756e5f6964223a22222c226d65746173223a6e756c6c2c22706f6f6c5f636f756e74223a317d"
str=binascii.unhexlify(hex1)
s.send(str)
str=binascii.unhexlify(hex2)
s.send(str)
str=binascii.unhexlify(hex3)
s.send(str)

从frps可以看出来连接成功了。

frps返回分析

第七个数据包返回了一个ACK的数据包,暂时不知道是干啥用的。从第八到第十个数据包长度来看主要信息应该在第十组数据包中。数据包如下。返回的数据中主要包括了frps的版本等信息。第八和第九个数据包中返回的tcp payload 长度为12,第十组长度为88

代码语言:javascript
复制
{"version":"0.37.0","run_id":"7bd1c9e7f0c561f2","server_udp_port":0,"error":""}

使用recv接收收三次数据包即可

代码语言:javascript
复制
s.recv(12)
s.recv(12)
resp=s.recv(88)

返回结果如下。

我们再把frps设置token来试试。可见recv的长度不够,加到200就行了。

好了,所以扫描未授权直接判断error是否为空就行了!

frps弱口令

通过whireshark分别抓取设置token和没设置token的数据包,并未发现两个数据包有什么不同。猜测privilege_key应该就是token了。但是发现每次抓取的包的privilege_key都不一样,privilege_key应该是token和时间戳timestamp进行了某种运算得出来的,这就得看frp的源码了。

打开github搜索auth或者login,定位到frp/pkg/auth/token.go的77行,可见判断了PrivilegeKey是否与util.GetAuthKey函数处理token和Timestamp之后的值相等。

定位到util.GetAuthKey函数,可见是util.GetAuthKey的返回值是token和Timestamp拼接之后的md5。

所以爆破的思路就是密码和时间戳拼接然后计算md5,将计算出来的md5当作PrivilegeKey,然后发送到服务器进行认证!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Gamma安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • frpc请求分析
  • 尝试模拟frpc
  • frps返回分析
  • frps弱口令
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档