「玩转漏洞」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服务器的管理命令。
ClearFuncs类暴露的_send_pub()方法,可用于直接在master publish服务器上对消息进行排队,攻击者可通过调用该方法,触发minion来以root权限执行任意命令。
这种方法的暴露提供给远程非认证攻击者对salt master的与root权限等价的访问权限。
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端口映射出来
查看docker是否启动成功:docker ps
02
exp利用
调用_prep_auth_info()返回得到root key,从而实现验证绕过。
调用wheel读取任意目录、文件,从而进行目录遍历:
可执行任意命令:
利用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)
利用2:
执行任意命令(eg:写入文件)
因salt为异步执行框架,无法看到执行命令回显,为了证实命令被执行,进入docker环境中查看。
尽量用同步功能
某些安装的第三方浏览器插件会丢失
进入docker命令:
docker exec -it dfb88a96f881 /bin/bash
执行命令前:
执行命令,写入文件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'
执行命令后:
成功执行命令,写入文件。
03
监控策略
saltstack漏洞的利用是建立TCP会话。且交互通过ZeroMQ进行,访问默认的4505、4506端口。监控可以从几个方面考虑:
1.访问4505、4506端口(默认端口情况下);
2.该漏洞能调用服务端各类执行函数在于绕过了验证,得到了root key,所以都会调用_prep_auth_info()方法,因此可以通过该关键字进行匹配监测。
3.其他常见命令执行、可疑文件的监测
04
处置建议
漏洞影响
攻击者可通过构造恶意请求,绕过Salt Master的验证逻辑,调用相关未授权函数功能,可读取任意文件,进行目录遍历,或远程执行命令。
漏洞影响范围
SaltStack < 2019.2.4
SaltStack < 3000.2
漏洞修复
1.将SaltStack升级至安全版本以上。可设置SaltStack为自动更新,及时获取相应补丁。可以看到CVE-2020-11651的补丁主要是对ClearFuncs类可调用方法添加了一个白名单。且可调用方法都需要进行验证。
CVE-2020-11652的补丁则是对wheel方法处理的路径进行规范化处理。
2.将Salt Master默认监听端口(默认4505和4506)设置为禁止对公网开放,或仅对可信对象开放。
往期导读
· 信息安全技术部 ·
安全就是效益 责任重于泰山
我知道你 在看 哟