免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
只供对已授权的目标使用测试,对未授权目标的测试作者不承担责任,均由使用本人自行承担。
文章正文
在最近的攻防演练中经常能看到这样的frpc配置文件。
[common]
server_addr = x.x.x.x
server_port = 7000[xxx]
type = tcp
remote_port = 48944
plugin = socks5
连接服务器的信息中没有凭证信息,这不是妥妥的未授权吗。我寻思着一般安全意识比较好的攻击队怎么会用能未授权访问的东西,不太正常。我去翻阅了frp的官方文档
https://gofrp.org/docs/examples/ssh/
原来官方例子中的配置就是未授权的,看来是为了图方便。
那既然是未授权,那肯定有办法检测未授权的frp server,从而加以利用(用其他红队的frp server做代理,是不是就溯源不到咱们头上的IP了呢?#坏笑.jpg)。
不想看分析的师傅们可以直接来弟弟的项目下载成品(开源),可批量检测未授权、弱口令。
https://github.com/SleepingBag945/frpCracker
为了弄清楚frp的鉴权过程,下载了frp的源码进行阅读。
找到frpc,调试f7单步跟下去。在clint/service.go找到登录相关函数login()
首先在这发送了进行连接
\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00
然后回了个进行确认
\x00\x01\x00\x02\x00\x00\x00\x00\x01\x00\x00\x00\x00
通过返回包可以判断一个tcp端口是否开放着frp服务。
接着进入认证阶段。
将loginMsg序列化成json发送出去
其他的很清楚怎么来的,只有这个PrivilegeKey需要弄清楚
进入svr.authSetter.SetLogin(loginMsg)看
也就是说这个PrivilegeKey是由auth.token与当前时间戳计算得到,在无配置token的访问中,
这里的token为空。也就是只需要时间戳即可构造。
具体实现方法为 md5(token + timestamp)
而未授权时实际上为md5(timestamp)。
是不是有点像是nps未授权访问?nps是默认把auth_key注释了,导致获取时为空字符串。
返回的信息如下
如果Error为空,获取到RunID则是正常的。
到此就可以自己实现一个frps爆破工具了。
核心逻辑在这
先用返回的消息判断是否是frp,如果是frp才开始检测未授权或者爆破
根据客户端版本、系统、架构、token生成构造出对应的认证消息并发送出去。
如果成功获取到runID之类的信息则成功爆破frp server。
写完爆破出结果
测试下
连接成功。
技术交流
知识星球
交流群
关注我们
关注福利:
回复“app" 获取 app渗透和app抓包教程
回复“渗透字典" 获取 针对一些字典重新划分处理,收集了几个密码管理字典生成器用来扩展更多字典的仓库。
回复“书籍" 获取 网络安全相关经典书籍电子版pdf
回复“资料" 获取 网络安全、渗透测试相关资料文档