做者: Badcode@知道创宇404实验室
日期: 2019/07/09
原文连接html
Adobe ColdFusion 是一个商用的快速开发平台。它能够做为一个开发平台使用,也能够提供Flash远程服务或者做为 Adobe Flex应用的后台服务器 。java
2019年06月11日,Adobe 发布安全公告[1],修复了Adobe ColdFusion多个严重漏洞。其中有一个由Moritz Bechler提交的命令注入漏洞(CVE-2019-7839)。windows
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 9bash
根据 Moritz Bechler 披露的部分细节,是因为ColdFusion 默认开启了 JNBridge listener 从而致使了漏洞。服务器
先来了解一下JNBridge。ide
JNBridge 是一种领先的JAVA与.NET互操做的的产品,凭借JNBridge技术,Java 和.NET代码无需交叉编译器就能够实现对象共享。全部Java代码运行在JVM上,而.NET代码则运行在CLR上。在该方案下,JVM和CLR能够运 行在不一样的机器上,也能够运行在一台机器的不一样进程上,甚至还能运行在相同的进程的不一样应用程序域上。工具
下载 JNBridgePro,安装完以后会有demo。试用licenseui
jnbp-eval-v10.0#1899-2367-9451-2280
这里咱们尝试使用.net去调用java,跑一下logDemo,了解下大体流程。spa
启动 Java 服务端
根据 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] 部分细节: