frp扫描工具分析


起因:

以前一直以为只有我一个人用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等信息。

{"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发送就行了。垃圾代码如下

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

{"version":"0.37.0","run_id":"7bd1c9e7f0c561f2","server_udp_port":0,"error":""}

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

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,然后发送到服务器进行认证!

写好的工具:

我懒!!!
要是有师傅有写好的,记得让我嫖一下!
等我先休息,后续更新。

声明:john'blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - frp扫描工具分析


欢迎来到脚本小子的博客