以前一直以为只有我一个人用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 socketimport binasciihost="192.168.200.132"port=7000s=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可以看出来连接成功了。
第七个数据包返回了一个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是否为空就行了!
通过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,然后发送到服务器进行认证!
更多好玩的红队工具,技巧,请关注公众号Gamma实验室