官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
在最近的攻防演练中经常能看到这样的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。
写完爆破出结果
测试下
连接成功。