zookeeper-Admin-Server认证绕过-CVE-2024-51504
环境配置
下载zookeeper release 3.9.2, 修改./bin/zkServer.sh,配置下远程debug
修改配置文件名为zoo.cfg,底下加两行
1 |
|
打开admin server
./zkServer.sh start 启动服务器。
复现过程
./zkCli.sh -server 127.0.0.1:2181 连接到本地。
setAcl / ip:127.0.0.1:cdrwa
把根设置为只有127.0.0.1的才能操作。
直接访问/commands/snapshot, 显示未授权。
抓包后修改:
1 |
|
添加Authorization头,ip<space>随便,X-Forwarded-For修改后即可访问。
将127.0.0.1修改为127.0.0.2(或其他地址),返回未授权:
原理分析
官方文档有点离奇,踩了一点坑。对Admin Server部分,老版本文档提到了IPAuthenticationProvider,写的很明白就是用X-Forwarded-For作验证的,以为又是随手拈来的洞,但是配置的时候花了好长时间,新文档直接没了,有关权限和认证也写在了不在Admin Server的部分。参考了一些网上资料后,最后具体看代码分析了,稍微多花了点时间。
我还是在md里找到的:
在JettyAdminServer#doGet,这里截取了Authorization头信息作为authInfo,传递给了runGetCommand。
在Commands#runCommand:
关键在于这个handleAuthentication(验证完后面是授权了,可以不用管)
Commands#handleAuthentication:
用空格把Authorization头内容打成数组,第一部分是schema,决定选哪个Provider。
默认就两。
IPAuthenticationProvider#handleAuthentication:
authData后面也没用到,所以随便填就行,这里获取IP地址用了getClientIPAddress
很简单。最后返回给ids:
后面就是授权部分了。
Commands#handleAuthorization
取出了acls,和ids进行对比。具体逻辑就不看了。
完。