Tips +1
关于Zookeeper
ZooKeeper 是一种集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用。每次实现它们时,都需要进行大量工作来修复不可避免的错误和竞争条件。由于实现这些类型的服务的难度,应用程序最初通常会对它们进行缩减,这使得它们在发生变化时变得脆弱且难以管理。即使正确完成,这些服务的不同实现也会导致应用程序部署时的管理复杂性。
ZooKeeper 旨在将这些不同服务的精髓提炼为一个非常简单的接口,以提供集中协调服务。该服务本身是分布式的,并且高度可靠。该服务将实现共识、组管理和存在协议,这样应用程序就无需自行实现它们。这些服务的特定用途将由 Zoo Keeper 的特定组件和特定于应用程序的约定混合而成。ZooKeeper Recipes展示了如何使用这个简单的服务来构建更强大的抽象。
Zookeeper漏洞
Apache ZooKeeper 未授权访问漏洞 CVE-2014-085
漏洞描述
默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据
漏洞利用
Apache ZooKeeper 默认开放 2181端口 ,使用如下命令获取敏感数据
echo envi | nc xxx.xxx.xxx.xxx 2181
1、stat:列出关于性能和连接的客户端的统计信息。
echo stat |ncat 127.0.0.1 2181
2、ruok:测试服务器是否运行在非错误状态。
echo ruok |ncat 127.0.0.1 2181
3、reqs:列出未完成的请求。
echo reqs |ncat 127.0.0.1 2181
4、envi:打印有关服务环境的详细信息。
echo envi |ncat 127.0.0.1 2181
5、dump:列出未完成的会话和临时节点。
echo dump |ncat 127.0.0.1 2181
错误的配置-四字命令未授权使用
漏洞描述
在 3.5.3 中的新增功能中,使用四字母词之前需要明确将其列入白名单。默认情况下,白名单仅包含 zkServer.sh 使用的“srvr”命令。其余四字母单词命令默认被禁用,如果没有配置则会出现如下提示: envi is not executed because it is not in the whitelist.
如果在未授权情况下且运维人员错误的配置可以导致四字命令未授权使用,比如使用*号开放所有命令
4lw.commands.whitelist=*
漏洞利用
Apache ZooKeeper 默认开放 2181端口 ,使用如下命令获取敏感数据
echo envi | nc xxx.xxx.xxx.xxx 2181
1、stat:列出关于性能和连接的客户端的统计信息。
echo stat |ncat 127.0.0.1 2181
2、ruok:测试服务器是否运行在非错误状态。
echo ruok |ncat 127.0.0.1 2181
3、reqs:列出未完成的请求。
echo reqs |ncat 127.0.0.1 2181
4、envi:打印有关服务环境的详细信息。
echo envi |ncat 127.0.0.1 2181
5、dump:列出未完成的会话和临时节点。
echo dump |ncat 127.0.0.1 2181
错误的配置-未授权连接及节点操作
漏洞描述
在 3.5.3 中的新增功能中,使用四字母词之前需要明确将其列入白名单。默认情况下,白名单仅包含 zkServer.sh 使用的“srvr”命令。其余四字母单词命令默认被禁用,如果没有配置则会出现如下提示:xxxx is not executed because it is not in the whitelist. 在这种情况下如果运维人员没有进行白名单的配置,则仍然存在未授权连接的风险,如果连接成功我们可以从配置文件中找到一些账户密码、API key、密钥等重要的信息,进行下一步的渗透及扩张.
漏洞利用
默认配置下,我们可以使用srvr 唯一的命令尝试访问,如果成功则可以使用连接工具连接
zookeeper连接工具:https://github.com/vran-dev/PrettyZoo/releases
连接成功后,我们可以找到一些重要的配置文件进行内外网的扩张
错误的配置-AdminServer未授权访问
漏洞描述
AdminServer
是一个嵌入式的Jetty服务器,它为四字命令提供http接口。默认情况下,服务器在端口8080上启动,并通过路径 /commands/[command name]
发出请求,比如 : localhost:8080/commands/stat
。响应是json格式。与原始协议不同,命令不再局限于四个字母,命令可以有多个名称,要查看所有可用命令列表,请求: http://localhsot:8080/commands
。由于该服务是默认开启的,即使是默认没有配置四字命令的情况下,如果没有手动关闭或者没有配置授权的情况下,我们可以直接
访问http://localhsot:8080/commands 执行命令,获取敏感信息
- admin.enableServer- 设置为
false
以禁用 AdminServer。默认已启用。 - admin.serverAddress- 嵌入式服务器Jetty的监听地址,默认是 0.0.0.0。
- admin.serverPort- AdminServer 的监听端口
- admin.idleTimeout- 设置连接在发送或者接收数据之前可以等待的最长空闲时间(以毫秒为单位),默认是 30000 毫秒。
- admin.commandURL - 用于列出和发出相对于根url的命令的url。默认是
commands
。
漏洞利用
这里即使四字母单词命令默认被禁用的情况下,如果没有手动关闭或者没有配置授权的情况下,我们可以直接
访问http://localhsot:8080/commands 执行命令,获取敏感信息
Zookeeper安全防护
1、禁用四字命令
4lw.commands.whitelist=
2、关闭AdminServer
admin.enableServer=false
或者
admin.serverPort=0
3、IP权限模式
该模式使用的ACL方式是 ip:127.0.0.1:[r][w][c][d][a] ,下面我们设置只有本地IP才有权限进行rwdca操作
create /node20 "node20"
setAcl /node20 ip:127.0.0.1:rwcda
getAcl /node20
get /node20
本地IP正常访问
使用其他IP虽然连接成功但是访问失败
4、添加auth授权模式
第一步:先添加授权用户 addauth digest username:password
第二步:设置该节点只有登录了该授权用户的客户端连接才能进行操作。
addauth digest admin:123456
create /nodeAuth “nodeAuth”
setAcl /nodeAuth auth:admin:rwdca
getAcl /nodeAuth
设置认证后,我们把客户端quit退出重新连接后,可以看到需要帐号密码才能访问,下面我们使用帐号密码后,成功访问到节点
5、digest授权模式
digest授权模式基于账号密码的授权模式,与Auth模式类似,只是他设置权限之前不用使用addauth digest username:password进行权限用户添加。直接使用命令 setAcl path digest:username:password:acl 进行授权就行(只是这里的密码要使用加密后的密码,不能使用铭文密码)。
首先我们需要生成密码
echo -n admin:admin123456 | openssl dgst -binary -sha1 | openssl base64
然后在zkCli客户端输入如下命令
create /nodeDigest "nodeDigest"
setAcl /nodeDigest digest:admin:Ru9ZKOAByoLT+6N1gWifDerrauA=:rwdca
getAcl /nodeDigest
get /nodeDigest
addauth digest admin:123456
getAcl /nodeDigest
get /nodeDigest
6、使用防火墙和 IP 白名单
- 只允许特定的客户端访问
2181
端口:
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 2181 -j ACCEPT # 允许整个子网
# 或
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 2181 -j ACCEPT # 允许特定 IP
- 只允许本地访问
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 2181 -j ACCEPT
- 如果使用
firewalld
:
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="2181" accept'
sudo firewall-cmd --runtime-to-permanent
7、ZooKeeper 的 SASL 认证配置
SASL(Simple Authentication and Security Layer)是 ZooKeeper 提供的企业级安全认证方式,通常基于 Kerberos进行身份验证。适用于 分布式集群、生产环境、安全需求较高的场景。
可以参考:
https://juejin.cn/post/7148362248010858526
https://blog.csdn.net/zhang5324496/article/details/111474084
配置sasl 认证后可以看到在客户端没有配置认证的情况下连接后会出现如下报错,客户端工具则连接失败
End
“点赞、在看与分享都是莫大的支持”
原文始发于微信公众号(贝雷帽SEC):【攻防】Zookeeper的常见漏洞与安全防护
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论