vlambda博客
学习文章列表

「玩转漏洞」SaltStack远程命令执行漏洞实战

文/王思琪

前言

SaltStack是一款基于Python的开源配置管理工具,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,可用来发现、监控、响应、协调、自动化管理本地、混合、云和IOT资产。运维人员可通过SaltStack在成千万台服务器上批量执行命令。SaltStack远程命令执行漏洞,包含两部分:身份验证绕过漏洞(CVE-2020-11651)和目录遍历漏洞(CVE-2020-11652)。

漏洞原理

01

saltstack怎么交互?

saltstack为主从模式,分为master和minions(slave)。配置后的master可以管理成千上万个minions。master安装的是服务端组件salt-master,minions安装的是salt-minion;Salt使用ZeroMQ异步网络实现快速通信。

Salt Master运行2个网络服务:

ZeroMQ PUB系统,默认运行在4505端口;

ZeroMQ REP系统,用于与Salt Minion进行双向通信,默认运行在4506端口;

当Salt Minion配置了Master,并且Salt Master通过salt-key命令信任了对应的Salt Minion(前提,建立连接)。Salt客户端(salt命令)发送的命令将通过ZeroMQ PUB/SUB广播给各个Salt Minion。Salt Minion可以接收到广播命令,并且执行;

PUB/SUB是单向通信,广播结束,Master服务器上的PUB接口就不会再与Minion进行任何通信。Minion在运行命令之后,通过REP端口(4506)将命令的返回数据发回Master。

02

CVE-2020-11651

CVE-2020-11651认证绕过漏洞漏洞由ClearFuncs类引起,该类暴露了_send_pub()和_prep_auth_info()方法。攻击者可通过构造恶意请求,绕过Salt Master的验证逻辑,调用相关未授权函数功能,从而远程执行命令。

ClearFuncs类暴露的_prep_auth_info()方法,可让攻击者通过调用该方法返回得到用与认证salt master服务器上本地root用户的root key。通过root key即可远程调用master服务器的管理命令。

「玩转漏洞」SaltStack远程命令执行漏洞实战

ClearFuncs类暴露的_send_pub()方法,可用于直接在master publish服务器上对消息进行排队,攻击者可通过调用该方法,触发minion来以root权限执行任意命令。

这种方法的暴露提供给远程非认证攻击者对salt master的与root权限等价的访问权限。

「玩转漏洞」SaltStack远程命令执行漏洞实战

03

CVE-2020-11652

CVE-2020-11652目录遍历漏洞由ClearFuncs类wheel()模块引起。wheel模块包含在特定目录路径下读取和写入文件的命令,函数的入参直接与目标目录连接在一起,生成的路径未规范化处理。经过身份验证(root key)的攻击者利用此漏洞可以访问任意目录。

漏洞复现

01

环境准备

MacOS安装docker,可通过brew cask install docker直接安装最新版

MacOS版本较低可能不支持最新版本docker,所以可在官网下老一点的版本进行安装:

https://download.docker.com/mac/stable/32159/Docker.dmg

获取docker镜像:

docker pull vulfocus/saltstack-cve_2020_11651

启动该docker镜像:

docker run -d -p 4506:4506 -p 4505:4505 vulfocus/saltstack-cve_2020_11651

此处是将4506和4505端口映射出来

「玩转漏洞」SaltStack远程命令执行漏洞实战

查看docker是否启动成功:docker ps

「玩转漏洞」SaltStack远程命令执行漏洞实战

02

exp利用

调用_prep_auth_info()返回得到root key,从而实现验证绕过。

「玩转漏洞」SaltStack远程命令执行漏洞实战

调用wheel读取任意目录、文件,从而进行目录遍历:

「玩转漏洞」SaltStack远程命令执行漏洞实战

可执行任意命令:

「玩转漏洞」SaltStack远程命令执行漏洞实战

利用1:

验证绕过,得到root key,读取任意文件(eg:etc/passwd)

python3 /Users/phantom/Downloads/SaltStack-Exp-master/exp.py --master 192.168.0.101 --read /etc/passwd

得到root key,读取任意文件(eg:etc/passwd)

「玩转漏洞」SaltStack远程命令执行漏洞实战

利用2:

执行任意命令(eg:写入文件)

因salt为异步执行框架,无法看到执行命令回显,为了证实命令被执行,进入docker环境中查看。

尽量用同步功能

某些安装的第三方浏览器插件会丢失

进入docker命令:

docker exec -it dfb88a96f881 /bin/bash

执行命令前:

「玩转漏洞」SaltStack远程命令执行漏洞实战

执行命令,写入文件hack.txt:

python3 /Users/phantom/Downloads/SaltStack-Exp-master/exp.py --master 192.168.0.101 --exec-choose master --exec-cmd 'echo 123>>/tmp/hack.txt'

「玩转漏洞」SaltStack远程命令执行漏洞实战

执行命令后:

「玩转漏洞」SaltStack远程命令执行漏洞实战

成功执行命令,写入文件。

03

监控策略

saltstack漏洞的利用是建立TCP会话。且交互通过ZeroMQ进行,访问默认的4505、4506端口。监控可以从几个方面考虑:

1.访问4505、4506端口(默认端口情况下);

2.该漏洞能调用服务端各类执行函数在于绕过了验证,得到了root key,所以都会调用_prep_auth_info()方法,因此可以通过该关键字进行匹配监测。

「玩转漏洞」SaltStack远程命令执行漏洞实战

3.其他常见命令执行、可疑文件的监测

04

处置建议

漏洞影响

攻击者可通过构造恶意请求,绕过Salt Master的验证逻辑,调用相关未授权函数功能,可读取任意文件,进行目录遍历,或远程执行命令。

漏洞影响范围

SaltStack < 2019.2.4

SaltStack < 3000.2

漏洞修复

1.将SaltStack升级至安全版本以上。可设置SaltStack为自动更新,及时获取相应补丁。可以看到CVE-2020-11651的补丁主要是对ClearFuncs类可调用方法添加了一个白名单。且可调用方法都需要进行验证。

「玩转漏洞」SaltStack远程命令执行漏洞实战

CVE-2020-11652的补丁则是对wheel方法处理的路径进行规范化处理。

2.将Salt Master默认监听端口(默认4505和4506)设置为禁止对公网开放,或仅对可信对象开放。


往期导读


· 信息安全技术部 ·

安全就是效益 责任重于泰山


我知道你  在看  哟