o2oa<=v9.1.3 前台RCE
tj 历史精选 1153浏览 · 2025-02-25 14:22



分析权限认证功能

需要了解此系统的路由和权限控制,

全局使用@WebFilter拦截路径进入相应的filter,

如@WebFilter(urlPatterns = "/jaxrs/invoke/*", asyncSupported = true)

图片加载失败




其中AnonymousCipherManagerUserJaxrsFilter、CipherManagerJaxrsFilter、CipherManagerUserJaxrsFilter会调用HttpToken的who函数,

验证token是否有效,绕不过,

图片加载失败


图片加载失败




发现存在@WebFilter注释的类都继承了AnonymousCipherManagerUserJaxrsFilter、CipherManagerJaxrsFilter、CipherManagerUserJaxrsFilter三个之中的其中之一,

现在想要找权限绕过是不行的,因为上面三个函数绕不过,只能找未授权接口,

那么只要去找@path中的路径不在@WebFilter中,就说明此接口没有任何防护,

图片加载失败




找到以下接口为未拦截,不过访问不了,因为接口在api.json或者在describe.json才能访问,因此后面只能找后台漏洞了,



漏洞一(前台rce 利用socket)



此处开启的20010端口会接收数据,利用soket传输数据时,

并没有做鉴权,直接将加密数据传输,而且加密秘钥固定在源码中,

图片加载失败


图片加载失败




分析端口的服务端,

NodeAgent类的run函数在监听20010端口,接收客户端传入的数据,此端口没有相应的鉴权措施,

加密的秘钥写在服务端中,并不是随机的,所以可以利用此秘钥,

图片加载失败




客户端传入syncFile参数,然后将接收的内容生成文件,这里对文件属性没有过滤措施,

因此,我们直接直接将数据加密发送到20010端口,就会达到未授权文件上传的目的,最终getshell,

图片加载失败




将Main.java放入项目的

目录中,

然后将put路径更改为我们穿越的路径,可以未授权任意文件上传,

图片加载失败


图片加载失败




可以利用文件上传getshell,那么如果部署在linux上时,就可以未授权上传ssh公钥,达到getshel的目的,

Main.java(注意多试几次../),

上传公钥到ubuntu服务器上,

图片加载失败


使用私钥连接成功,

图片加载失败




后面又分析了nodeagent,发现我们不仅能未授权任意文件上传,还能未授权执行一些内置命令,

如使用version查看服务器版本,其中存在一个命令ctl -rst <参数>,就能重新加载war包更新web服务,

那么我们可以先利用未授权文件上传漏洞上传恶意war包,然后再未授权使用ctl -rst <参数>去重新加载war包,

就会达到命令执行的效果,

复现如下:

将以下脚本随便放入一个子项目中然后执行,这样我们就可以直接使用其中的函数,懒得自己去定义了,

图片加载失败




这里用恶意的x_mind_assemble_control.war覆盖了之前的x_mind_assemble_control.war,



恶意的war如下,直接在ThisApplication中加入我们想要的命令,然后重新编译打包成x_mind_assemble_control.war,

图片加载失败


图片加载失败




然后使用ctl -rst x_mind_assemble_control命令重新加载x_mind_assemble_control.war,

运行Main_load,命令执行成功,

图片加载失败




分析,

利用未授权nodeagent,然后使用syncFile进行文件上传之前已经分析过了,

现在我们分析利用未授权nodeagent,然后使用command命令重新加载war的过程,

nodeagent其中存在execute_command_pattern,

接收到的数据如果匹配到command,

图片加载失败




然后会走到Commands的静态函数中,匹配到ctl命令后,

图片加载失败


图片加载失败




执行action.execute(args),

图片加载失败




根据相应命令进入相应函数,

图片加载失败


图片加载失败




最后execute函数根据我们传入服务的名称暂停服务,

加载war资源后使用JarResource.newJarResource(base).copyTo(dir)释放我们恶意的war包到store目录,

然后再使用app.start()开启此服务,

开启此服务时会初始化服务(ThisApplication),最终触发了恶意代码,命令执行成功,

图片加载失败


图片加载失败




为了更好的实战化,我们可以写一个内存马,

。。。可以看我之前写的jetty内存马文章。。。



漏洞二(后台rce,利用GraalVM)

在系统配置-安全配置-密码配置处,设置通过脚本自定义初始密码,

然后写入以下js,点击确定,

图片加载失败




数据包,



然后点击组织管理-个人管理,新增用户,

图片加载失败




点击保存人员信息,最终命令执行,

图片加载失败




数据包,



分析,

PersonAction.java执行execute,

图片加载失败




execute函数会获取到我们设置的密码规则,

图片加载失败


图片加载失败




然后将js规则传给initPassword,

图片加载失败




执行evalAsString,

图片加载失败




最终执行到eval, 创建一个GraalVM上下文,它是一个脚本引擎,这里使用了allowHostClassLoading参数表示允许加载java类,

图片加载失败




不过实现了allowHostClassLookup::allowClass函数设置了类的黑名单,

图片加载失败


图片加载失败


图片加载失败


图片加载失败




黑名单类如下:



那么我们利用java.net.URLClassLoader去加载本地资源,然后利用反射最终getshell,

payload:



最终调用链如下,

图片加载失败




关于执行js的位置还有几个地方,应该是都可以执行成功的

以下是我找到的另外两处利用js命令执行的地方,

第一处:

点击服务管理,

图片加载失败




点击代码配置-新建代理,

图片加载失败




var u = Java.type('java.net.URLClassLoader');r = u.getSystemClassLoader().loadClass("java.lang.Runtime");g = r.getMethod('getRuntime').invoke(null).exec("calc.exe");

然后点击保存,这样就可以利用定时任务执行js,最终命令执行,

图片加载失败




等待几秒钟,命令执行成功,

图片加载失败




第二处:

数据中心管理--新建应用,

图片加载失败




然后编辑此应用,点击查询配置--新建,最新原生sql脚本,最终命令执行,

图片加载失败


图片加载失败




可能存在的漏洞点(sql注入未复现)

这里我搭建时直接使用的是h2数据库,实际环境中应该不是,到时候就根据使用的数据库去复现是否能getshell,

图片加载失败


在这里可以配置jdbc,不过需要重启服务,就有点鸡肋了,

图片加载失败




3 条评论
某人
表情
可输入 255
hyy30291920
2025-03-21 00:10 0 回复
哥 方便加个好友不 先知不能私信
hyy30291920
2025-03-20 06:21 0 回复
大哥 还有分析文章吗 爱看多发

tj
2025-03-26 08:17 0 回复
等一段时候会发,我都是先交漏洞平台,审核完了才发文章,某些漏洞平台审核超级慢,,,我也只有等着,我dd也是这个名,