zookeeper未授权漏洞复现及处理

2023-09-18 17:11:26


一、漏洞详情

Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Zookeeper的默认开放端口是2181。Zookeeper 安装部署之后默认情况下不需要任何身份验证,造成攻击者可以远程利用 Zookeeper,通过服务器收集敏感信息或者在 Zookeeper 集群内进行破坏(比如:kill命令)。攻击者能够执行所有只允许由管理员运行的命令。

二、使用Java解决zk的未授权访问漏洞

还是以digest为例:

//给密码加密
public String getDigestUserPswd(String idPassword) throws NoSuchAlgorithmException {
return DigestAuthenticationProvider.generateDigest(idPassword);
}
//获取ACL列表,这里只设置一个可访问用户,用户名为user,密码为pswd。如果你需要多个,继续add即可。
public List<ACL> getAclList() {
String idPassword = "user:pswd";
if (idPassword == null) {
logger.warn("no digest config,so use world scheme");
return ZooDefs.Ids.OPEN_ACL_UNSAFE;
}
List<ACL> aclList = new ArrayList<>();
try {
Id zkUser = new Id("digest", getDigestUserPswd(idPassword));
ACL acl = new ACL(ZooDefs.Perms.ALL, zkUser);
aclList.add(acl);
} catch (NoSuchAlgorithmException e) {
logger.error(e);
}
return aclList;
}
//给znode设置权限,只有aclList的用户可以访问
public void addDigestScheme(){
zk.setACL(znode, aclList, -1);
}
//创建znode的时候设置ACL
zk.create(znode,data,aclList,...)
//如何访问加密的znode
public void client(){
ZooKeeper zk = new ZooKeeper(xxx)
zk.addAuthInfo("digest","user:pswd".getBytes())
//然后zk就可以访问加密znode了
}

上面的代码仅说明了核心步骤。
我在这里遇到个大坑,就是idpasswod为空的情况,之前直接给返回空了,feature正常启动,但是服务没有成功的发布出去。重要的是构建环境把我在配置文件配置的user信息给删掉了(我不知道)才开始跑的,更坑的是它运行完后直接清除日志了,哪里错了都看不到。
最后哼哧哼哧的啃代码,终于定位到位置。
血泪教训:空指针情况需要正确处理,别TMD的随便返回空,运行没问题不代表功能没问题。

到这里,我们在create节点的时候可以为所有的znode设置访问权限,理论上可以保护我们的数据安全了。
漏洞扫描验证

上面我们在创建znode的时候进行了加密,这样总可以通过漏洞扫描了吧。
重点来了。

但是如果你使用漏洞扫描工具扫描的话,还是有未授权访问漏洞的,为啥呢?
不知道你有没有注意,zk服务端启动后,默认会启动这几个具有world和cdrwa权限的znode,“/” "/zookeeper" "/zookeeper/config"和"/zookeeper/quota"(根据zookeeper的版本不同可能存在不同,并且这几个节点虽然具有world和cdrwa权限,但是是无法删除的,不知道为什么,好在我们可以给它设置ACL列表。另外,官网对着几个节点也没有特别说明,估计和zk本身的一些配置相关吧,不删除最好)。就是这几个znode,会导致你的产品无法通过安全工具的漏洞扫描,你说坑不坑,解决办法也是很简单的,用我们前面说过的zk.setACL为这几个节点设置权限就OK了,千万别忘记根节点"/"了。

好了,到这里,才是真正的解决了这个未授权访问漏洞问题了。

还可以禁用2181端口试试。

更多推荐

C++ Qt零基础入门进阶与企业级项目实战教程与学习方法分享

Qt是一个卓越的客户端跨平台开发框架,可以在Windows、Linux、macOS进行客户端开发,无缝切换,一统三端;当然除了桌面端,在移动端的早期,Qt也展现了其多才多艺,在Android和ios也可以使用Qt编写app,近些年移动端的蓬勃发展,大浪淘沙,Qt已退出移动端开发的舞台,但是在桌面端开发,尤其是跨平台方面

