Mysticbinary

只有通过概念的劳作才能获得真实的思想

ZooKeeper未授权访问漏洞确认与修复


zookeeper未授权访问测试参考文章:
https://www.cnblogs.com/Hi-blog/p/Zookeeper-UnAuthorization-Access.html#_label04

探测2181

探测Zookeeper服务开放
如使用nmap探测某个目标地址是否运行Zookeeper服务,探测2181端口开放。
root@kali:~# nmap -Pn -p 2181 xx.xx.xx.xx


探测四字命令

用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交四字命令,来探测四字命令是否开启
参考文章:
https://www.cnblogs.com/kuku0223/p/8428341.html
https://www.jianshu.com/p/1d638fac4da8
https://zookeeper.apache.org/doc/r3.6.1/zookeeperAdmin.html#sc_zkCommands

  • conf命令
输出相关服务配置的详细信息,端口、数据路径、日志路径、session 超时时间,最大连接数等。
root@kali:~# echo conf | nc xx.xx.xx.xx 2181
  • cons命令
列出所有连接到当前服务器的客户端/会话的详细信息
root@kali:~# echo cons | nc xx.xx.xx.xx 2181 | more
  • dump命令
输出未处理的会话和临时节点,leader 节点有效。
root@kali:~# echo dump | nc xx.xx.xx.xx 2181 | more
  • envi命令
输出服务器的详细信息。
root@kali:~# echo envi | nc xx.xx.xx.xx 2181

用安装好zk环境的客户端连接测试

./zkCli.sh -server x.x.x.x:2181
ls /
# 输出目录就是 连接成功

# 输出 Authentication is not valid : /   就是没有权限

修复

修复步骤一 关闭四字命令

ZooKeeper3.4.6支持某些特定的四字命令与其的交互。它们大多是查询命令,但也有重启zk之类的命令,四字命令可以用来获取、重启 ZooKeeper 服务的当前状态及相关信息。用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令。
从运维的角度看,这个功能很方便,但是从安全角度来看,就需要关闭这些特定的四字命令来确保安全了,修复方式为:升级zookeeper>=3.5.3(旧版本不能给四字命令加白名单哦,升级请自行评估风险),然后设置四字命令白名单、关闭http使用四字命令工具即可,示范如下:

/home/work/software/apache-zookeeper-3.6.1-bin/conf/zoo.cfg
 
#限制tcp使用4字命令的白名单,添加了白名单的四字命令才能执行 (升级到高版本以后默认的白名单4字命令里只有srvr这一个,请按需增加)
4lw.commands.whitelist=stat, srvr 
 
#是否开启jetty服务允许使用http方式执行4字命令,默认为true开启,false为关闭(升级到高版本以后默认开启http方式)
admin.enableServer=false
  • 如果真的有需求要开启http功能
如果有需求要开启http功能,可以修改根路径名称,改成20位的随机字符
#修改http四字命令的根路径,默认为/commands
admin.commandURL=/2cgyS2rQGW4yzjJlXV0k

访问路径就会变成:curl http://10.39.27.200:8080/2cgyS2rQGW4yzjJlXV0k/envi

设置成功之后 ,继续做修复步骤二;
参考文章:
https://www.cnblogs.com/kuku0223/p/8428341.html
https://www.jianshu.com/p/1d638fac4da8
https://zookeeper.apache.org/doc/r3.6.1/zookeeperAdmin.html#sc_zkCommands


修复步骤二 关闭未授权访问

开启SASL_PLAINTEXT认证(用户名和密码认证)
https://www.cnblogs.com/iamsach/p/9234624.html

或者用下面的方式

添加IP白名单对连接ZK的客户端进行限制
通过IP白名单对连接ZK的客户端进行限制,比较简单,只需要收集一下IP即可。因zookeeper不支持节点间权限的继承,所以需要对关键节点进行权限控制。
这里对“/”、“/dubbo”、“/zookeeper”节点进行限制,示范如下:

<ZooKeeper_HOME>/bin/
./zkCli.sh -server ip:port
setAcl / ip:xx.xx.xx.152:cdrwa,ip:xx.xx.xx.151:cdrwa,ip:xx.xx.xx.156:cdrwa,ip:xx.xx.xx.155:cdrwa,ip:xx.xx.xx.150:cdrwa,ip:xx.xx.xx.149:cdrwa
setAcl /dubbo ip:xx.xx.xx.152:cdrwa,ip:xx.xx.xx.151:cdrwa,ip:xx.xx.xx.156:cdrwa,ip:xx.xx.xx.155:cdrwa,ip:xx.xx.xx.150:cdrwa,ip:xx.xx.xx.149:cdrwa
setAcl /zookeeper ip:xx.xx.xx.152:cdrwa,ip:xx.xx.xx.151:cdrwa,ip:xx.xx.xx.156:cdrwa,ip:xx.xx.xx.155:cdrwa,ip:xx.xx.xx.150:cdrwa,ip:xx.xx.xx.149:cdrwa

设置完setAcl,然后用getAcl 查看一下是否配置成功.


这篇文章对你有帮助吗?作为一名程序工程师,在评论区留下你的困惑或你的见解,大家一起来交流吧!
微信公众号: Mysticbinary
Github:https://github.com/Mysticbinary
本文版权归作者所有,欢迎转载,但未经作者同意请保留此段声明,请在文章页面明显位置给出原文链接
声明:本文章仅限于讨论网络安全技术,请勿用作任何非法用途,否则后果自负,本人和博客园不承担任何责任!

posted on 2020-08-20 16:58  Mysticbinary  阅读(2244)  评论(1编辑  收藏  举报

导航