1. 程式人生 > >Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析

Adobe ColdFusion RCE(CVE-2019-7839) 漏洞分析

作者: Badcode@知道創宇404實驗室

日期: 2019/07/09

原文連結:https://paper.seebug.org/999/

英文版本:https://paper.seebug.org/1000/

 

漏洞簡介

​ 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,瞭解下大致流程。

啟動 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.Runtimejava.lang.Processjava.io.BufferedReaderjava.io.InputStreamReaderjava.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平臺),返回命令執行結果。

References

[1] 安全公告:

https://helpx.adobe.com/security/products/coldfusion/apsb19-27.html

[2] 部分細節:

https://seclists.org/bugtraq/2019/Jun/38

[3] 歷史版本:

https://jnbridge.com/downl