5G通信与蜂窝模组之间的关系

5G通信是第五代移动通信技术的简称,它代表了一种新一代的无线通信技术标准。5G通信的主要目标是提供更高的数据传输速度、更低的延迟、更大的网络容量以及更可靠的连接,以支持各种新兴应用和服务,包括高清视频流、虚拟现实、物联网(IoT)、自动驾驶汽车和远程医疗等。蜂窝模组在5G通信中代表了一种设备或组件,它用于使物联网(Io

SpringBoot集成Prometheus实现监控

SpringBoot配置Prometheuspom.xml引入监控以及prometheus依赖<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><

软件设计师笔记系列(三)

😀前言随着计算机技术的日益发展,操作系统作为计算机系统的核心组件,其重要性不言而喻。操作系统不仅管理和控制计算机硬件和软件资源,还为用户和其他软件提供服务,使得复杂的计算机系统能够高效、安全和方便地运行。本章将深入探讨操作系统的一些基本概念,如程序与进程、进程的三态模型、死锁及其处理策略,以及磁盘调度算法。通过对这些

【C# Programming】值类型、良构类型

值类型1、值类型值类型的变量直接包含值。换言之,变量引用的位置就是值内存中实际存储的位置。2、引用类型引用类型的变量存储的是对一个对象实例的引用(通常为内存地址)。复制引用类型的值时,复制的只是引用。这个引用非常小(32位机器时4字节引用)3、结构除string和object是引用类型,所有C#内建类型都是值类型。C#

【Kafka系列】(二)Kafka的基本使用

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址[1]文章更新计划[2]系列文章地址[3]Kafka线上集群部署方案怎么做操作系统先说结论,Kafka部署在Linux上要比Windows和Mac上性能高的多,主要是以下几个原因:操作系

单臂路由的配置

目录单臂路由单臂路由是什么为什么要用单臂路由单臂路由的注意事项单臂路由的原理单臂路由的优缺点单臂路由的实验enspCiscoH3C单臂路由是什么单臂路由是一种特殊的路由器,它的设计目的是实现在一个路由器的一个接口上通过配置子接口(或“逻辑接口”,并不存在真正物理接口)的方式,实现原来相互隔离的不同VLAN(虚拟局域网)

2023年贵州省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程

2023年贵州省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程一、赛项名称赛项名称:软件测试赛项组别:高职组赛项归属产业:电子信息大类二、竞赛目的(一)引领职业院校专业建设与课程改革本赛项竞赛内容以《国家职业教育改革实施方案》为设计指导,以电子信息产业发展的人才需求为依据,以软件测试岗位真实工作过程为载体,全面检验

JavaScript实现复制粘贴功能的原理与应用

前言在Web开发中,复制粘贴功能是一项常见需求。通过JavaScript,我们可以实现在网页上点击按钮或其他交互元素后将指定内容复制到剪贴板,也可以将剪贴板中的内容粘贴到指定位置。实现复制功能的基本原理是使用ClipboardAPI,它提供了访问和操作剪贴板内容的方法。我们将使用第三方库clipboard.js,这是一

D. Edge Split

Problem-D-Codeforces思路:思路想到了,但是不知道用什么方法写。。首先我们先看只有一个树的情况,那么如果我们所有的边是一个颜色,那么答案是1+n,如果我们将其中的一条边变色,那么产生的答案是2+n-1,答案是不变的,如果有n条边,同样的方式我们如果所有的边为一个颜色,那么产生答案是1+n,但是n条边的

C++,权限修饰符、继承与派生、派生类的构造函数、继承的二义性、基类与派生类的转换

目录一、权限修饰符二、友元三、继承与派生四、派生类的构造函数和析构函数五、继承的二义性(三角形)六、基类与派生类的转换一、权限修饰符public:共有protected:受保护private:私有使用修饰成员(成员变量、成员方法)注意只改变作用域,不改变内存分配修饰成员(成员变量、成员方法)和public:成员在任何位

热文推荐